2016-03-02 55 views
0

我是JS的初學者。我正在寫一個方法來接收輸入數組,並且需要檢查它是否爲空。我的第一種方法是在方法內的if語句中使用array === []作爲條件,但它不起作用。它在我編寫條件array.length === 0時起作用。我以爲他們有相同的意思。有人能解釋爲什麼前者不起作用嗎? 在此先感謝。Javascript中條件「array === []」和「array.length === 0」

+0

檢查,看是否'.length'屬性是零。 – Pointy

+0

嗯,不,它確實*不*意味着「同樣的事情。 :) – deceze

回答

8

比較

if (array === []) 

比較同一性兩個對象的。一個對象是從來沒有等於(相同)另一個不同的對象,至少在JavaScript中定義了「平等」的意義上。 JavaScript中的對象比較始終只是測試某個表達式是否引用某個特定的已知對象。比較不會「查看」比較對象。

一個或許非明顯的細節是表達式[]不是對某些全局概念「空陣列」的引用;它是一個請求,創建一個全新的空陣列。因此,它也是比較

if ([] === []) 

將是錯誤的,因爲在===運營商創建一個新的,不同陣列的兩側的情況。

+0

@ T.J.Crowder yea更好的詞,謝謝。 – Pointy

+0

「一個對象永遠不會等於另一個對象」對初學者來說不是很清楚。 'oneObject = window; anotherObject = window; oneObject === anotherObject'。可能值得詳細闡述(沿着「相同內存地址」的這一行)。 – georg

+0

@georg這就是爲什麼我添加了關於「向內看」的部分,但我已經添加了一些單詞。 – Pointy

3

因爲array === []正在比較兩個對象是否相同。而在JS中,當兩者完全相同時,兩個對象是相同的。檢查兩個對象是否完全相同的唯一方法是如果它們在內存中佔據相同的空間。

我們該怎麼做?我們檢查兩個對象是否指向相同的內存地址。在其他編程語言中,他們將這個內存地址稱爲指針。

由於[]正在創建一個對象,因此它是一個新對象,因此比較返回false。

另一方面,array.length === 0正在比較原始值(數字)和JS中,如果兩個原始值具有相同的內容,他們是相等的,所以它返回true。

0

第一個檢查:array === []檢查兩個數組是否具有相同的類型(檢查)以及它們是否是相同的數組。 原因的結果爲否是因爲:

  • 儘管它們都是陣列
  • 儘管它們都是空的,
  • 它們不一樣的陣列array被存儲在位置甲,並且[]存儲在其他地方

這是由javascript如何處理數組和對象引起的:javascript不檢查內容,它只檢查它們是否指向內存中相同的數組或對象。這就是爲什麼你必須使用第二個選項。

更詳細的例子:

// for strings and numbers, javascript checks CONTENT 
let a = 'Bill'; 
let b = 'Bill'; 
console.log(a === b); // TRUE 

// for arrays and objects, javascript checks POINTERS 
let a = ['Bill']; 
let b = ['Bill']; 
console.log(a === b); // FALSE 

// also: 
var a = ['Bill']; 
var b = a; 
console.log(a === b); // TRUE 

a = ['Joe']; 
console.log(a === b); // TRUE 
console.log(b);   // 'Joe' 
+0

優秀的答案。值得嚴格指出。一個數組被認爲是JS中的一個對象。 –