最短的IE判定var ie=!-[1,]分析

以前最短的IE判定借助于IE不支持垂直制表符的特性搞出来的。

var ie = !+"\v1";仅仅需要7bytes!参见这篇文章,《32 bytes, ehr ... 9, ehr ... 7!!! to know if your browser is IE》,讲述外国人是如何把IE的判定从32 bytes一步步缩简成7 bytes!的故事 但这纪录今年1月8日被一个俄国人打破了,现在只要6 bytes!它利用了IE与标准浏览器在处理数组的toString方法的差异做成的。对于标准游览器,如果数组里面最后一个字符为逗号,JS引擎会自动剔除它。

var ie = !-[1,];这句代码在IE9之前曾被称为世界上最短的IE判定代码。代码虽短但确包含了不少javascript基础知识在里面。在这个例子中代码执行时会先调用数组的toString()方法 ,执行[1,].toString()在IE6,7,8中将会得到"1,"。然后表达式就变为!-"1,"。再尝试把"1,"转换成数值类型得到NaN ,再对NaN取负得到值仍为NaN。最后执行!NaN返回true。下面通过

分解这个语句来回顾下代码中所涉及到的javascript知识:
1. 浏览器的数组字面量解析差异
[1,]表示使用javascript的数组字面量定义了一个数组。 在IE6,7,8中数组有两个元素,数组中的值分别为1,undefined。在标准的浏览器中会忽略第一个元素后的undefined,数组只包含一个元素1。

2. 数组的toString()方法
调用数组对象的toString()方法时会对数组中的每个元素调用toString()方法,如果元素的值为NULL或者undefined时会返回空的字符串,然后将得到的每项的值拼成一个使用 逗号","分隔的字符串。

3. 一元减号运算符
使用一元减号运算符时如果运算数是数值类型则直接对运算数取负,否则会先尝试把运算数转换为数值类型,转换过程相当于执行Number函数,然后再对得到的结果取负。

4. 逻辑非运算
执行逻辑非运算时如果操作数为NaN、NULL或undefined 时返回 true。
JavaScript可以这么写:
var ie = !-[1,];      alert(ie);  如果从非IE的角度判定,可以省一个比特,因为我们做兼容时,绝大多数情况都是IE与非IE地开工。 var notIE = -[1,];
if(-[1,]){       alert("这不是IE浏览器!");  }else{       alert("这是IE浏览器!");  }通过上面的知识可以得出代码 var ie = !-[1,]; 其实等价于 var ie = !(-Number([1,].toString())); 在IE6\7\8中值为true。

因为IE6/7/8都不会忽略[1,].ToString()这个bug,即得到的是"1,";而-Number([1,].toString())即为-Number("1,")得到的结果是NaN;然后!(-Number([1,].toString()))即为!(NaN)即得到true。一切的前提是IE6/7/8都有[1,].ToString()=>"1,"这个bug,而其它浏览器(应该是大部分吧~~)则是[1,].ToString()=>"1"。

http://www.yangzblog.com/javascript/isie.html

转载于:https://www.cnblogs.com/studynote/articles/3487422.html

