JavaScript おれおれ Advent Calendar 2011 – 11日目

オブジェクトによりちょっとずつ意味が違います。

  1. 配列
  2. 文字列
  3. 関数
  4. 引数
  5. 一般

配列の .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"