我所明白的JavaScript中 undefined与null的区分

举个简朴的栗子:

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]
    原文作者:Fishing
    原文地址: https://segmentfault.com/a/1190000012972471
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