解读JavaScript代码 var ie = !-[1,] 最短的IE判定代码


Posted in Javascript onMay 28, 2011

var ie = !-[1,];

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

浏览器的数组字面量解析差异

     [1,]表示使用javascript的数组字面量定义了一个数组。 在IE6,7,8中数组有两个元素,数组中的值分别为1,undefined。在标准的浏览器中会忽略第一个元素后的undefined,数组只包含一个元素1。

数组的toString()方法

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

 一元减号运算符  

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

逻辑非运算

    执行逻辑非运算时如果操作数为NaN、NULL或undefined 时返回 true。

通过上面的知识可以得出代码 var ie = !-[1,]; 其实等价于 var ie = !(-Number([1,].toString())); 在IE6\7\8中值为true。如分析的有什么不对的地方或者有什么不同意见欢迎指正!

Javascript 相关文章推荐
JS字符串函数扩展代码
Sep 13 Javascript
jQuery数据显示插件整合实现代码
Oct 24 Javascript
jquery选择符快速提取web表单数据示例
Mar 27 Javascript
瀑布流布局代码一例
Apr 11 Javascript
基于JavaScript实现Tab选项卡切换效果
Nov 24 Javascript
javascript循环链表之约瑟夫环的实现方法
Jan 16 Javascript
深入理解Vue官方文档梳理之全局API
Nov 22 Javascript
javascript将json格式数组下载为excel表格的方法
Dec 22 Javascript
element ui 对话框el-dialog关闭事件详解
Feb 26 Javascript
layui select动态添加option的实例
Mar 07 Javascript
解决vue动态为数据添加新属性遇到的问题
Sep 18 Javascript
解决layui下拉框监听问题(监听不到值的变化)
Sep 28 Javascript
Jquery css函数用法(判断标签是否拥有某属性)
May 28 #Javascript
最新28个很棒的jQuery 教程
May 28 #Javascript
JavaScript使用IEEE 标准进行二进制浮点运算产生莫名错误的解决方法
May 28 #Javascript
真正的JQuery.ajax传递中文参数的解决方法
May 28 #Javascript
jquery 图片上传按比例预览插件集合
May 28 #Javascript
使用jquery实现select添加实现后台权限添加的效果
May 28 #Javascript
jQuery 源码分析笔记(2) 变量列表
May 28 #Javascript
You might like
用来解析.htpasswd文件的PHP类
2012/09/05 PHP
PHP将两个关联数组合并函数提高函数效率
2014/03/18 PHP
初识Laravel
2014/10/30 PHP
php中最简单的字符串匹配算法
2014/12/16 PHP
PHP+redis实现的购物车单例类示例
2019/02/02 PHP
jQuery学习5 jQuery事件模型
2010/02/07 Javascript
JavaScript flash复制库类 Zero Clipboard
2011/01/17 Javascript
JS 按钮点击触发(兼容IE、火狐)
2013/08/07 Javascript
jquery slibings选取同级其他元素的实现代码
2013/11/15 Javascript
用C/C++来实现 Node.js 的模块(二)
2014/09/24 Javascript
在AngularJS中使用AJAX的方法
2015/06/17 Javascript
Ajax中解析Json的两种方法对比分析
2015/06/25 Javascript
js实现创建删除html元素小结
2015/09/30 Javascript
vue.js源代码core scedule.js学习笔记
2017/07/03 Javascript
Bootstrap table中toolbar新增条件查询及refresh参数使用方法
2018/05/18 Javascript
在angularJs中进行数据遍历的2种方法
2018/10/08 Javascript
jQuery实现B2B网站后台管理系统侧导航
2020/07/08 jQuery
Node快速切换版本、版本回退(降级)、版本更新(升级)
2021/01/07 Javascript
Python进行数据提取的方法总结
2016/08/22 Python
简单易懂的python环境安装教程
2017/07/13 Python
Django 2.0版本的新特性抢先看!
2018/01/05 Python
Python编程argparse入门浅析
2018/02/07 Python
python获取命令行输入参数列表的实例代码
2018/06/23 Python
Pandas透视表(pivot_table)详解
2019/07/22 Python
Flask框架模板继承实现方法分析
2019/07/31 Python
pytorch .detach() .detach_() 和 .data用于切断反向传播的实现
2019/12/27 Python
pytorch 自定义参数不更新方式
2020/01/06 Python
python图片验证码识别最新模块muggle_ocr的示例代码
2020/07/03 Python
opencv python 对指针仪表读数识别的两种方式
2021/01/14 Python
HTML5移动端开发中的Viewport标签及相关CSS用法解析
2016/04/15 HTML / CSS
PHP中如何创建和修改数组
2012/05/02 面试题
2014年审计工作总结
2014/11/17 职场文书
毕业论文指导教师评语
2014/12/30 职场文书
应届毕业生求职信范文
2015/03/19 职场文书
奶茶店的创业计划书该怎么写?
2019/07/15 职场文书
以MySQL5.7为例了解一下执行计划
2022/04/13 MySQL