null == undefined ?

最近在看《JavaScript高级程序设计》一书,书中讲到相等操作符(==)时说,要比较相等性之前,不能将 null 和 undefined 转换成其他任何值,但要记住 null == undefined 会返回 true 。的确,在ECMAScipt规范中也是这样定义的,但我认为这样来理解这件事情,似乎有些浮于表面,网上也有很多关于这个问题的文章,下面我希望从一个全新的角度来分析 null 和 undefined ,从而理解两者为何会相等:

1、语义和场景不同

Undefined 和 Null 是 Javascript 中两种特殊的原始数据类型(Primary Type),它们都只有一个值,分别对应 undefined 和 null 。

undefined 的字面意思就是未定义的值,这个值希望表示一个变量最原始的状态,而非人为操作的结果, 这种原始状态会在以下两种场景中出现:

  • 声明了一个变量,但没有赋值,如 var foo;
  • 访问对象上不存在的属性,如果 Object.foo;
var foo;
console.log(foo); //undefined

访问foo,返回了undefined,表示这个变量自从声明了以后,就从来没有使用过,也没有定义过任何有效的值,即处于一种原始而不可用的状态。

console.log(Object.foo); // undefined

访问Object对象上的foo属性,同样也返回 undefined , 表示Object 上不存在或者没有定义名为 “foo” 的属性。

因此,undefined 值产生的来源一般不是人为赋值的,而是变量的原始状态,当然,你也可以手动给一个变量赋值 undefined,但这样做没有意义,因为一个变量不赋值就是 undefined 。

null 的字面意思是 空值 ,这个值希望表示 一个对象被人为的重置为空对象,而非一个变量最原始的状态, 在内存里的表示就是,栈中的变量没有指向堆中的内存对象,即:

当一个对象被赋值了null 以后,原来的对象在内存中就处于游离状态,GC 会择机回收该对象并释放内存。因此,如果需要释放某个对象,就将变量设置为null,即表示该对象已经被清空,目前无效状态。试想一下,如果此处把 null 换成 undefined 会不会感到别扭? 显然语义不通,其操作不能正确的表达人想要的行为。

与 null 相关的另外一个问题需要解释一下:

typeof null == ‘object‘

null 有属于自己的类型 Null,而不属于Object类型,typeof 之所以会判定为 Object 类型,是因为JavaScript 数据类型在底层都是以二进制的形式表示的,二进制的前三位为 0  会被 typeof 判断为 对象类型,而 null 的二进制位恰好都是 0 ,因此,null 被误以为是 Object 类型。

  • 000:对象,数据是对象的应用。
  • 1:整型,数据是31位带符号整数。
  • 010:双精度类型,数据是双精度数字。
  • 100:字符串,数据是字符串。
  • 110:布尔类型,数据是布尔值。

其实,我们可以通过另一种方法获取 null的真实类型:

Object.prototype.toString.call(null) ; // [object Null]

通过Object原型上的toString() 方法可以获取到JavaScript 中对象的真实数据类型,当然 undefined 类型也可以通过这种方式来获取:

Object.prototype.toString.call(undefined) ; // [object Undefined]

2、表示的内容相似

虽然 undefined 和 null 的语义和场景不同,但总而言之,它们都表示的是一个无效的值。 因此,在JS中对这类值访问属性时,都会得到异常的结果:

ECMAScript 规范认为,既然 null 和  undefined 的行为很相似,并且都表示 一个无效的值,那么它们所表示的内容也是相似的,即有

undefined == null; //true

不要试图通过转换数据类型来解释这个结论,因为:

Number(null); // 0
Number(undefined); // NaN

//在比较相等性之前,null 没有被转换为其他类型
null == 0 ; //false

但 === 会返回 false ,因为全等操作 === 在比较相等性的时候,不会主动转换分项的数据类型,而两者又不属于同一种类型:

undefined === null; //false,类型不相同
undefined !== null;  //true, 类型不相同

