最終更新: 2011-09-17T05:22+0900
いくつかの点(文字列の行継続とか)で実装の追認をしてる 5th ed.ならいざしらず 3rd ed.では配列の末尾のカンマは無視できないだろう(IE8が正しい?)と思って昨日日記に書いたのだけど、よくよく読むとやっぱり IEが間違ってるっぽかったので消したのだった。
11.1.4 Array Initialiser
Syntax ArrayLiteral: [ Elision_opt ] [ ElementList ] [ ElementList , Elision_opt ] ElementList: Elision_opt AssignmentExpression ElementList , Elision_opt AssignmentExpression Elision: , Elision ,
The production ArrayLiteral : [ ElementList , Elision_opt ] is evaluated as follows: 1. Evaluate ElementList. 2. Evaluate Elision; if not present, use the numeric value zero. 3. Call the [[Get]] method of Result(1) with argument "length". 4. Call the [[Put]] method of Result(1) with arguments "length" and (Result(2)+Result(3)). 5. Return Result(1).
The production Elision : , is evaluated as follows: 1. Return the numeric value 1. The production Elision : Elision , is evaluated as follows: 1. Evaluate Elision. 2. Return (Result(1)+1).
1. Elision_opt(=カンマの 0以上の並び)は、カンマひとつにつき配列の長さをひとつ伸ばす。
2. ElementList: Elision_opt AssignmentExpressionや、ElementList: ElementList , Elision_opt AssignmentExpressionのように、Elision_optの右に AssignmentExpressionが隣接してるときはその数え方で自然。
3. ArrayLiteral: [ Elision_opt ] や、ArrayLiteral: [ ElementList , Elision_opt ] の場合は、Elision_optのカンマはその個数プラス1の要素を作り出すように見えるので、末尾のカンマがひとつ無視されたように感じる。
こんな結果になるなんて、余計なお世話もいいところだと思うんだけどな……
>>> [1,2,3,,,].length 5 >>> [1,2,3,,].length 4 >>> [1,2,3,].length 3 >>> [1,2,3].length 3
サイズ1の undefined配列を作れたりはするけど……(べつに嬉しくない)
>>> [].length 0 >>> [,].length 1
ちなみに JSONでは、思想から予想される通りに、末尾の余分なカンマは不許可。要素の省略(undefinedになる)もできない。ちなみに配列と違ってオブジェクトの初期化では、末尾の余分なカンマは不許可(3rd ed.しか確かめてないが)。
Syntax ObjectLiteral : { } { PropertyNameAndValueList } PropertyNameAndValueList : PropertyName : AssignmentExpression PropertyNameAndValueList , PropertyName : AssignmentExpression
例えばこれが JavaScriptのオブジェクト {prop:value,...}や Rubyの連想配列 {key=>value,...}や Cの enum {LABEL=1,...}の話であれば、末尾のカンマをあえて無視するのもいいだろう。要素の追加や並べ替えに便利なんだから。でも、JavaScriptの配列はダメだ。そこでは初期化の際に要素の省略ができる。空白に意味があるのだ。カンマの前後の空白の要素に関して、末尾だけ特別扱い(してるように見える)なんてのは不細工きわまりない。
最終更新: 2011-08-31T22:36+0900
なんか日本人って違うぞ?という疑問に答える本(著者はホンダの人)と大好きなコピペ。ただ、裏をかいたつもりでも法律の恣意的な運用で逮捕されたりはするのかな?ひろゆきとかホリエモンはどれでしょう。
ずるい!? なぜ欧米人は平気でルールを変えるのか (ディスカヴァー携書)
ディスカヴァー・トゥエンティワン
¥ 1,050
世の中には5種類の人間が居る。 ルールを知らない奴。 ルールを守る奴。 ルールを破る奴。 ルールの裏をかく奴。 ルールを作る奴。 書いた順番に弱い。