zoukankan      html  css  js  c++  java
  • 程序员是这样区分Null和Undefined

    Null类型

    Null类型是第二个只有一个值的数据类型,这个特殊的值是null。从逻辑角度来看,null值表示一个空对象指针,而这也正是使用typeof操作符检测null值时会返回"object"的原因,如下面的例子所示:

    var car = null;

    alert(typeof car);    // "object"

    如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为 null 而不是其他值。这样一来,只要直接检查null值就可以知道相应的变量是否已经保存了一个对象的引用,如下面的例子所示:

    if (car != null){

    // 对car对象执行某些操作

    }

    实际上,undefined值是派生自null值的,因此ECMA-262规定对它们的相等性测试要返回true:

    alert(null == undefined);    //true

    这里,位于null和undefined之间的相等操作符(==)总是返回true,不过要注意的是,这个操作符出于比较的目的会转换其操作数,尽管null和undefined有这样的关系,但它们的用途完全不同。如前所述,无论在什么情况下都没有必要把一个变量的值显式地设置为undefined,可是同样的规则对null却不适用。换句话说,只要意在保存对象的变量还没有真正保存对象,就应该明确地让该变量保存null值。这样做不仅可以体现null作为空对象指针的惯例,而且也有助于进一步区分null和undefined。

    Undefined类型

    Undefined类型只有一个值,即特殊undefined。在使用var声明变量但未对其加以初始化时,这个变量的值就是undefined,例如:

    var message;

    alert(message == undefined); //true

    这个例子只声明了变量message,但未对其进行初始化。比较这个变量与undefined字面量,结果表明它们是相等的。这个例子与下面的例子是等价的:

    var message = undefined;

    alert(message == undefined); //true

    这个例子使用undefined值显式初始化了变量message。但我们没有必要这么做,因为未经初始化的值默认就会取得undefined值。

    一般而言,不存在需要显式地把一个变量设置为undefined值的情况。字面值undefined的主要目的是用于比较,而ECMA-262第3版之前的版本中并没有规定这个值。第3版引入这个值是为了正式区分空对象指针与未经初始化的变量。

    不过,包含undefined值的变量与尚未定义的变量还是不一样的。看看下面这个例子:

    var message; // 这个变量声明之后默认取得了undefined值

    // 下面这个变量并没有声明

    // var age

    alert(message);    // "undefined"

    alert(age);    // 产生错误

    运行以上代码,第一个警告框会显示变量message的值,即"undefined"。而第二个警告框——由于传递给alert()函数的是尚未声明的变量age——则会导致一个错误。对于尚未声明过的变量,只能执行一项操作,即使用typeof操作符检测其数据类型(对未经声明的变量调用delete不会导致错误,但这样做没什么实际意义,而且在严格模式下确实会导致错误)。

    然而,令人困惑的是:对未初始化的变量执行typeof  操作符会返回  undefined  值,而对未声明的变量执行typeof操作符同样也会返回undefined值。来看下面的例子:

    var message; // 这个变量声明之后默认取得了undefined值

    // 下面这个变量并没有声明

    // var age

    alert(typeof message);    // "undefined"

    alert(typeof age);    // "undefined"

    结果表明,对未初始化和未声明的变量执行typeof操作符都返回了undefined值;这个结果有 其逻辑上的合理性。因为虽然这两种变量从技术角度看有本质区别,但实际上无论对哪种变量也不可能执行真正的操作。

    提示:

    即便未初始化的变量会自动被赋予undefined值,但显式地初始化变量依然是明智的选择。如果能够做到这一点,那么当typeof操作符返回"undefined"值时,我们就知道被检测的变量还没有被声明,而不是尚未初始化。

    本文由web前端精髓为您提供(喜欢我的文章可以扫一扫图中二维码关注我!)

  • 相关阅读:
    【UVA116】 单向TSP Unidirectional TSP [动态规划]
    【luogu4408】 [NOI2003]逃学的小孩 [动态规划 树的直径]
    【POJ2631】树的直径 [动态规划 树形dp]
    【luogu 1156】 垃圾陷阱 [动态规划 背包]
    【luogu1472】 奶牛家谱 Cow Pedigrees [动态规划]
    【luogu2747】 [USACO5.4]周游加拿大Canada Tour[动态规划]
    【luogu2737】 [USACO4.1]麦香牛块Beef McNuggets [动态规划 完全背包][数学 扩展欧几里德]
    【luogu3856】【TJOI2008】公共子串 [动态规划]
    【luogu1020】 导弹拦截 [动态规划LIS]
    【luogu1439】 【模板】最长公共子序列 [动态规划][LIS最长上升子序列][离散化]
  • 原文地址:https://www.cnblogs.com/wuxianqiang/p/6637263.html
Copyright © 2011-2022 走看看