ES6 代理设置 属性 陷阱未触发数组长度

ES6 Proxy set property trap not firing for array length

使用 JavaScript ES6 代理时,array.length 的设置 属性 陷阱在直接分配数组索引时不会触发。

例如:

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 输出:

set: 0  
set: length  
set: 1

虽然我希望:

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

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

在给索引赋值时,不需要显式设置length 属性。之所以设置为push,确实是在specification中定义的:

  1. Repeat, while items is not empty

    a. Remove the first element from items and let E be the value of the element.

    b. Let setStatus be Set(O, ToString(len), E, true).

    c. ReturnIfAbrupt(setStatus).

    d. Let len be len+1.

  2. Let setStatus be Set(O, "length", len, true).

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