JavaScript おれおれ Advent Calendar 2011 – 11日目
オブジェクトによりちょっとずつ意味が違います。
- 配列
- 文字列
- 関数
- 引数
- 一般
配列の .length
これはご存知ですよね? 一般に .length
といえばこれです。
配列の要素数を得られます。また設定する事もできます。
文字列の .length
文字列の長さを得られます。バイト数ではなく(Unicodeでの)文字数である点に注意してください。
例えば「あ」等日本語はしばしば「2バイト文字」という表現が用いられてきましたが、Unicodeではあくまで「1文字」と数えます。(ちなみに3バイトだったり4バイトだったりするみたいです。)
また、JavaScriptの文字列は不変であるという特徴を持っているので、 .length
も不変です。代入は不可能ですが、エラーは発生しません。
var str = "あういえー!"; str.length = 2; // エラーにはならない console.log(str); // "あういえー!" console.log(str.length); // => 6
エスケープされた文字は1文字になります。(まあ当然ですけど。)
console.log("111\n222".length); // => 7 console.log("\u65e5\u672c\u8a9e".length); // => 3
関数の .length
ちょっと妙な感じですが、JavaScriptでは関数もまた一種のオブジェクトですので、プロパティを持ち得ます。
で、関数オブジェクトの .length
プロパティは、その関数に定義されている引数の数を返します。文字列と同じく、代入は不可能ですが、エラーは発生しません。
function add(a, b) { return a + b; } console.log(add.length); // => 2
引数の .length
次項で示す「一般の .length
」と扱いは同じです。というわけでそちらをご覧ください。オブジェクトの方がちょっと特別なので、項を分けました。
showArguments("a", "b", "c"); function showArguments() { console.log(arguments.length); // => 3 arguments.length = 2; console.log(arguments.length); // => 2 console.log(arguments[0]); // "a" console.log(arguments[1]); // "b" console.log(arguments[2]); // "c" }
一般の .length
何の変哲もない、ただただ”length”という名前を持ったプロパティです。代入も削除(delete
)も思いのままです。
例えばjQueryオブジェクトの .length
が該当します。
配列じゃないオブジェクトを配列風に扱える、という利点があります。
var obj = { "0": "a", "1": "b", "2": "c", length: 3 }; for (var i = 0; i < obj.length; i++) { console.log(obj[i]); } // "a" // "b" // "c"
あくまで配列風なので、 .push()
や .join()
は持っていません。使いたい場合は .apply()
が便利です。
var obj = { "0": "a", "1": "b", "2": "c", length: 3 }; console.log(Array.prototype.join.apply(obj, ["/"])); // => "a/b/c"