`
JavaSam
  • 浏览: 932814 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

javascript 中 undefine于void 0区别

 
阅读更多
今天看prototype源码时发现有一段代码很奇怪
 
switch(o) {
       case null: return NULL_TYPE;
       case (void 0): return UNDEFINED_TYPE;
 
}
 
为什么第二个case的值是(void 0)?
 
从这段代码可以看出,它是对null和undefined进行判断。
 
第二个case的判断条件就是undefined。那么它为什么使用void 0而不是直观的undefined呢?
 
学习过javascript的同学知道undefined是一个全局属性,表示未定义或定义了没有赋值。
 
void是一个一元运算符,不管传入什么参数都会返回undefined。
 
到网上google一下,发现void操作符是在ECMAScript v1中定义的,而undefined是在ECMAScript v5中定义的。
 
好了,我们知道这个用法是为了兼容老版本的浏览器。那么还有其它的区别吗?
 
我们知道undefined不是javascript的保留字,所以我们可以用undefined作为变量名。这时,我们定义的undefined就会影响到使用undefined作为判断的地方。
 
那么,真是这样吗?
 
我的测试代码是这样的:
 
undefined=123;
 console.log(undefined);
 console.log(void 0);
 

结果在chrome17和firefox10里面打印的结果是2个undefined,但是在ie9里面打印的是123和undefined。
 
我只能说chrome17和firefox10很智能。
 
同时,我去测试了一下这两种方式的性能差别。
 
我的测试代码是这样的:
 
var j=10000000,res;
 var t1=new Date();
 for(var i=0;i<j;i++){
 res=undefined;
 }
 var t11=new Date();
 console.log(t11.getTime()-t1.getTime());
 var t2=new Date();
 for(var i=0;i<j;i++){
 res=void 0;
 }
 var t22=new Date();
 console.log(t22.getTime()-t2.getTime());
 

发现它们性能没多大区别。但是我却发现chrome17的时间在140ms左右,firefox10在28ms,ie9在440ms。chrome和firefox的结果让我诧异。
 



最后,总结一下:
 
使用void 0代替undefined是为了兼容性以及预防代码的不规范(自己修改undefined的值)。
 

 

0
2
分享到:
评论

相关推荐

    javascript中的undefined和not defined区别示例介绍

    主要介绍了javascript中的undefined和not defined区别,需要的朋友可以参考下

    javascript中的undefined 与 null 的区别 补充篇

    之前软件开发网发不过类似的文章JavaScript null和undefined区别分析JavaScript Undefined,Null类型和NaN值区别先说说undefined: Javascript中的变量是弱类型的(关于这个我想就不用我多解释啦), 所以声明变量的...

    javascript中错误使用var造成undefined

    在javascript中根据变量作用的范围不同分为局部变量和全局变量,直接定义的变量是全局变量,全局变量可以被所有的脚本访问;在函数中定义的变量是局部变量,局部变量只在函数内有效。 如果全局变量和局部变量使用...

    javascript中undefined的本质解析

    下面解释javascript中属性的本质,因为undefined是一个属性,了解undefine的本质要用到属性的本质。 三、属性本质 对JavaScript来说,属性并非只是简单的名称和值,JavaScript用一组特征(attribute)来描述属性...

    JavaScript 基础篇(一)

    JavaScript 基础篇(一) 基础篇 Javascript:一、数据类型和值 javascript:允许使用3种基本类型数据——–数字、字符串、布尔值,此外还支持两种小数据类型null(空)和undefine(未定义). javascript:还支持符合...

    深入理解javascript作用域和闭包

    作用域是一个变量和函数的作用范围,javascript中函数内声明的所有变量在函数体内始终是可见的,在javascript中有全局作用域和局部作用域,但是没有块级作用域,局部变量的优先级高于全局变量,通过几个示例来了解下...

    JavaScript判断变量是否为undefined的两种写法区别

    主要是对JavaScript判断变量是否为undefined的两种写法区别进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助

    JavaScript中常用的运算符小结

    一、一元运算符 1、delete 运算符:删除对以前定义的对象属性或方法的引用。例如: var o=new Object; o.name=”superman”; alert&#40;o.name&#41;; //输出 “superman” ... 2、void 运算符: 对任何值都返回undefine

    JavaScript中变量提升机制示例详解

    JavaScript的变量提升有两种,用var声明的变量以及用function声明的变量。 用var声明的变量 我们先来看下面这段代码,a的值是多少 代码1 console.log(a); var a; 按照以往编程语言的思路来看,代码自上而下运行,...

    C++中调用C文件中的函数会报undefined refrence to 如何解决.zip

    C++中调用C文件中的函数会报undefined refrence to 如何解决.zip

    通过js实现cookies 的增删改查

    通过js实现cookies 的增加删除修改,解决chrome读为 undefine 的问题

    JavaScript Perfection kill 测试及答案

    下面是选择题:官方地址是 http://perfectionkills.com/javascript-quiz/ 代码如下: 1. (function(){ return typeof arguments; })(); “object” “array” “arguments” “undefined” 2.... 1 null undefine

    STC-MCU-SPI演示

    //#define MASTER //define:master undefine:slave #define FOSC 18432000L #define BAUD (256 - FOSC / 32 / 115200) typedef unsigned char BYTE; typedef unsigned int WORD; typedef unsigned long DWORD; sfr...

    Laravel开发-laravel-breadcrumb

    Laravel开发-laravel-breadcrumb 一个简单的面包屑生成器。

    Javascript基础教程之数据类型 (字符串 String)

    javascript一共有9种数据类型,分别是字符串 String、数值型 Number、布尔型 Boolean、未定义 Undefine、空值 Null、对象 Object、引用Refernce、列表型 List、完成型 Completion,我们今天首先来看看(字符串 ...

    java环境变量配置工具_第二版

    java环境变量配置工具,配置过程详细解释,java学习详细资料

    详细分析JavaScript变量类型

     只有6种 : 四种原始数据类型boolean , number, string , undefine, 其他object,function是对象  typeof,instanceof   直接看实例: var obj = null; console.info(typeof obj); //Object var arr = []; ...

    redux-devTools

    redux-devtools.crx 版本 2.15.3 大小 5.6 MB 解决 使用安装redux.devTools后 Cannot read property 'state' of undefined 问题

    解决gedit: symbol lookup error: /home/xxx/libgobject-2.0.so.0: undefined symbol: g_date_copy问题

    在终端启动gedit命令或者vscode命令报错:gedit: symbol lookup error: /home/chujie/anaconda3/lib/libgobject-2.0.so.0: undefined symbol: g_date_copy 问题分析: 导致错误的原因应该是gedit依赖libgobject-2.0....

    happyCoding1024#FrontendLearningTool#浅析JS中的setTimeout和setInterva

    第一个为undefine是因为timer为参数,相当于声明了,但没有赋值,所以为undefined 第二个为NaN是因为undefined+1不是一个数字,所以

Global site tag (gtag.js) - Google Analytics