2009-10-23 56 views
0

我有多个选择,我做了一个函数来检查几个参数,每个打印的另一种形式是不同的:javascript“in”奇怪或正常的行为?

if ((tot_v >= 10) || (perc_a < 100)) { 
    $("#DA_IDO").val('1'); 
} 

if ((tot_v > 3) && (tot_v < 10) && (perc_a == 100)) { 
    $("#DA_IDO").val('2'); 
} 

if ((tot_v <= 3) && (perc_a == 100)) { 
    $("#DA_IDO").val('3'); 
} 

然后我们来罪证如:

if (!(array in {'One':'', 'Two':'','Three':'','Four':'','Five':''})) { 
    $("#DA_IDO").val('5'); 
} 

该作品,但在我的脑海里,如果array =(One,Ten),if应该不起作用,因为数组中至少有一个项目在那里,而不是像if被触发的数组。

我在做什么错?是如此难以搜索“的JavaScript”在谷歌.-)

感谢

回答

2

我认为你误解了“in”声明。在JavaScript中,“in”检查指定值是否作为属性(或数组中的索引)存在。例如:

var x = { a: 'b', c: 'd' }; 
if('a' in x){ 
    //true 
} 
if('b' in x){ 
    //false 
} 

什么你想要做的是确定是否数组中值的任意包含在对象之内。对于这一点,你必须使用一个循环,这样的事情:

var possible = {'One':'', 'Two':'','Three':'','Four':'','Five':''}; 
//removed "array" as a variable name, since it's a bit confusing 
for(var i = 0; i < values.length; i++){ 
    if(values[i] in possible){ 
    //exists 
    } 
} 

有关详细信息,请查看Mozilla的文档: https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Operators/Special_Operators/in_Operator

+0

非常感谢 – 0plus1 2009-10-23 13:41:16

1

Mozilla Developer Central page应该澄清一下它是:

如果指定的属性位于指定的对象中,则in运算符返回true。

左手边应该是财产的名称,例如, “一”。您不能使用一组属性名称。

+0

您实际上可以做到这一点,至少在IE 7,Firefox 3和Safari 3中。我只是在我的本地机器(Windows XP)上运行了一点测试,并且所有三个测试的浏览器都显示了正确的结果以下代码: var keys = {'One':'','Two':'','Three':'','Four':'','Five':''}; (('One','Five')in keys); //返回true document.write(('One','Ten')in keys); //返回false document.write(('One','Three','Four')in keys); //返回true – MikeWyatt 2009-10-23 13:46:30

-1

这是正常的行为,你的变量“array”是一个数组(因为你把它设置为('One','Ten')),所以它不是int {'One':'', 'Two':'','Three':'','Four':'','Five':''}(但'一'是)。

if块的原因是因为您正在检查NOT IN('!')。

我希望我没有在这里错过任何东西。