[转载]判断IE浏览器-世界上最短的代码相关推荐

  1. 世界上最短的DVD解码程序(附源码) (转)

    世界上最短的DVD解码程序(附源码) (转)[@more@] 前些天麻省理工学院的两位学生编写出世界上最短的 dvd解码 程序,而这个纪录最近被一位名为Charles M Hannum的程序员打破,他 ...

  2. java地铁最短,世界上最短的地铁 600米长的地铁线路

    地铁是现在城市公共交通的主力,自从世界上第一条地铁诞生之后,得益于在地下运行,不占用地面交通资源的优势,现在各大城市都在修建尽可能长的地铁线路,让城市交通更加便利,但是土耳其的一条地铁线路却是大不一样 ...

  3. 世界上最短的DVD解码程序(0.5K)

    前些天麻省理工学院的两位学生编写出世界上最短的DVD解码程序,而这个纪录最近被一位名为Charles M Hannum的程序员打破,他所编写的解码程序只有442个字节,而那个七行的Perl解码程序则为 ...

  4. 世界上最短的DVD解码程序

    世界上最短的DVD解码程序 前些天麻省理工学院的两位学生编写出世界上最短的DVD解码程序,而这个纪录最近被一位名为Charles M Hannum的程序员打破,他所编写的解码程序只有442个字节,而那 ...

  5. 世界上最短的DVD解码程序(附源码)

    前些天麻省理工学院的两位学生编写出世界上最短的DVD解码程序,而这个纪录最近被一位名为Charles M Hannum的程序员打破,他所编写的解码程序只有442个字节,而那个七行的Perl解码程序则为 ...

  6. 拍一拍,微信史上最短一行代码

    Python实战社群 Java实战社群 长按识别下方二维码,按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群▲ 作者丨苏克1900 来源丨高级农民工(Mocun6) ...

  7. 360导入html没有,IE无法加载到外部CSS样式, 用360浏览器就可以,上CSS引用代码[急]_html/css_WEB-ITnose...

    新用户注册页面 通行证用户名: @163.com 啊啊 登录密码: 重复登录密码: 性别: 男 女 真实姓名: 昵称: 关联手机号: 保密邮箱: 下面是CSS @charset "utf-8 ...

  8. python代码少的作品_世界上有哪些代码量很少,但很牛逼很经典的算法或项目案例?...

    快速傅里叶变换(FFT),核心算法用递归法几十行搞定. 计算机应用最为重要的算法之一,广泛应用于各种各样的工业和科学实践中.第一次看到递归算出快速傅里叶的时候,惊了很久.后来经过数学家的很多努力,有了 ...

  9. 世界上有哪些代码量很少,但很牛逼很经典的算法或项目案例?

    来自公众号:五分钟学算法 今天分享四个代码量很少,但很牛逼很经典的算法或项目案例. 1.no code 项目地址: https://github.com/kelseyhightower/nocode ...

最新文章

  1. Java中的static关键字的用法
  2. 正定小主人机器人_石家庄正定县2015中小学生机器人运动大赛隆重开幕
  3. python100行代码-python代码行数统计 100行
  4. adminLTE 教程 -4 轮播控件
  5. 使用Scalatra创建Scala WEB工程
  6. Linux网络模块全局变量,()不是Linux系统的特色.
  7. 程序员面试金典 - 面试题 04.10. 检查子树(双重递归)
  8. html仿京东快速购物导航,jQuery仿京东楼层滑动侧边栏高亮(原创)
  9. 前端动态获取servlet虚拟路径_Day40_Servletamp;HTTPamp;Request
  10. freeradius 在centos上的安装和调试
  11. Revealing图片展示效果(jQuery)
  12. 数字电路与逻辑设计习题
  13. 接口--PCI/PCIE
  14. Cadence学习之路:什么是PCB工艺的正片与负片
  15. Firefox内存占用过高假死解决方法
  16. 今天开始做战斗,回合制战斗代码实现第一篇补充,从头开始,简单的2d回合制游戏一些文档方面的知识
  17. 【UE4】pawn 和 Character 的区别
  18. 福州华侨中学计算机老师,三尺讲台著妙笔 谱写侨习好韶光——记2015级福州华侨中学实习队工作检查...
  19. 怎样选择步进电机和驱动器,计算方式
  20. Wrong committed revision number: -1

热门文章

  1. Python - - 项目实战 -- pygame 快速入门
  2. 前端模块管理器命令:npm bower
  3. Catalina.stop: Connect refused解决过程
  4. leetcode--Median of Two Sorted Arrays
  5. 【Android】CM在repo中使用local manifest
  6. 完美支持蓝光高清 小米盒子复活版体验
  7. [原]Oracle删除大表并回收空间的过程
  8. Java String关于replaceall函数转义字符的一个小贴士
  9. Ansj中文分词Java开发自定义和过滤词库
  10. ubuntu15.10安装wireshark