JS基础之undefined与null的区别分析

 更新时间:2011年08月08日 19:39:50   作者:  
在JavaScript开发中,被人问到:null与undefined到底有啥区别?一时间不好回答,特别是undefined,因为这涉及到undefined的实现原理。
于是,细想之后,写下本文,请各位大侠拍砖。
总所周知:
null == undefined
但是:
null !== undefined
那么这两者到底有啥区别呢?
null
这是一个对象,但是为空。因为是对象,所以 typeof null 返回 'object' 。
null 是 JavaScript 保留关键字。
null 参与数值运算时其值会自动转换为 0 ,因此,下列表达式计算后会得到正确的数值:
表达式:123 + null结果值:123
表达式:123 * null结果值:0
undefined
undefined是全局对象(window)的一个特殊属性,其值是未定义的。但 typeof undefined 返回 'undefined' 。
虽然undefined是有特殊含义的,但它确实是一个属性,而且是全局对象(window)的属性。请看下面的代码:
复制代码 代码如下:

alert('undefined' in window); //输出:true
var anObj = {};
alert('undefined' in anObj); //输出:false

从中可以看出,undefined是window对象的一个属性,但却不是anObj对象的一个属性。
注意:尽管undefined是有特殊含义的属性,但却不是JavaScript的保留关键字。
undefined参与任何数值计算时,其结果一定是NaN。
随便说一下,NaN是全局对象(window)的另一个特殊属性,Infinity也是。这些特殊属性都不是JavaScript的保留关键字!
提高undefined性能
当我们在程序中使用undefined值时,实际上使用的是window对象的undefined属性。
同样,当我们定义一个变量但未赋予其初始值,例如:

var aValue;
这时,JavaScript在所谓的预编译时会将其初始值设置为对window.undefined属性的引用,
于是,当我们将一个变量或值与undefined比较时,实际上是与window对象的undefined属性比较。这个比较过程中,JavaScript会搜索window对象名叫‘undefined'的属性,然后再比较两个操作数的引用指针是否相同。
由于window对象的属性值是非常多的,在每一次与undefined的比较中,搜索window对象的undefined属性都会花费时 间。在需要频繁与undefined进行比较的函数中,这可能会是一个性能问题点。因此,在这种情况下,我们可以自行定义一个局部的undefined变 量,来加快对undefined的比较速度。例如:
复制代码 代码如下:

function anyFunc()
{
var undefined; //自定义局部undefined变量
if(x == undefined) //作用域上的引用比较
while(y != undefined) //作用域上的引用比较
};

其中,定义undefined局部变量时,其初始值会是对window.undefined属性值的引用。新定义的局部undefined变 量存在与该函数的作用域上。在随后的比较操作中,JavaScript代码的书写方式没有任何的改变,但比较速度却很快。因为作用域上的变量数量会远远少 于window对象的属性,搜索变量的速度会极大提高。
这就是许多前端JS框架为什么常常要自己定义一个局部undefined变量的原因!
希望通过本文的介绍,能给你带来帮助。

相关文章

  • 前端实现图片裁剪并上传的完整流程

    前端实现图片裁剪并上传的完整流程

    在前端开发中,图片上传是非常常见的功能,尤其是在用户头像设置、商品图上传等场景中,我们往往还需要在上传前提供裁剪功能,在此博主将详细讲解如何在前端实现一个“图片裁剪上传”的完整流程,需要的朋友可以参考下
    2025-05-05
  • javascript 复杂的嵌套环境中输出单引号和双引号

    javascript 复杂的嵌套环境中输出单引号和双引号

    如果简单的嵌套一般都是外面用双引号,则里面用单引号,反之亦同,如果特别负责的嵌套大家看下如下的方法。
    2009-05-05
  • js实现图片切换(动画版)

    js实现图片切换(动画版)

    本文主要对javascript实现图片切换(动画版)的方法进行步骤分析、实例介绍,具有很好的参考价值,需要的朋友一起来看下吧
    2016-12-12
  • js实现的八点拖动修改div大小的代码

    js实现的八点拖动修改div大小的代码

    八点改变div大小的实现代码,代码相对来说并不多,需要的朋友可以参考下。
    2010-02-02
  • JavaScript中this详解

    JavaScript中this详解

    都说 JavaScript 是一种很灵活的语言,这其实也可以说它是一个混乱的语言。它把函数式编程和面向对象编程糅合一起,再加上动态语言特性,简直强大无比,下面小编给大家介绍Javascript中this详解,需要的小伙伴可以来参考下
    2015-09-09
  • JS数组去重(4种方法)

    JS数组去重(4种方法)

    本文主要介绍了JS数组去重的4种方法。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • js对象数组根据对象属性删除对象

    js对象数组根据对象属性删除对象

    这篇文章主要介绍了js对象数组根据对象属性删除对象,需要的朋友可以参考下
    2023-07-07
  • 如何使用headjs来管理和异步加载js

    如何使用headjs来管理和异步加载js

    本文主要介绍如何使用headjs来管理和异步加载js,提高页面的加载速度,需要的朋友可以参考下
    2016-11-11
  • 利用JS解决ie6不支持max-width,max-height问题的方法

    利用JS解决ie6不支持max-width,max-height问题的方法

    本篇文章主要介绍了利用JS解决ie6不支持max-width,max-height问题的方法。需要的朋友可以过来参考下,希望对大家有所帮助
    2014-01-01
  • template.js前端模板引擎使用详解

    template.js前端模板引擎使用详解

    本篇文章主要介绍了template.js前端模板引擎使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10

最新评论