7

使用 JavaScript ES6 代理时,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;

Chrome 51 和 Firefox 47 输出:

设置:0  
设置:长度  
套装:1

虽然我期望:

设置:0  
设置:长度  
套装:1  
设置:长度

这是每个规格吗?我找不到这方面的任何信息。

4

1 回答 1

2

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

  1. 重复,而项目不为空

    一种。从 items 中删除第一个元素,让 E 成为元素的值。

    湾。让 setStatus 为 Set(O, ToString(len), E, true)。

    C。ReturnIfAbrupt(setStatus)。

    d。设 len 为 len+1。

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

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

于 2016-06-23T11:14:39.673 回答