38801


以下のコードを実行するとa[2]の要素が削除されるので最後はlengthが3ではなく2になるはずです。(実際オライリー本の同様のコードではそのようになる旨のコメントが付いている)

[code]

    var a = [1,2,3];
    delete a[2];
    console.log(a.length);
    
[/code]

しかし、Chrome 61.0.3163.100(64ビット)で確かめると最後の結果は2ではなく、3となっています。

実際、以下のコードで配列がどうなっているか確かめると、

[code]

    console.log(a)
    
[/code]

以下のような配列になっていてlengthが3である事が確認できます。

[code]

    [1, 2, empty × 1]
    
[/code]

オライリー本(javascript 第6版 P89)では2になると書かれている以上、仕様が変わったという事でしょうか？それともただ単に誤字なのでしょうか？

もし仕様が変わったのであれば、何故このような仕様になったのでしょうか？


CC BY-SA 3.0
2017-10-17T09:38:13.867
38800
2017-10-17T10:13:56.893
25791
question
javascript
javascriptのdelete演算子の挙動


[配列の要素の削除](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/delete#%E9%85%8D%E5%88%97%E3%81%AE%E8%A6%81%E7%B4%A0%E3%81%AE%E5%89%8A%E9%99%A4)でも次のように減らないことが説明されています。

> 配列の要素を削除する際、配列の長さは影響を受けません。

また原書の方ですが[errata](http://www.oreilly.com/catalog/errata.csp?isbn=9780596805531)が出てますね。

> **Note from the Author or Editor:**
>
> Change this line:
[code]

>     a.length  // => 2: array only has two elements now
>  
[/code]

>
> To these two lines:
[code]

>     2 in a        // => false: array element 2 doesn't exist anymore
>     a.length      // => 3: note that array length doesn't change, though
>  
[/code]

>
> Line the comments up with the ones above, of course.

とのことで書籍側の誤りかと。


CC BY-SA 3.0
2017-10-17T10:10:09.530
38801
2017-10-17T10:10:09.530
4236
38800
answer


delete演算子の意味からすると現行の動きが妥当だと思いますし、また、過去も同じ動きをしていたかと思います。  
[MDNでのdelete演算子の説明](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/delete)

オライリー本は仕様書ではありませんので、その記述と実際の動作が違っていたとしても仕様変更というわけではないかと。  
仮にそのような記述になっていたとしたら、記述ミスではないでしょうか。


CC BY-SA 3.0
2017-10-17T10:13:56.893
38802
2017-10-17T10:13:56.893
23348
38800
answer