latest log

酩酊状態で書いたエンジニアポエムです。酩酊状態で読んでください。

JavaScript delete 演算子が数字をキーにした場合に期待と異なる結果を返す

ツイッターだと無理なのでこちらに、

var a = new String('a'), b = (function (s) { s[0] = '_'; return s }(a)); console.log(a.toString()); console.log(a === b); // a, true 何故 #js
via https://twitter.com/nazomikan/status/258953859731443712

の流れで、ちょっと気になった事が。

以下のコードは、base オブジェクトに { 1:1, 2: 2, a: "a" } という、再設定不能,列挙可能,ReadOnlyなkey/valueを設定しています。

base = {};

Object.defineProperty(base, 1, {
    configurable: false,
    enumerable: true,
    writable: false,
    value: 1
});
Object.defineProperty(base, "2", {
    configurable: false,
    enumerable: true,
    writable: false,
    value: 2
});
Object.defineProperty(base, "a", {
    configurable: false,
    enumerable: true,
    writable: false,
    value: "a"
});

keyが数字であれ文字であれ、delete base[key] を実行すると、
全て同じ値(true または false)を返すだろうと期待できます。

では、実際に Chrome 22 stable, Chrome 24.0.1301.0 canary で以下のコードを実行してみましょう。

delete base[1];   // -> true  (Firefox,IE9ではfalse)
delete base["1"]; // -> true  (Firefox,IE9ではfalse)
delete base[2];   // -> true  (Firefox,IE9ではfalse)
delete base["2"]; // -> true  (Firefox,IE9ではfalse)
delete base.a;    // -> false (Firefox,IE9でもfalse)

base[1];   // -> 1
base["1"]; // -> 1
base[2];   // -> 2
base["2"]; // -> 2
base.a;    // -> a

(ε・◇・)з o O ( ??? えーと… 宿題にしてあとで調べます