我正在寻找方法来检测javascript中的浏览器,这是我找到的解决方案之一:
if (-[1,]) {
//Not IE
} else {
//IE
}
这是有效的,我可以使用这个很好地应用CSS。我的问题是,幕后发生的事情是什么?我不明白这种条件并将其输入谷歌让我感兴趣,但不是相关结果......
我的代码工作正常。我已在所有浏览器和IE的所有版本中测试过它。在这一点上,这只是一个好奇心,为什么这是有效的。看起来它与数组和负索引等有关。这是我的问题,为什么,而不是我如何让它工作,因为它已经有效。
答案 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模式下运行。