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. アイテムが空でない間、繰り返します

    を。項目から最初の要素を削除し、E を要素の値とします。

    b. 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 に答える