2017-08-26 115 views
24

爲什麼第一行會在第二行發出時起作用run-time exception爲什麼[[]] [0] ++可以運行,但是[] ++會拋出運行時異常?

第一行:

[[]][0]++; //this line works fine 

第二行:

[]++; //this lines throws exception 
+1

是的,我想很多人閱讀Dave的博客: https://davidwalsh.name/thinking-javascript –

+7

因爲JavaScript。 –

+0

爲什麼你會期望以其他方式?你能解釋爲什麼第一行應該拋出異常,或者第二行不應該做什麼? – Bergi

回答

17
[[]][0]++ 

相當於

var tmp = [[]]; 
tmp[0] = tmp[0]+1; 

tmp[0]爲空數組,其被投射到編號0,w增加到1

這隻適用於因爲<array>[<index>]++看起來有效。它需要一些類型的雜耍,但它到達那裏。

[]++完全無效。沒有辦法讓它變得有意義。

[] = []+1; 

這裏的左手確實無效。您不能分配給一個空數組。

+1

這也適用於'[''] [0] ++'和'[null] [0] ++'和'[false] [0] ++',因爲它們全部投射到'0'。 – Soviut

+7

這個答案是不正確的。它與「看」有效無關。只是'++'操作符需要一個引用,而'[]'(文字)不是。 – Nikolai

4

這是一個罕見的情況,其中Javascript做了一些真正有意義的事情。考慮

x[3]++; // Valid 
3++; // Not valid 

如果你這是有意義的,那麼什麼是令人驚奇

[[]][0]++; // valid 
[]++;  // not valid 

<array>[index]是「一個地方」,你可以指定或增量。就這樣。事實上,您可以增加a[<expr>]並不意味着您可以增加<expr>

荒謬的是,你可以使用[]作爲索引,具有數組轉換爲空字符串""然後到數0的意思,但這是一段JavaScript荒謬的隱式轉換的衆所周知的問題。這些隱式轉換規則是Javascript的一大疣,例如暗示1 == [1][]==false(![])==false

Javascript在很多地方都是純粹的廢話......但並不是真的在這裏。

10

++操作符(或實際上任何後綴操作符)要求操作數爲「引用」 - 即可分配的值。 []是一個文字,所以你不能分配給它。 [[]][0]是對臨時數組元素的有效引用。

0++; // not valid, `0` is a literal. 
var a = []; 
a++; // ok, `a` is assignable 
相關問題