2015-09-08 43 views
0

兩個之間有什麼不同variable一個賦值爲undefined而第二個只是declared一個var未被賦予?兩個變量之間的差異被賦予一個未定義的值,第二個被賦予一個未初始化的值

var a = undefined; 
var b; 
a === b; // returns true 

什麼是兩個可變ab之間有什麼不同?

var ar = new Array(4); // ar = 0[undefined × 4] 
ar[0] = null; // ar = [null, undefined × 3] 
ar[1] = undefined; // ar = [null, undefined, undefined × 2] 

ar.filter(function(item, index, arr){ 
    return item == undefined; 
}); // [null, undefined] 

我知道Array的過濾函數只運行初始化索引。

javascript如何內部檢查ar[1]是assigend undefined所以運行過濾器和ar[2]未分配undefined所以不運行這個?

+0

將'implicit'和'explicit'賦值給'undefined'。那是否_matter_? – Tushar

+0

那麼爲什麼這個隱式未定義不適用於數組的過濾器?我認爲它在數組過濾功能的情況下很重要 – intekhab

+0

誰投了票。請解釋爲什麼? – intekhab

回答

1

有三個不同的問題怎麼回事:

  1. 剛剛宣佈,但是還沒有分配,當你讀到變量的值將報告undefined有規律的變化。這實質上是它的默認值。

  2. 您有==比較null時要非常小心,因爲你會發現,null == undefinedtrue由於自動類型轉換。因此,如果只想過濾undefined元素,則必須在過濾器中使用item === undefined

  3. .filter()只迭代數組中實際被賦值的元素。與普通變量不同,指定值的數組元素與從未指定值的數組元素之間存在差異,並且.filter()知道跳過那些從未分配過值的元素(本質上爲「稀疏」的元素) 。

下面是關於這三個問題的一些更詳細:

已聲明,但沒有初始化的變量,有undefined值。這是它的默認值。

此,預期此代碼:

var a = undefined; 
var b; 
a === b; // returns true 

然後,在你的第二個代碼塊,如果你想真正測試的東西是否undefined,那麼你需要使用===,不==避免任何類型轉換。

var ar = new Array(4); // ar = 0[undefined × 4] 
 
ar[0] = null; // ar = [null, undefined × 3] 
 
ar[1] = undefined; // ar = [null, undefined, undefined × 2] 
 

 
var result = ar.filter(function(item, index, arr){ 
 
    return item === undefined; 
 
}); 
 

 
for (var i = 0; i < result.length; i++) { 
 
    document.write(i, ": ", result[i], "<br>"); 
 
}

注:.filter()將跳過沒有被初始化爲任意值的數組中的元素,因此,他們將永遠不會甚至可以在.filter()操作考慮。如果您嘗試讀取它們的值,則會得到undefined,但.filter()知道從未分配任何內容的「稀疏」數組值。它與數組鍵是否存在有關,不是數值是什麼,因此它對於數組項而言與普通變量不同。

MDN doc for .filter()

由濾波器處理的元素的範圍()在第一 調用回調之前設置。在調用過濾器()開始後 之後附加到數組的元素將不會被回調訪問。如果 數組的現有元素髮生更改或刪除,則傳遞給回調函數的值爲 將是filter()訪問它們時的值; 被刪除的元素未被訪問

下面演示瞭如何在數組元素被賦值之前實際不存在數組鍵。這是.filter()用來了解迭代,什麼跳過信息:

var ar = new Array(4); 
 
ar[1] = "foo"; 
 
ar[2] = undefined; 
 

 
for (var index in ar) { 
 
    document.write(index, ": ", ar[index], "<br>");  // 1 foo, 2 undefined 
 
}

注意索引0和3未與for循環迭代,因爲不存在這些鍵陣列。該數組是「稀疏」。實際上只存在一些元素。

+0

請仔細閱讀完整的問題,然後給出答案 – intekhab

+0

我知道這一點.... filter()會跳過尚未初始化的數組中的元素,使其具有未定義的任何值。那麼javascript如何識別兩個之間的未定義值是明確分配的,而另一個是隱式分配的? – intekhab

+0

@intekhab - 我很難理解你在問題中真正想問什麼,所以我完成了每一部分,我想我現在已經討論了這些問題。 – jfriend00

相關問題