爲什麼第一行會在第二行發出時起作用run-time exception
?爲什麼[[]] [0] ++可以運行,但是[] ++會拋出運行時異常?
第一行:
[[]][0]++; //this line works fine
第二行:
[]++; //this lines throws exception
爲什麼第一行會在第二行發出時起作用run-time exception
?爲什麼[[]] [0] ++可以運行,但是[] ++會拋出運行時異常?
第一行:
[[]][0]++; //this line works fine
第二行:
[]++; //this lines throws exception
[[]][0]++
相當於
var tmp = [[]];
tmp[0] = tmp[0]+1;
tmp[0]
爲空數組,其被投射到編號0
,w增加到1
。
這隻適用於因爲<array>[<index>]++
看起來有效。它需要一些類型的雜耍,但它到達那裏。
但[]++
完全無效。沒有辦法讓它變得有意義。
[] = []+1;
這裏的左手確實無效。您不能分配給一個空數組。
這是一個罕見的情況,其中Javascript做了一些真正有意義的事情。考慮
x[3]++; // Valid
3++; // Not valid
如果你這是有意義的,那麼什麼是令人驚奇
[[]][0]++; // valid
[]++; // not valid
<array>[index]
是「一個地方」,你可以指定或增量。就這樣。事實上,您可以增加a[<expr>]
並不意味着您可以增加<expr>
。
荒謬的是,你可以使用[]
作爲索引,具有數組轉換爲空字符串""
然後到數0
的意思,但這是一段JavaScript荒謬的隱式轉換的衆所周知的問題。這些隱式轉換規則是Javascript的一大疣,例如暗示1 == [1]
或[]==false
和(![])==false
。
Javascript在很多地方都是純粹的廢話......但並不是真的在這裏。
++
操作符(或實際上任何後綴操作符)要求操作數爲「引用」 - 即可分配的值。 []
是一個文字,所以你不能分配給它。 [[]][0]
是對臨時數組元素的有效引用。
0++; // not valid, `0` is a literal.
var a = [];
a++; // ok, `a` is assignable
是的,我想很多人閱讀Dave的博客: https://davidwalsh.name/thinking-javascript –
因爲JavaScript。 –
爲什麼你會期望以其他方式?你能解釋爲什麼第一行應該拋出異常,或者第二行不應該做什麼? – Bergi