2012-10-31 64 views
2

我最近看了关于CSS的浏览器功能检测的教程......最终的产品是这样的......foo in bar - 'in'operator javascript?

var prefix = ['Moz', 'webkit', 'O', 'ms', 'Khtml'], 
    test_style = document.createElement('div').style; 

var css_check = function(prop) { 
    if (prop in test_style) { 
     return true; 
    } 
    for (var i = 0; i < prefix.length; i++) { 
     if (prefix[i] + prop in test_style) { 
      return true; 
     } 
    } 
    return false; 
}; 

css_check('whatev_css_property'); 

我不明白的部分是这个...

if (prop in test_style)if (foo in bar)

从我读的if (foo in bar)是用来检查一个值是否在一个数组中,但我可能在这里是错误的,我还没有找到这方面的文档。此外,如果这是用来检查数组中的值如何是test_style = document.createElement('div').style数组?没有意义...

我很可怕的困惑。任何澄清将不胜感激。

+2

我不会建议使用'foo in bar'来检查数组中是否存在值 - 您应该使用'indexOf'(http://stackoverflow.com/questions/237104/array-containsobj-in- javascript)。在你的情况下,'test_style'是一个对象字面值,在这种情况下'foo in bar'对于检查密钥的存在是正确的。在bar中使用'foo'检查数组中是否存在索引(索引与对象的键相同) – Ian

回答

2

in运算符用于检查数组或对象中是否存在

3 in [1, 2, 3] // false, since the array indices only go up to 2 
2 in [1, 2, 3] // true 
'x' in { x: 5 } // true 
'toString' in Object.prototype // true 

style属性有一种CSSStyleDeclaration一个实例,其包含用于在活动的浏览器支持的每个风格属性的属性。

您在文章中给出的代码片段检查查看浏览器是否支持该样式的某些版本(官方版本或多种常见供应商前缀之一)。

+0

感谢您的示例。现在更有意义。 – Terry

1
document.createElement('div').style 

将返回一个具有CSS属性的对象。您可以使用key in来检查对象中是否存在特定属性。

3

声明if (foo in bar)测试对象是否bar有一个名为foo财产。它不测试值为foo的属性。

即:

var bar = {"a" : "x", "b" : "y"}; 
alert("a" in bar); // true 
alert("x" in bar); // false 

,因为他们是一个类型的对象,您可以使用数组此语法。如果bar是一个数组,则foo in bar将为真,如果foo是具有值的数组的数字索引或者foo是某个其他属性或方法名称。

此外,如果这是用来检查数组中的值如何是test_style = document.createElement('div').style数组?

test_style是一个对象,而不是一个数组。

+0

感谢您的澄清! – Terry

+0

我认为'hasOwnProperty'也适用于此。如果你只想检查一个索引是否存在,你可以在数组&& array.hasOwnProperty(“1”))中使用if(“1”) - 如果被检查的内容是动态的而不是硬编码为“” 1" '。这样,它会忽略任何本地方法。对?只是想知道 – Ian

+0

@ianpgall - 如果你使用'.hasOwnProperty()'(我可能应该在我的答案中提到),你也不需要'in'运算符。 – nnnnnn

1

if (foo in bar)用于检查名为foo的值是否为对象bar的属性。由于数组只是特殊处理的对象,所以假设它可以用于检查数组中的值是正确的。

test_style = document.createElement('div').style返回具有属性的对象;既然是这样,你可以使用foo in bar语法来检查它。

+0

_“假设它可以用于检查数组中的值是正确的。”_ - 它不检查_value,_它检查属性_name_(或者,在数组中,是否为具体_index_有一个值)。 – nnnnnn

+0

在数组中使用'foo in bar'将不起作用。你是对的,它就像一个对象,但在一个数组中,它的“键”将是索引。因此,在'bar中使用'foo将检查现有的索引。 – Ian

相关问题