2016-04-14 70 views
3

學習有關typeof關鍵字,需要一些澄清:行爲typeof關鍵字

雖然疑難解答我輸出此代碼到控制檯:

console.log(typeof object.prop[someNum - 1]); 

(在這種情況下sumNum === 0

的控制檯打印出undefined,這是我所期望的,因爲prop[]數組中的索引位置[someNum - 1]不存在(所以我認爲)。 然而,當我做這樣的事情:

if(typeof object.prop[someNum - 1]) 
    //some code 
else 
    //other code 

它評估爲真,並運行//some code,但是當我這樣做:

if(object.prop[someNum - 1]) 
    //some code 
else 
    //other code 

它評估爲假,並運行//other code

我的印象是undefined被認爲是falsy value,並且會在if statement中評估爲false。爲什麼if(typeof object.prop[someNum - 1])聲明評估爲真?也有人可以指出我正確的方向,我可以在js中瞭解更多關於負向索引數組的信息嗎?它們處理的是多種語言,例如c#, c++, java, & php。我認爲當評估一個負數array索引號時,它會是underfined或拋出一個錯誤。

+6

'undefined'與''undefined''不一樣。 – SLaks

+0

由於您正在學習'typeof'關鍵字,因此您可以在其中找到[MDN文檔](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof)案件)。 –

+0

如果你正在檢查財產的存在,你並不需要'typeof'。你可以在object.prop中執行'(someNum-1),或者如果你擔心繼承的屬性,'object.prop.hasOwnProperty(someNum-1)'。使用'typeof'不會區別存在於'未定義'值的屬性和不存在的屬性。 – 2016-04-14 22:57:13

回答

5

typeof總是返回一個字符串。

因此,您正在編寫if ("undefined")

由於非空字符串是真的,如果將運行。

1

正如SLaks所說,你正在評估字符串「undefined」是否真的是真的。

如果你想看看一個對象有一個名爲「someNum - 1」屬性,那麼你可以使用操作:

if ((someNum - 1) in object.prop) 

這將返回true,如果object.prop有這樣在其自身上或它的[[Prototype]]鏈,或任何一個屬性:

if (object.prop.hasOwnProperty(someNum - 1)) 

測試對於直接的屬性的對象上。

+0

有一個對象數組,因此'(someNum - 1)是數組索引。那就是說''object.prop'中的'.prop'指的是什麼? – webDev

+0

它使用[* in *](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/in)運算符來測試屬性是否存在。 '(sumNum - 1)'的括號表示「首先評估這個表達式,然後在外部表達式中使用結果」。 ;-) – RobG

+0

gotcha。非常感謝。你一直是一個很大的幫助 – webDev

1

正如其他答案已經指出,typeof返回一個字符串,並且它總是truthy,因爲它永遠不會返回一個空字符串。如果要測試類型是否爲undefined,則需要比較字符串。

if (typeof object.prop[someNum - 1] == "undefined") { 
    // some code 
} else { 
    // some code 
} 

你也可以只是測試值是否爲undefined

if (object.prop[someNum - 1] === undefined) { 
    // some code 
} else { 
    // some code 
} 

請確保您使用===而非==,所以不會報告一次匹配,如果object[someNum - 1]null