Drkcore

18 06 2011 javascript Tweet

Javascriptの配列はトリッキーなオブジェクト

JGPを読んでいたら、配列リテラルはオブジェクトリテラルを使って書けると書いてあった。

ProductName JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス
Douglas Crockford
オライリージャパン / 1890円 ( 2008-12-22 )


var nums = ['one', 'two', 'three'];

これは

var obj_nums = {'0':'zero', '1':'one', '2':'two'};

ただし配列リテラルの方はArray.prototypeを継承するが、オブジェクトリテラルの場合にはObject.prototypeを継承する。

そこで継承関係をいじれば配列として使えるのかなぁと試してみた(Firebug)。

まずそのままだと

var obj_nums = {'0':'zero', '1':'one', '2':'two'};
console.log(obj_nums.toString()); // [object Object]

var nums = ['zero','one','two'];
console.log(nums.toString()); // zero,one,two

となる。続いて継承をいじってみる

var obj_nums = {'0':'zero', '1':'one', '2':'two'};
obj_nums.__proto__ = Array.prototype;
console.log(obj_nums.toString()); // (an empty string)

empty stringってなんやねんと思ったがlengthプロパティを付けてみる。

var obj_nums = {'0':'zero', '1':'one', '2':'two'};
obj_nums.__proto__ = Array.prototype;
obj_nums.length = 3;
console.log(obj_nums.toString()); // zero,one,two

Arrayリテラルと同じ挙動を示すようになった。内部でなにやってんだろうか?

ただし、オブジェクトを出力するとobj_numsのほうがプロパティが見えるんだよなぁ。これがちょっと気になる。

var obj_nums = {'0':'zero', '1':'one', '2':'two'};
obj_nums.__proto__ = Array.prototype;
obj_nums.length = 3;
console.log(obj_nums);

var nums = ['zero','one','two'];
console.log(nums);

array

というわけで、来週の読書会は配列のあたりをやりますので興味があれば参加すると楽しいと思います。ちなみに杉山フルーツの生ゼリーをおやつに迎える予定にしておりますよ。

もちろん、お昼につけナポを食べるのもありだと思います。

  • 第4回JavaScript読書会

About

  • もう5年目(wishlistありマス♡)
  • 最近はPythonとDeepLearning
  • 日本酒自粛中
  • ドラムンベースからミニマルまで
  • ポケモンGOゆるめ

Tag

Python Deep Learning javascript chemoinformatics Emacs sake and more...

Ad

© kzfm 2003-2021