2016-04-14 33 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