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 ( ??? えーと… 宿題にしてあとで調べます