"use strict;" "foo".bar = 42;
会创建一个String
对象,在其上分配一个属性,然后将该对象丢弃,导致没有可观察的影响,包括任何异常。(可以在类似Opera 12的ES5兼容JS实现中尝试以确认无效果。)在现代JS实现中,它会抛出一个
TypeError
- 请尝试:
"use strict"; "foo".bar = 42;
我非常确定新的行为是由ES6规范所要求的,但尽管我已经多次阅读相关部分,我仍然看不到指定抛出TypeError
的地方。实际上,关键部分似乎没有改变:
1. 如果V是null或undefined,返回undefined。 2. 如果Type(V)不是引用类型,抛出ReferenceError异常。 3. 让base为GetBase(V)的结果。 4. 如果IsUnresolvableReference(V)为true,则 - a. 如果IsStrictReference(V)为true,抛出ReferenceError异常。 - b. 创建全局对象的新绑定并将其添加到全局环境记录中。这个绑定的名称是GetReferencedName(V),它的初始值是undefined,并且它被设置为可写入和可配置。 - c. 返回。 5. 如果IsPropertyReference(V)为true,则 - a. 让base为ToObject(GetBase(V))的结果。 - b. 让succeeded为? base.[[Set]](GetReferencedName(V), W, GetThisValue(V))的结果。 - c. 如果succeeded是false并且IsStrictReference(V)为true,则抛出TypeError异常。 - d. 返回。
规范(ES6或更高版本)在哪里规定抛出TypeError?
ToObject
显式地返回一个不可扩展的String
,因此[[Set]]
将返回 false 并且第6步将会抛出异常,但我实际上并没有看到字符串对象被定义为不可扩展。 - loganfsmythToObject
只是复制[[Extensible]]
属性”-你是在指这里的实现吗?他们甚至没有执行ToObject
,所以不会太令人困惑。 - Ry-Object.preventExtensions
使其不可扩展,并在严格模式下尝试设置其属性会为我产生不同的错误消息,其中提到“对象不可扩展”。对于问题中的情况,似乎根本没有经过对象。 - user2357112