cpc*_*len 25 javascript primitive typeerror ecmascript-5 ecmascript-6
根据ES5.1规范,程序"use strict;" "foo".bar = 42;会导致String创建一个对象,分配给它上面的属性,然后抛弃该对象,导致没有可观察到的影响 - 包括任何异常.(可以通过在与Opera 12中的ES5兼容的JS实现中尝试来确认效果的缺失.)
在现代JS实现中,它抛出一个TypeError代替尝试它:
"use strict"; "foo".bar = 42;Run Code Online (Sandbox Code Playgroud)
我很确定新的行为是由ES6规范强制执行的,但是尽管多次阅读相关部分,但我看不出它被指定的位置TypeError.事实上,关键部分似乎没有变化:
6.2.3.2 PutValue(V,W)#
- ReturnIfAbrupt(V).
- ReturnIfAbrupt(W).
- 如果Type(V)不是Reference,则抛出ReferenceError异常.
- 让base为GetBase(V).
- 如果IsUnresolvableReference(V)为真,那么
- ...
- 否则,如果IsPropertyReference(V)为真,那么
- 一个.如果HasPrimitiveBase(V)为真,那么
- 一世.断言:在这种情况下,base永远不会为null或未定义.
- II.将base设置为ToObject(base).
- 湾 我们成功了吗?base.[[Set]](GetReferencedName(V),W,GetThisValue(V)).
- C.ReturnIfAbrupt(成功).
- d.如果成功为false且IsStrictReference(V)为true,则抛出TypeError异常.
- 即 返回.
- ...
规范(ES6或更高版本)在哪里投掷TypeError?
geo*_*org 16
我想它就在这里:
http://www.ecma-international.org/ecma-262/7.0/#sec-ordinaryset
9.1.9.1.普通套装(O,P,V,接收器)
[...]
4.B. 如果Type(Receiver)不是Object,则返回false.
(以前称为[[Set]],在ES6§9.1.9中.)
虽然将对象PutValue提升base为一个对象,但它对接收器的作用并不相同 - GetThisValue(V)仍然在原始对象上调用V(具有原始基础).因此,GetThisValue返回一个原语,OrdinarySet.4b无法分配一个新创建的ownDesc并返回false,这反过来导致PutValue.6d抛出一个TypeError,前提是引用是严格的.
V8的相应部分似乎遵循相同的逻辑:
Maybe<bool> Object::AddDataProperty(....
if (!it->GetReceiver()->IsJSReceiver()) {
return CannotCreateProperty(...
Run Code Online (Sandbox Code Playgroud)
https://github.com/v8/v8/blob/3b39fc4dcdb6593013c497fc9e28a1d73dbcba03/src/objects.cc#L5140
@ georg的答案似乎是正确的ES6 +解释,但看起来行为也不是新的.来自ES5.1 PutValue:
否则,如果IsPropertyReference(V),那么
一个.如果HasPrimitiveBase(V)为false,则将put作为base的[[Put]]内部方法,否则让put为下面定义的特殊[[Put]]内部方法.
湾 调用使用碱作为其该值把内部方法,并传递GetReferencedName(V)的属性名,W的值, 并IsStrictReference(V)为掷标志.
在引用的[[Put]]中:
否则,这是在瞬态对象O上创建自己的属性的请求
一个.如果Throw为true,则抛出TypeError异常.
感觉我可能误读了一些东西......但是还有什么可以指出"这是在瞬态对象O上创建自己的属性的请求"指的是什么?
| 归档时间: |
|
| 查看次数: |
1296 次 |
| 最近记录: |