ES6代理集属性陷阱未针对数组长度触发

kgr*_*een 5 javascript ecmascript-6 es6-proxy

使用JavaScript ES6 Proxies时,直接分配数组索引时不会触发array.length的set属性陷阱.

例如:

const proxy = new Proxy([], {
    set: function(obj, name, value) {
        console.log(`set: ${name}`);
        obj[name] = value;
        return true;
    }
});
proxy.push(0);
proxy[1] = 1;
Run Code Online (Sandbox Code Playgroud)

Chrome 51和Firefox 47输出:

set: 0  
set: length  
set: 1

虽然我期望:

set: 0  
set: length  
set: 1  
set: length 

这是按规格吗?我找不到任何关于此的信息.

a b*_*ver 2

length将值分配给索引时无需显式设置该属性。设置它的原因确实在规范push中定义了:

  1. 重复,当 items 不为空时

    A。从 items 中删除第一个元素,并令 E 为该元素的值。

    b. 令 setStatus 为 Set(O, ToString(len), E, true)。

    C。ReturnIfAbrupt(setStatus)。

    d. 令len 为len+1。

  2. 令 setStatus 为 Set(O, "length", len, true)。

基本上:如果发生错误,则设置正确的长度,以防数组已扩展。

  • @Redu“.length”确实在幕后更新[分配给索引时](http://www.ecma-international.org/ecma-262/6.0/#sec-array-exotic-objects-定义自己的属性-p-desc)。您还可以考虑每个实例都有一个神奇的 getter/setter“.length”,它始终知道项目(和孔)的数量。无论如何,此更新不能被代理捕获,因为它发生在数组实例(代理目标)本身上 - 与“push”或“pop”方法不同,它们在调用它们的(代理)对象上执行显式赋值在。 (2认同)