我开始阅读 YDKJS 是为了好玩——发现他写道:
我们可以做这样的事情:
var num = (1.2).toFixed(1)
所以 - 这意味着 toFixed 被作为一个整数值的成员方法调用。
那么为什么这不起作用?
"toFixed" in 1.222
但这有效:
"toFixed" in new Number(1.222)
我开始阅读 YDKJS 是为了好玩——发现他写道:
我们可以做这样的事情:
var num = (1.2).toFixed(1)
所以 - 这意味着 toFixed 被作为一个整数值的成员方法调用。
那么为什么这不起作用?
"toFixed" in 1.222
但这有效:
"toFixed" in new Number(1.222)
Es262 规范的第 268 页指出:
RelationalExpression : ShiftExpression 中的 RelationalExpression
[...]
令 rref 为计算 ShiftExpression 的结果。
让 rval 成为 ? 获取值(rref)。
如果 Type(rval) 不是 Object,则抛出 TypeError 异常。
换句话说:你不能in
在数字上使用。这就是它的定义方式。
new Number
然而不会创建一个数字,而是一个数字对象(一个继承自 的对象Number.prototype
)。这就是为什么你可以使用in
它,因为它是一个实际的对象。
您仍然可以这样做12..toFixed()
,这是因为规范中的一个非常有趣的构造:GetValue
当您访问属性时将调用的抽象操作¹,toObject
如果目标(12
在这种情况下)不是对象,那么它会调用以下:
返回一个新的 Number 对象,其 [[NumberData]] 内部插槽设置为参数。
12..toFixed()
所以换句话说:与.new Number(12).toFixed()
¹ 有趣的是,根据规范访问属性本身实际上并没有这样做,如果这样做a.b
只会查找值a
并创建引用 ( Reference(a, "b")
)。实际的属性查找发生在GetValue
被调用时(但是我不知道任何情况下引用丢失而不调用GetValue
它)。