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"