澄清即使用javascript检测即可

时间:2013-05-22 17:17:38

标签: javascript internet-explorer

我正在寻找方法来检测javascript中的浏览器,这是我找到的解决方案之一:

if (-[1,]) {
    //Not IE

} else {
    //IE
}

这是有效的,我可以使用这个很好地应用CSS。我的问题是,幕后发生的事情是什么?我不明白这种条件并将其输入谷歌让我感兴趣,但不是相关结果......

修改

我的代码工作正常。我已在所有浏览器和IE的所有版本中测试过它。在这一点上,这只是一个好奇心,为什么这是有效的。看起来它与数组和负索引等有关。这是我的问题,为什么,而不是我如何让它工作,因为它已经有效。

2 个答案:

答案 0 :(得分:6)

IE有一个Javascript解析问题:[1,]被解析为[1, undefined] 符合标准的浏览器会忽略逗号并将其解析为[1]

一元否定运算符,当应用于长度为1的数组时,将取消数组的单个元素。
因此,-[1]-1(这是真实的) 但是,-[1, anything](IE解析[1,]的方式)是NaN,这是假的。

但是,你不应该依赖这种行为

相反,使用Modernizr,无论浏览器如何,都会自动为每个功能添加类。
如果你真的想要特别区分IE(这是个坏主意),请使用conditional comments

答案 1 :(得分:4)

打开控制台,看看发生了什么。

铬:

> -[1,]
  -1
> [1,].length
  1

IE 8

> -[1,]
  NaN 
> [1,].length
  2

IE 9

> -[1,]
  -1
> [1,].length
  1

IE8将进入else语句,因为NaN falsely 值。 -1是一个 truthy 值,因此它将被视为true。它基本上测试浏览器如何处理数组中的尾随逗号。 IE8及以下版本添加了额外的索引,而其他人则忽略了逗号。 IE9 +修复了它并且也忽略了它。当Unary Minus [可以使用一元加号]将数组转换为数字并且根据具有额外未定义索引的数组获得NaN-1时,神奇工作。

如果您的代码进入IE9或IE10上的else,则表示您的页面未在IE9 / 10模式下运行,而是在IE8或IE7模式下运行。