3

我开始阅读 YDKJS 是为了好玩——发现他写道:

我们可以做这样的事情:

var num = (1.2).toFixed(1)

所以 - 这意味着 toFixed 被作为一个整数值的成员方法调用。

那么为什么这不起作用?

"toFixed" in 1.222

但这有效:

"toFixed" in new Number(1.222)
4

1 回答 1

2

Es262 规范的第 268 页指出:

RelationalExpression : ShiftExpression 中的 RelationalExpression

[...]

  1. 令 rref 为计算 ShiftExpression 的结果。

  2. 让 rval 成为 ? 获取值(rref)。

  3. 如果 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它)。

于 2019-08-20T15:05:03.827 回答