为一个数字的成员分配一个函数,为什么这不是一个失败?

Per*_*-lk 6 javascript numbers object

从我的Chrome解释器:

a = 3; // OK, of course.
a.f = function() { return 4; }; // OK. To a number? Ok
a; // Prints 3
a.f(); // f is not a function.
a.f; // Undefined
Run Code Online (Sandbox Code Playgroud)

当然,a不是一个对象,我不能将新成员分配给不是对象的东西.但是,为什么解释器吞下了a.f赋值,如果之后该方法或成员甚至不存在?

Mat*_*Way 2

如果您查看8.7.2ECMA 5.1,您会注意到底部的这条注释:

在上述方法之外无法访问步骤 1 中创建的对象。实现可能会选择避免实际创建该瞬态对象。使用此内部方法的此类实际属性分配可以产生可见效果的唯一情况是当它调用访问器函数或违反 Throw 谓词错误检查时。当 Throw 为 true 时,任何在瞬态对象上创建新属性的属性分配都会引发错误。

步骤 1 是Let O be ToObject(base).

如果您查看ToObject()中的方法9.9,您将在表中找到这两行:

  • 数字

创建一个新的 Number 对象,其 [[PrimitiveValue]] 内部属性设置为参数的值。有关 Number 对象的描述,请参见 15.7。

  • 目的

结果是输入参数(未转换)。


因此,看起来当您尝试在数字上设置函数时,它实际上正在发生(尽管作为 noop),由于赋值发生在内部瞬态对象上,因此在赋值后它变得不可访问。当您对常规对象执行此操作时,它会返回实际对象,因此分配是有意义的。