3、总结和应用

用一句话总结两者的区别就是,undefined 表示一个变量自然的、最原始的状态值,而 null 则表示一个变量被人为的设置为空对象,而不是原始状态。所以,在实际使用过程中,为了保证变量所代表的语义,不要对一个变量显式的赋值 undefined,当需要释放一个对象时,直接赋值为 null 即可。

原创发布 @一像素 2017.08

时间: 2024-08-06 03:47:07

null == undefined ?的相关文章

Is there a standard function to check for null, undefined, or blank variables in JavaScript?

You can just check if the variable has a truthy value or not. That means if( value ) { } will evaluate to true if value is not: null undefined NaN empty string ("") 0 false The above list represents all possible falsy values in ECMA-/Javascript.

JS_数据类型之null,undefined,date(),typeConvert..

今天学的东西主要还是数据类型方面--越学越感觉js这门语言,真的是amazing,very amazing的,总结下 1.先来比较下null与undefined: null:js关键字,表示一个对象,但是为空.因为是对象,typeof(null)返回object,在primitive类型context下使用时:number-->0,string-->"null",bool-->false undefined:不是js关键字,而是window对象的全局属性,(可以用wi

2016.8.01 "" null undefined NaN 0 特殊比较是true还是false

在javascript的世界里,无论是函数,还是数组,还是对象,亦或是字符串,数字,布尔类型,在这些数据类型中,总有这么几个特立独行,然后造成一些可有可无的讨厌bug. 而这些讨厌bug出现的原因就是由于比较时产生的错误,而且最不易查出错误. 在这里我们整理了这几个特殊数据类型的比较.直接上代码. 上代码前,普及一个知识: ==内容比较,数据类型不比较. ===内容比较,数据类型也比较. 上代码: ==比较代码: // "" null undefined NaN 0 console.l

JavaScript基础学习-- typeof,null,undefined

null 在 JavaScript 中 null 表示 "什么都没有". null是一个只有一个值的特殊类型.表示一个空对象引用. var person = {firstName:"John", lastName:"Doe", age:50, eyeColor:"blue"}; var person = null; document.getElementById("demo").innerHTML = ty

js null, undefined, NaN, ‘’, false, 0, ==, === 全验证

<html> <head> <meta charset="utf-8" /> </head> <body> <input type="text" id="input_test"/> <script> ? var test = function(a){ // NaN, undefined if(a != a){ alert('NaN / undefined'); }

Javascript 中的false,零值,null,undefined和空字符串对象

在Javascript中,我们经常会接触到题目中提到的这5个比较特别的对象--false.0.空字符串.null和undefined.这几个对象很容易用错,因此在使用时必须得小心. 类型检测 我们下来看看他们的类型分别是什么: <script type="text/javascript"> alert(typeof(false) === 'boolean'); alert(typeof(0) === 'number'); alert(typeof("")

js判断 nan null undefined的方法

收集资料如下判断: 1.判断undefined: 复制代码代码如下: <span style="font-size: small;">var tmp = undefined; if (typeof(tmp) == "undefined"){ alert("undefined"); }</span> 说明:typeof 返回的是字符串,有六种可能:"number"."string".&

js中 null, undefined, 0,空字符串,false,不全等比较

null == undefined // true null == ''  // false null == 0 // false null == false // false undefined == '' // false undefined == 0 // false undefined == false // false '' == 0   // true '' == false // true 0 == false // true undefined,null和 0, '', fals

对null,undefined取反的常见情况分析

1.对空数组判断 var aa=[]; if(aa){ //此时aa为真,所以继续执行 console.log(23423); } 2.对字面量声明的空对象判断 var bb = {}; if(bb){ //此时bb为真,继续执行 alert(234); } 3.对null对象判断 var cc=null; if(!cc){ // 此时cc为假,取反为真,继续执行 alert(34); } 4.对undefined判断 var dd = undefined; if(!dd){ // 此时dd为假