阅读 119

js的undefined和null的区别(一)

每次遇到这个标题脑子都是空白的,然后就各种百度各种在本子上记笔记。过段时间再看到类似的问题脑子依旧是空白的,记得笔记也当废纸扔了。今天再又重新当做新的知识点学习一遍(年纪大了脑子不记事~)

undefined来自哪里?

还记得ECMAScript中的数据类型里的简单数据类型:Undefined,NUll,String,Number,Boolean,Symbol。 undefinedUndefined的唯一值(默认值)。

什么情况下会得到undefined?

以下情况:

  1. 声明了一个变量,但未对其初始化时,这个变量的值就是undefined;
  2. 未定义的变量执行typeof操作符也会返回undefined;
  3. 函数如果没有使用return语句指定返回值;
  4. 调用函数时没有传参数值
    var str;
    console.log(str)  //undefined
    console.log(typeof str)  //undefined
    
    //number未定义
    console.log(typeof number)  //undefined
复制代码

全局属性undefined

可以试一试我们可以显示地把一个变量初始化为undefined。但是一般而言,我们不会这样做,因为对未经初始化的值默认就会取得undefined值。况且字面量值undefined的主要目的是用于比较来区分空对象指针的。

let str = undefined 实际上是let str=window.undefined`给变赋值为undefined,其实这并不是一个值,而是一个属性名---undefined是全局对象的一个属性。因此就相当于:把一个变量window.undefined的值赋值给另外一个变量str,这个值就是原始值undefined。

局部属性undefined

其实在ESMAScript中,undefined不是保留字,这就意味着我们可以将undefined作为一个局部变量来使用,就像局部作用域中其他任何普通变量一样,没有任何特殊性,还可以对他赋予任何类型的值。

(function() {
    var undefined = 'not is undefined';
    console.log(undefined); //"not is undefined"
    console.log(typeof undefined) // "string"
})()
复制代码

可是undefined的值和类型都已经发生改变,这样会使我们的代码难以维护和排错。

如何判断undefined?

  1. 使用严格相等符(===)或者不相等操作符(!==)来决定一个变量是否拥有值。

    不推荐使用标准相等符

  2. 适应typeof操作符,对未定义的变量检测时只能使用这种方式,不然会报错。

(function() {
    var undefined = 'not is undefined';
    let data;
    if(data === undefined){
      console.log('data为undefined')
    }else{
      console.log('data不为undefined')
    }
})()
复制代码

想一想输出结果是什么?

undefined作为局部变量使用是可以被重写,但是如果我们依旧使用上面的方法去判断data是否为undefined是有风险的。

void运算符

image.png 想要准确的判断data是否为undefined,就需要找到原始值undefined:

(function() {
    var undefined = 'not is undefined';
    console.log(undefined); //"not is undefined"
    console.log(typeof undefined) // "string"
    let data;
    if(data === void 0){
      console.log('data为undefined')
    }else{
      console.log('data不为undefined')
    }
})()
复制代码
(function() {
    var undefined = 'not is undefined';
    console.log(undefined); //"not is undefined"
    console.log(typeof undefined) // "string"
    let data;
    if(data === window.undefined){
      console.log('data为undefined')
    }else{
      console.log('data不为undefined')
    }
})()
复制代码

总结一下:

  1. undefined是简单数据类型Undefined的默认值。
  2. 如果变量未初始化,或者typyof未定义的变量,都会得到undefined。
  3. 可以使用严格相等于和不相等操作符来判断当前变量是否为undefined;对未定义的变量使用typeof来检测;当把undefined当做局部变量来重写时,判断变量是否为undefined的时候可以使用vido 0或者window.undefined;

这篇笔记来源于:cavszhouyou.top/JavaScript%…

下班时间到,摸鱼到此结束。下一篇写null~~~

文章分类
前端
文章标签