今天我尝试缩短这样的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?”
答案 0 :(得分:4)
x in y
有一个名为true
的属性,则 y
会返回x
。(是的,您的猜测是正确的)。< / p>
数组也是对象。数组的属性是索引,它们是数字†。这有效:
if(0 in ["apple", "pear", "orange"])
因为数组的索引为0
。这个数组类似(但不一样!)到这个对象:
{0: "apple", 1: "pear", 2:"orange"}
(当然数组还有其他属性,如length
,push
,slice
等)
在您的对象示例中,{"apple":"", "pear":"", "orange":""})
,apple
,pear
等是对象的属性,而不是属性值。
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。