得到便利,总是要付出代价的!!
本周遇到一个JavaScript问题,思来想去只能用这句话来总结了。
简单来说,就是将某一个值和0进行比较,但是有些异常情况导致结果怪异,最后发现是在某些情况下那个值有可能是’’,也就是空值,而空值和0在JavaScript中是相等的,这个之前由于研究的不深,不知道这个内容,感觉有些不可思议,就问了下虞青,查了些资料,不敢独享,如果已知,敬请忽略。
首先从JavaScript中的对象说起,JavaScript有六种对象 number、string、object 以及 Boolean 类型,其他两种类型为 null 和 undefined。
String 字符串类型:字符串是用单引号或双引号来说明的。
数值数据类型:JavaScript 支持整数和浮点数。
Boolean 类型:可能的 Boolean 值有 true 和 false。
Undefined 数据类型:一个为 undefined 的值就是指在变量被创建后,但未给该变量赋值以前所具有的值。
Null 数据类型:null 值就是没有任何值,什么也不表示。
object类型:除了上面提到的各种常用类型外,都是object
<script type="text/javascript">
alert(typeof(false) === 'boolean');
alert(typeof(0) === 'number');
alert(typeof("") === 'string');
alert(typeof(null) === 'object');
alert(typeof undefined === 'undefined');
</script>
alert(typeof(null) === 'object');是JavaScript最初实现的一个错误,然后被ECMAScript沿用了,也就成为了现在的标准。因此js中虽然有null类型,但是typeof null却是object。
undefined和null都表示空值
由于JavaScript是弱类型的,因此var v1;无法确定v1的类型,在Javascript中对于这种声明后没有给定初始值的变量,就给他一个undefined。
也就是 var v1;
alert(v1) //undefined
也就是声明后没有赋值的就是undefined,但是对于没有声明就直接用的,就会报错,
比如alert(v2) //error
在JavaScript中对于object 类型的变量,他有两种情况,一种是他是一个对象的实例,另一种他是一个空引用null,熟悉类似Java这样面向对象语言的应该很容易理解。对于这两种情况,他们的类型都是object。
var v2 = new Date();
alert(type(v2)) //object
v2=null;
alert(type(v2)) //object
并且null参与数值运算的时候自动转换为0,因此123+null =123;123*null=0
另外null是js的关键字
而undefined不是关键字,但却是一个属性,而且是全局对象(window)的属性
alert('undefined' in window); //输出:true
alert(undefined in window); //输出:true
随便说一下,NaN是全局对象(window)的另一个特殊属性,Infinity也是。这些特殊属性都不是JavaScript的保留关键字!
另外再扯远一点,当我们将一个变量或值与undefined比较时,实际上是与window对象的undefined属性比较。
由于window对象的属性值是非常多的,在每一次与undefined的比较中,搜索window对象的undefined属性都会花费时间。在需要频繁与undefined进行比较的函数中,这可能会是一个性能问题点。因此,在这种情况下,我们可以自行定义一个局部的undefined变量,来加快对undefined的比较速度。
因为作用域上的变量数量会远远少于window对象的属性,搜索变量的速度会极大提高。这就是许多前端JS框架为什么常常要自己定义一个局部undefined变量的原因!
下面再来说下 Javascript中的等号运算符,
以下参考自http://www.w3school.com.cn/js/pro_js_operators_equality.asp
ECMAScript 提供了两套等性运算符:等号和非等号用于处理原始值,全等号和非全等号用于处理对象。
在 ECMAScript 中,等号由双等号(==)表示,看好了了是两个等号,当且仅当两个运算数相等时,它返回 true。非等号由感叹号加等号(!=)表示,当且仅当两个运算数不相等时,它返回 true。为确定两个运算数是否相等,这两个运算符都会进行类型转换。
执行类型转换的规则如下:
1.如果一个运算数是 Boolean 值,在检查相等性之前,把它转换成数字值。false 转换成 0,true 为 1。
2.如果一个运算数是字符串,另一个是数字,在检查相等性之前,要尝试把字符串转换成数字。
3.如果一个运算数是对象,另一个是字符串,在检查相等性之前,要尝试把对象转换成字符串。
4.如果一个运算数是对象,另一个是数字,在检查相等性之前,要尝试把对象转换成数字(通过toString()或者valueOf()方法)。
在比较时,该运算符还遵守下列规则:
5.值 null 和 undefined 相等。
6.在检查相等性时,不能把 null 和 undefined 转换成其他值。
7.如果某个运算数是 NaN,等号将返回 false,非等号将返回 true。
8.如果两个运算数都是对象,那么比较的是它们的引用值。如果两个运算数指向同一对象,那么等号返回 true,否则两个运算数不等。
重要提示:即使两个数都是 NaN,等号仍然返回 false,因为根据规则,NaN 不等于 NaN。
obj1是一个对象,而obj2是一个结构与之完全不同的字符串,而如果用相等操作符来判断,则两者是完全相同的,因为obj1重载了顶层对象的toString()方法。
<scripttype="text/javascript">
alert(false == undefined); //false
alert(false == null); //false
alert(false == 0); //true
alert(false == ""); //true
alert(null == undefined); //true
alert('' == 0); //true
alert('0' == 0); //true
alert('' == '0'); //false
var obj1 = {id : "self",
toString : function(){
return "object 1";
}
}
var obj2 = "object 1";
alert(obj1 == obj2); //true
alert(obj1 === obj2); //false
</script>
alert('' == 0);alert('0' == 0); alert('' == '0'); 这几个的比较大家要好好思考了,哈哈
全等号和非全等号,这两个运算符所做的与等号和非等号相同,只是它们在检查相等性前,不执行类型转换。
全等号由三个等号表示(===),看好了是三个等号,只有在无需类型转换运算数就相等的情况下,才返回 true。
<scripttype="text/javascript">
alert(false === undefined); //true
alert(false === null); //false
alert(false === 0); // false
alert(false === ""); // false
alert(null === undefined); // false
alert('' === 0); // false
alert('0' === 0); // false
alert('' === '0'); //false
</script>
alert(false === undefined); 返回为true,大家可以想想为什么,留个思考题吧
相关推荐
理解javascript中undefined和null的区别
javascript 中null和undefined区分和比较 Undefined类型 Undefined 类型只有一个值,即特殊 undefined 。在使用 var 声明变量但未对其加以初始化时,这个变量的值就是 undefined , 例如: var message; alert(...
在JavaScript中存在这样两种原始类型:Null与Undefined。这两种类型常常会使JavaScript的开发人员产生疑惑,在什么时候是Null,什么时候又是Undefined? Undefined类型只有一个值,即undefined。当声明的变量还未被...
一时间不好回答,特别是undefined,因为这涉及到undefined的实现... null 参与数值运算时其值会自动转换为 0 ,因此,下列表达式计算后会得到正确的数值: 表达式:123 + null 结果值:123 表达式:123 * null 结果
JavaScript null undefined分析
JavaScript中undefined和null的区别 JavaScript两个表示”无”的值:undefined和null。我在平时只是null用的多一点,undefined只是在报错中经常遇到。下面针对这两个数据类型的异同做一下详细的比较。 1.undefined和...
根据C语言的传统,null被设计成可以自动转为0 但是,JavaScript的设计者Brendan Eich,觉得这样做还不够,有两个原因。首先,null像在Java里一样,被当成一个对象。但是,JavaScript的值分成
主要介绍了在javascript中,null>=0 为真,null==0却为假,null的值详解的相关资料,需要的朋友可以参考下
生活中我们在不停的编写代码,写着JavaScript,很少有时间进行概念上的研究。我呢,今天闲来没啥事,研究...在进行null>=0比较时,它是通过比较null<0 u5f97到的答案,如果a=b u4e3afalse,如果a=b>0为true。所以 null
有点奇怪的是,JavaScript语言居然有两个表示”无”的值:undefined和null。这是为什么? 一、相似性 在JavaScript中,将一个变量赋值为undefined或null,老实说,几乎没区别。 var a = undefined; var a = null; ...
之前软件开发网发不过类似的文章JavaScript null和undefined区别分析JavaScript Undefined,Null类型和NaN值区别先说说undefined: Javascript中的变量是弱类型的(关于这个我想就不用我多解释啦), 所以声明变量的...
有点奇怪的是,JavaScript语言居然有两个表示”无”的值:undefined和null。这是为什么? 一、相似性在JavaScript中,将一个变量赋值为undefined或null,老实说,几乎没区别。 代码如下:var a = undefined;var a = ...
evel函数可以接受一个字符串作为参数,并把此字符串当做一段javascript代码去执行,如果字符串执行结果是一个值则返回此值,否则返回undefined。如果参数不是一个字符串,则直接返回该参数 40.数组的join方法和字符...
JavaScript应用实例-http超时返回null.js
Javascript类型系统之undefined和null浅析_.docx
80、原生JavaScript判断字符是否空NULL 81、原生JavaScript用正则表达式提取页面代码中所有网址 82、原生JavaScript用正则表达式清除相同的数组(低效率) 83、原生JavaScript用正则表达式清除相同的数组(高效率) 84、...
代码如下: function dealNull(obj){ for(var i in obj){ if(null == obj[i] || ‘null’ == obj[i]){ obj[i]=”; }else if(‘object’ == typeof obj[i]){ dealNull(obj[i]); } } }; // 测试的对象 var a={}; a.aa=...
Javascript中的false、0、null、undefined和空字符串对象[归类].pdf