用in运算符搜索toFixed-in运算符如何在基元上工作?

时间:2019-08-20 14:54:04

标签: javascript tofixed

我开始阅读YDKJS的乐趣-发现他写的是:

我们可以做类似的事情:

var num = (1.2).toFixed(1)

so-这意味着toFixed被作为成员方法从整数值调用。

那为什么不起作用?

"toFixed" in 1.222

但这可行:

"toFixed" in new Number(1.222)

1 个答案:

答案 0 :(得分:2)

Es262规格的第268页:

  

RelationalExpression:ShiftExpression中的RelationalExpression

     

[...]

     
      
  1. 让rref成为评估ShiftExpression的结果。

  2.   
  3. 让rval为? GetValue(rref)。

  4.   
  5. 如果Type(rval)不是Object,则抛出TypeError异常。

  6.   

因此,换句话说:您不能在数字上使用in。就是这样定义它。

new Number不会创建数字,而是创建 number对象(从Number.prototype继承的对象)。这就是为什么您可以在其上使用in并使其成为实际对象的原因。


您仍然可以执行12..toFixed(),这是因为规范中有一个非常有趣的结构:抽象的GetValue操作(将在您访问属性¹时调用)会调用toObject如果目标(在这种情况下为12)不是对象,则将执行以下操作:

  

返回一个新的Number对象,该对象的[[NumberData]]内部插槽设置为参数。

因此,换句话说:12..toFixed()new Number(12).toFixed()完全相同。

¹有趣的是,根据规范,实际上访问属性本身并不会执行此操作,如果您执行a.b只会查找a的值并创建引用({{ 1}})。实际的属性查找是在调用Reference(a, "b")时发生的(但是我不知道在没有调用GetValue的情况下引用会丢失)。