「だから何」という話ではあるんだけども、各言語で挙動が違っておもしろいなぁ、と思ったので。
JavaScript
var arr = [];
arr[100] = 'foo';
console.log(arr.length); //=> 101
console.log(arr[0]); //=> undefined
console.log(arr[101]); //=> undefined
未定義のインデックスは undefined
を返す。
"use strict";
を宣言しても実行結果は変わらない。
Perl
my @arr;
$arr[100] = 'foo';
print $#arr; #=> 100
print defined $arr[0] ? 1 : 0; #=> 0
print defined $arr[101] ? 1 : 0; #=> 0
JavaScript と同じく、未定義のインデックスは undef
になるっぽい。
use strict;
を宣言しても実行結果は変わらない。
Ruby
arr = []
arr[100] = 'foo'
p arr.size #=> 101
p arr[0] #=> nil
p arr[101] #=> nil
JavaScript / Perl とだいたい同じだが nil
になる。
undefined
相当のものが無いからだと思われる。
PHP
$arr = array();
$arr[100] = 'foo';
echo count($arr); //=> 1
echo is_null($arr[0]); //=> 1
echo is_null($arr[101]); //=> 1
未定義のインデックスは null
になる。
配列の長さは 1 になるのが他の言語とは違う。
PHP はリストもハッシュ(ディクショナリ)も array
なのでこうなるのだと思われる。
[追記]
未定義のインデックスへのアクセスは E_NOTICE
レベルのエラーが発生するとのこと。(詳細はコメント欄を参照)
error_reporting(E_ALL); // E_NOTICE を出力するように設定
$arr = array();
$arr[100] = 'foo';
echo $arr[0]; //=> Notice: Undefined offset: 0
Python
arr = []
arr[100] = 'foo' #=> IndexError: list assignment index out of range
存在しないインデックスに対して参照/代入しようとすると IndexError
になる。
これが一番素直な挙動な気がしなくもない。