2013-10-09 42 views
0

[] [[]]結果是未定義 其中,因爲這[[]] []拋出語法錯誤:意外標記]。 任何解釋?JavaScript中[] [[]]和[[]] []之間的區別?

+0

BTW,爲什麼你需要定義這樣的事情? – Kaf

+1

你試過了嗎?什麼是?它是一個包含一個項目的數組(一個空數組)。然後[[]] []會得到它的第一個元素,但是你需要提供一個INDEX(這就是爲什麼語法錯誤,它解析「]」而不是數字)。 –

+0

'([])['array object somekey,ie []']'給出undefined ..和'([[]])[]'表示沒有鍵'拋出'SyntaxError:syntax error' – rab

回答

4

object[key]語法用於獲得object的屬性key,其中必須有key裏面[]否則會出現語法錯誤。

[][[]],對象是一個空數組[],關鍵是另一個空數組[]

[[]][],該對象是一個內部有一個空數組的數組,而[]內部沒有鍵。

2

[]定義了一個空數組,所以[][[]]可以改寫爲:

var a = []; 
var b = []; 
var c = a[b]; 

現在,通過指數索引本身是一個數組是未定義訪問數組 - 標準不說會發生什麼,但它在語法上是有效的。

但是[[]][]被打破 - 最近這可寫草書是:

var a = []; 
var b = []; 
[b]a; 

...這完全是無稽之談代碼。

2

我不明白爲什麼有人會曾經想用這樣的事情,但這裏是一個解釋:

案例1:

[]是一個空數組。通過向其添加[n][][n]),您引用第n個元素。 n你的情況是[]。解釋器試圖將其轉換爲可用值並以空字符串(「」)結尾。所以你實際上試圖參考[][""]這是undefined

情況2:

[[]]爲空數組內的空數組。通過將[n]添加到它([[]][n]),您可以引用外部數組的第n個元素。你需要提供索引n,否則會拋出一個錯誤,這發生在你的情況。

1

我無法想象,你爲什麼會需要使用這一點,但這裏是我的解釋:

[[]]爲新的Array(新陣列()),這是一個元素的數組,一個空陣列。

[]是一個空數組,所以你可以做[] [2]或[] [0],它返回undefined。第二個[]是索引。

所以在[] [[]]中您正在尋找一個索引,索引[]。

[][0] == [][[]] 

但在[[]] []的索引是空的,就相當於[1,2,3] [] - >的SyntaxError:意外的令牌]

0

好的。只需要使用一個鍵訪問數組。否則會拋出語法錯誤。

[][[]] - 已定義數組,您正在訪問未定義數組中的密鑰[]

[[]][] - 已定義數組並且未傳遞任何鍵來訪問該數組 - 語法錯誤。

0

我想類型轉換髮生:儘管在該圖案[[]][]兩個陣列被聲明並排

[][+[]] // +[] gives 0 

[][ 
    // an index is expected here 
    [] // so javascript probably tries to get a number from this empty array 
] 

這可能是相當於。

+1

它實際上試圖將其轉換爲字符串,最後以[] [「」]結尾。你可以試試這個。 var arr = []; arr [「」] =「test」;的console.log(ARR [[]]); – Butt4cak3

+0

@ Butt4cak3好吧,你似乎是對的:) – leaf

0

JavaScript對象具有與其關聯的屬性。您可以用簡單的點符號或括號表示法訪問對象的屬性,如果引用non existing key,則它給出undefined值。

var obj = {}; 
obj[ 'key' ] 

,一個重要的事情是,在JavaScript中數組是一個對象

console.log([] instanceof Object) // gives true so it act like object 

和有趣的事情是,我們通過象下面這樣。

var keyCanbeFunction = function(){}; 
var keyCanbeObject = {}; 
var keyCanbeArray = [] ; 

console.log(obj[ keyCanbeArray ]) // gives undefined, that key not exists 

和1次的情況下

var obj = []; 
obj[ keyCanbeArray ] // gives undefined 

和第二種情況

var obj = [[ ]] 
obj[]; // where is key ???