字符串与键的真实性

时间:2011-08-28 21:34:09

标签: javascript if-statement

今天我尝试缩短这样的if语句:

if (fruit == "apple" || type == "pear" || type == "orange"){

到此:

if (fruit in ["apple", "pear", "orange"]){

它不起作用。 Jonathan Snook有一个不同的解决方案here,他基本上使用这样的地图,这确实有效:

if(fruit in {"apple":"", "pear":"", "orange":""}){

为什么这个工作和我的简单数组没有,当通常在Javascript中一个对象的存在使该对象返回true?字符串是一个不同于键的对象类型吗?我以为字符串在我的数组中的存在也会返回true。

y = "Stackoverflow";
y && console.log('y is true') // y returns true, so console logs the message

我将原始解决方案解释为“如果变量水果的值在此数组中”。事实显然并非如此。它是否代之以“如果变量水果本身在这个数组中?”不,因为这不起作用:

if (fruit in [fruit, "apple", "pear", "orange"]){

那么什么是Snook的版本,其中key =>值映射要求它是正确的?我最好的猜测是,“如果此映射中变量fruit的值名称下的键返回true?”

2 个答案:

答案 0 :(得分:4)

如果对象x in y有一个名为true 的属性,则

y会返回x。(是的,您的猜测是正确的)。< / p>

数组也是对象。数组的属性是索引,它们是数字。这有效:

if(0 in ["apple", "pear", "orange"])

因为数组的索引为0。这个数组类似(但不一样!)到这个对象:

{0: "apple", 1: "pear", 2:"orange"}

(当然数组还有其他属性,如lengthpushslice等)

在您的对象示例中,{"apple":"", "pear":"", "orange":""})applepear等是对象的属性,而不是属性值。

How do I check if an array includes an object in JavaScript?中描述了如何确定元素是否包含在数组中。


†:严格来说,每个属性都是一个字符串,所以即使你使用数字(就像数组一样),它们也会被转换成字符串。

答案 1 :(得分:2)

要检查某个值是否在数组中,请使用indexOf

if (["apple", "pear", "orange"].indexOf(fruit) != -1){

注意: IE&lt; 9不支持数组上的indexOf,但您可以add support easily