澄清使用javascript进行ie检测

Clarification on ie detection with javascript

本文关键字:进行 ie 检测 javascript      更新时间:2023-09-26

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

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

这是有效的,我可以使用它来应用CSS。我的问题是,这背后到底发生了什么?我不懂这个条件,在谷歌上输入它会得到有趣的结果,但不是相关的结果……

编辑

我的代码工作正常。我已经在所有浏览器和所有版本的IE中进行了测试。在这一点上,它只是一个好奇为什么这是有效的。它看起来像是和数组和负标之类的东西有关。这是我的问题,为什么,而不是我如何让它工作,因为它已经工作。

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

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

然而,你不应该依赖于这个行为

相反,使用Modernizr,它将自动为每个特性添加类,而不管使用哪种浏览器。
如果你真的想区分IE(这是一个坏主意),使用条件注释。

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

Chrome:

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

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

IE 9

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

IE8将进入else语句,因为NaN是一个false 值。-1是一个 true 值,因此它将被视为true。它基本上是在测试浏览器如何处理数组中末尾的逗号。IE8及以下浏览器添加了一个额外的索引,而其他浏览器则忽略逗号。IE9+修复了这个问题,也忽略了它。当一元减号(可以使用一元加号)将数组转换为数字时,魔术就会起作用,您可以根据具有额外未定义索引的数组获得NaN-1

如果你的代码在IE9或IE10上进入else,那么这意味着你的页面不是在IE9/10模式下运行,而是在IE8或IE7模式下运行。