举个简朴的栗子:
A和B两个人肚子都很饿,要去用饭。A已打电话到饭铺预定位置,B则盘算下班后考核下再做决议。关于饭铺来讲,A基本上就是他的客户了,只不过还没见到人来,定为null(毕竟生意业务还没发生),而对饭铺来讲,B是谁啊,他们基础没听到过这个人,为undefined
然则,观点照样念道念道的
从字面上明白:undefined 不明确的,不晓得的,比方var a;我们声清楚明了一个变量然则没有给定初始值,然则这个a代表着啥,boolean? string? number? object? function? 都有能够。而 var a = null;的话,则直接声清楚明了a是有的,然则它的值是空的,没有的,假如把他们同时跟一个数值相加减,也正诠释了为啥 3+null = 0 而 3+undefined获得的结果是NaN了。
这俩货是一堆好兄弟,雷同而又差别。我们都晓得JavaScript几个基本上数据范例:
Boolean、Null Undefined String Number Symbol(ES6新增),这俩货占有两席位置,重量云云重,不能不说,不能不注重起来他们啊。
Undefined 实在代表的是不存在的值,Null是字面量同时也是语言中的关键词,示意没法辨认的对象值。他们都没有属性和要领,也不能给其属性赋值。他们的布尔值都是false,说到布尔值为false的,一般包含 NaN 、 0、空字符串、Null 、Undefined 这五种罕见的对象。他们之间的关联,能够如许总结:
Null == 0 //false
Undefined == 0 //false
undefined == "" //false
null == "" //false
null == NaN //false
undefined == NaN //false
undefined == null //true
undefined === null //false
null 是一个特别的“对象”,相当于一个空对象的预期。而undefined就是“未定义”,没有。现实中越发引荐运用null,对他们实行typeof离别是
typeof undefined //undefined
typeof null //null
相似之处
两者是不可变的,都没有本身的属性和要领,假如你试图给他们增添要领或许属性,都邑发生范例毛病。各自都是孤苦伶仃,不必拖家带口的,一人吃饱全家不饿。都是“空”的东西
差别点
“范例”差别,undefined代表了一个意想不到的没有的值,null是预期没有值的代表,至于怎样辨别他们,下文有引见
何种情况下会发生undefined呢?
当声明一个变量的时刻,比方 var a; //undefined
接见不存在的对象的时刻 var obj = {a:1}; var c = obj.c; //undefined
当数组中的索引不存在的时刻 var arr = [1,2,3];arr[5]; //undefined
定义一个function,当没有返回值的时刻,返回的也是 undefined
何种情况下会发生null呢?
当你试图去猎取一个不存在的DOM的时刻会返回null
顺序猿本身return null
说了这么多,那末题目来了,怎样辨别一个变量究竟是null照样undefined呢?下面为人人供应一个要领以示辨别:
Object.prototype.toString.apply(null) // [object Null]
Object.prototype.toString.apply(undefined) // [object Undefined]
做一个延长(别问我为啥去做这个操纵,由于我是精神病)
假如我离别用一个Number String 离别跟 undefined null做加减运算,会发生什么操纵呢?
5 + null // 5
5 + undefined // NaN
"5" + null // "5null"
"5" + undefined // "5undefined"
"aa" + undefined // "aaundefined"
"aa" + null // "aanull"
"aa" * null // NaN
"aa" * undefined // NaN
题外话:
将我们须要推断范例的东西经由过程对象的原型toString转换为字符串,几乎就是神操纵,能够狠轻松的推断许多范例,比方
Object.prototype.toString.call({}) // [object Object]
Object.prototype.toString.call([]) // [object Array]
Object.prototype.toString.call(function d(){}) // [object Function]
Object.prototype.toString.call(123) // [object Number]
Object.prototype.toString.call("123") // [object String]
Object.prototype.toString.call(Symbol()) // [object Symbol]