Kanasan.JS の JavaScript 第 5 版読書会 #3 (当日のチャットログ、参加者のブログ記事一覧) に行ってきました。同じ会場で先立って vim 勉強会があったのですが、私は先日 Meadow に乗り換えたばかりなのでそちらのほうはパスしました。
JavaScript ではすべてのプロパティ名が文字列として扱われます。配列 a
に対して a[-1.23] = true
としても、a["-1.23"] = true
と同じに扱われ、"-1.23" という名前のプロパティができるだけでエラーにはなりません。ただし、配列に関しては非負整数とみなされる名前のプロパティが特別扱い (length プロパティにも影響を及ぼしうる) されます。
配列に対して、join メソッドを引数なしで呼び出すのと toString メソッドを呼び出すのとでは同じ結果が返ってきます。ただし、join メソッドは配列のようなオブジェクト (配列ではないが length プロパティを持つオブジェクト) に対しても適用できるのに対し、配列の toString メソッドは配列にしか適用できないという違いがあります。
var arrayLike = { 0: "a", 1: "b", 2: "c", length: 3 };
Array.prototype.join.call(arrayLike);
// => a,b,c
Array.prototype.toString.call(arrayLike);
// => TypeError: Array.prototype.toString called on incompatible Object
そのため、実装によっては toString メソッドのほうが高速化できるかもしれません。ちなみに Firefox などで使われている SpiderMonkey の場合は、join メソッドも toString メソッドも内部的に同じ関数 (array_join_sub 関数) を利用しています。
push メソッド、unshift メソッドが要素追加後の配列の要素数を返すのはどうしてかという話題。これらのメソッドは Perl 由来なので返り値も Perl に従ったのでしょうが、なぜ Perl がそうなっているのは不明です。個人的には配列自身を返してくれたほうが何かと使いやすいと思うのですが。
slice メソッドと splice メソッドの字面が似ていて間違えやすいという声がありました。Perl や Ruby の場合は slice に相当する構文が別途存在する (@array[1..3]
) ので splice があっても混乱しないんだとか。ECMAScript 4 でもスライス構文 (array[1:3]
) が定義される予定です。
ちなみに ECMAScript では splice の第 2 引数は必須ですが、これを省略すると IE と Firefox とで動作が違ってくるそうです。
配列の各要素が等しいかを調べようと思って array1 == array2
と等値演算子を使ってもうまくいきません。配列はオブジェクトであり、等値演算子をオブジェクト同士の比較に用いると両者が同一のオブジェクトかどうかを返すからです。
解決策として、配列の要素がすべて文字列だとわかっていれば、join メソッドの結果を比べるといった方法があります。区切り文字を NUL 文字 ("\x00"
) にすれば文字がかぶることも減るでしょう。または、Prototype.js を使っていれば、 toJSON メソッドを使って JSON 形式に変換した文字列を比べるという方法もあるそうです。
セコメントをする