2017-12-18 181 views
0

我遇到undefined"undefined"之間的這種差異,我試圖理解它。檢查對象屬性時與undefined或「undefined」進行比較。有什麼不同?

我正在檢查對象中的屬性是否已定義。 在第一個例子中,我檢查屬性是否未定義。以下所有測試評估爲真。無論我使用的是"undefined"還是undefined

var test = { 
 
    x: 1, 
 
    y: 2 
 
}; 
 

 
if (test.x != "undefined") console.log('test.x != "undefined"'); //TRUE 
 
if (test.x !== "undefined") console.log('test.x !== "undefined"'); //TRUE 
 
if (test.x != undefined) console.log('test.x != undefined'); //TRUE 
 
if (test.x !== undefined) console.log('test.x !== undefined'); //TRUE

然後我用這不僅defined.It計算結果爲真,如果我使用undefined(不是字符串文本)或typeof財產嘗試過。

var test = { 
 
    x: 1, 
 
    y: 2 
 
}; 
 

 
if (test.z === undefined) console.log("test.z === undefined"); //TRUE 
 
if (test.z == undefined) console.log("test.z == undefined"); //TRUE 
 
if (test.z === "undefined") console.log("test.z === 'undefined'"); //FALSE 
 
if (test.z == "undefined") console.log("test.z == 'undefined'"); //FALSE 
 
if (typeof test.z === "undefined") console.log("typeof test.z === 'undefined'"); //TRUE

所以我的問題是:爲什麼差別(我想我不明白的東西......)。我使用比較「undefined」/ undefined而不是.hasOwnProperty()這是不好的做法嗎?

+0

這取決於你想要檢查的內容。大多數時候,你可以簡單地使用像這樣的東西:'if(test.x){...}'或'if(!text.z){...}'。這些類型的條件檢查很多東西,例如'undefined',* empty string *,'0','null','false'。 – Titus

+0

@Titus:我不想檢查它是否存在;下一階段是switch(),具體取決於屬性。 –

+1

在這種情況下,你可以直接寫'switch'語句,不需要先檢查。 – Titus

回答

1

undefined"undefined"是不同的值。前者是undefined,後者是字符串。

你可能看到的不是x === "undefined"x === undefined,而是typeof x === "undefined"x === undefined。請注意0​​。你看到前者的原因之一(與typeof)是歷史性的,不再相關,但不是所有的原因。

假設聲明標識符xundefined一直沒有陰影,這兩種說法實際上是相同的以外的第一個必須做一個卻有點更多的工作:

typeof x === "undefined" 
x === undefined 

但如果x不是聲明,前者將評估爲真,而後者將失敗並出現ReferenceError。 (在一般情況下,你可能的的ReferenceError,因爲它提醒您未申報idenfier,但也有使用案例前者。)

undefined不幸的是,不是關鍵字(如null);這是一個全球常數。這意味着,undefined可以陰影

function foo(undefined) { 
 
    var x; // x defaults to the value undefined 
 
    console.log(typeof x === "undefined"); // true 
 
    console.log(x === undefined);   // false?!?! 
 
} 
 
foo(42);

在實踐中,如果你發現有人陰影undefined,並給予它比undefined以外的值,帶他們出去回來,對擊敗他們用溼麪條直到他們看到感覺爲止。但是...

從歷史上看,很多年前在一個窗口中undefined的值不是===undefined的值。因此,如果您的代碼可能是跨窗口處理的,則與=== undefined進行比較並不是檢查undefined的可靠方法。幾年前,我查看了所有甚至是最近的瀏覽器,這不是一個問題(我懷疑它並沒有比這更長的時間)。

1

當您檢查"undefined"(用引號括起)時,您正在檢查值爲"undefined"的字符串。

鑑於當您檢查undefined然後檢查屬性或變量是否定義。因此,您可以使用它來檢查屬性是否已定義。

相關問題