JavaScript之undefined与null的区别(详解)

大多数计算机语言,有且仅有一个表示”无”的值,比如,c语言的null,java语言的null,python语言的none,ruby语言的nil。有点奇怪的是,javascript语言居然有两个表示”无”的值:undefined和null。这是为什么?

JavaScript之undefined与null的区别(详解)

一、相似性

在JavaScript中,将一个变量赋值为undefined或null,老实说,几乎没区别。

var a = undefined;var a = null;

登录后复制

上面代码中,a变量分别被赋值为undefined和null,这两种写法几乎等价。

undefined和null在if语句中,都会被自动转为false,相等运算符甚至直接报告两者相等。

立即学习“Java免费学习笔记(深入)”;

if (!undefined)     console.log('undefined is false');// undefined is falseif (!null)     console.log('null is false');// null is falseundefined == null// true

登录后复制

上面代码说明,两者的行为是何等相似!

既然undefined和null的含义与用法都差不多,为什么要同时设置两个这样的值,这不是无端增加JavaScript的复杂度,令初学者困扰吗?Google公司开发的JavaScript语言的替代品Dart语言,就明确规定只有null,没有undefined!

二、历史原因

最近,我在读新书《Speaking JavaScript》时,意外发现了这个问题的答案!

原来,这与JavaScript的历史有关。1995年JavaScript诞生时,最初像Java一样,只设置了null作为表示”无”的值。

根据C语言的传统,null被设计成可以自动转为0。

Number(null)// 05 + null// 5

登录后复制

但是,JavaScript的设计者Brendan Eich,觉得这样做还不够,有两个原因。

首先,null像在Java里一样,被当成一个对象。但是,JavaScript的数据类型分成原始类型(primitive)和合成类型(complex)两大类,Brendan Eich觉得表示”无”的值最好不是对象。

其次,JavaScript的最初版本没有包括错误处理机制,发生数据类型不匹配时,往往是自动转换类型或者默默地失败。Brendan Eich觉得,如果null自动转为0,很不容易发现错误。

因此,Brendan Eich又设计了一个undefined。

三、最初设计

JavaScript的最初版本是这样区分的:null是一个表示”无”的对象,转为数值时为0;undefined是一个表示”无”的原始值,转为数值时为NaN。

Number(undefined)// NaN5 + undefined// NaN

登录后复制

四、目前的用法

但是,上面这样的区分,在实践中很快就被证明不可行。目前,null和undefined基本是同义的,只有一些细微的差别。

null表示”没有对象”,即该处不应该有值。典型用法是:

(1) 作为函数的参数,表示该函数的参数不是对象。

(2) 作为对象原型链的终点。

Object.getPrototypeOf(Object.prototype)// null

登录后复制

undefined表示”缺少值”,就是此处应该有一个值,但是还没有定义。典型用法是:

(1)变量被声明了,但没有赋值时,就等于undefined。

(2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。

(3)对象没有赋值的属性,该属性的值为undefined。

(4)函数没有返回值时,默认返回undefined。

var i;i // undefinedfunction f(x){console.log(x)}f() // undefinedvar  o = new Object();o.p // undefinedvar x = f();x // undefined

登录后复制

(完)

推荐学习: JavaScript教程 

以上就是JavaScript之undefined与null的区别(详解)的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2729791.html

(0)
上一篇 2025年3月8日 00:09:56
下一篇 2025年3月8日 00:10:06

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 深入理解JavaScript中的变量、范围和提升

    变量是许多编程语言的基本组成部分,也是新手需要学习的第一个也是最重要的概念。javascript中有许多不同的变量属性,以及命名变量时必须遵循的一些规则。在javascript中,有三个关键字用于声明变量——var、let和const——每…

    2025年3月8日
    200
  • 浅谈JavaScript变量的作用域及闭包

    与闭包有关的概念:变量的作用域和变量的生存周期。下面本篇文章就来给大家介绍一下javascript中变量的作用域及闭包,有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 一、变量的作用域 1、变量的作用域指变量有效的范围,与…

    2025年3月8日
    200
  • 深入了解JavaScript中的语法和代码结构

    所有编程语言都必须遵守特定的规则才能运行。 确定编程语言的正确结构的这组规则称为语法。 许多编程语言主要由具有语法变化的类似概念组成。 在本教程中,我们将介绍JavaScript语法和代码结构的许多规则和约定。【相关课程推荐:JavaScr…

    2025年3月8日
    200
  • 深入学习es6作用域

    最近重新学习了es6的知识。根据视频和一些资料做出自己理解中的一些笔记,希望能帮到大家。 作用域? 几乎所有的编程语言的最基础模型之一就是在变量中储存值,并且取出修改这些的值的能力,事实上,在变量中存储值和取出值的能力,给程序赋予了状态。如…

    2025年3月8日
    200
  • 5种正确处理JS的this指向的方式

    我喜欢在JS中更改函数执行上下文的指向,也称为 this 指向。 例如,咱们可以在类数组对象上使用数组方法: const reduce = Array.prototype.reduce;function sumArgs() {  retur…

    2025年3月8日
    200
  • 50个JavaScript面试和解答(收藏)

    问题1:Java和JavaScript有什么不同 JavaJavaScript Java是一种OOP编程语言。JavaScript是一种OOP脚本语言。它创建在虚拟机或浏览器中运行的应用程序。代码在浏览器或node环境上运行。需要编译Jav…

    2025年3月8日 编程技术
    200
  • Window对象在前端领域的角色

    特殊的window 提起window,在网页当中很常见,比如像这样: window.onload=function(){//执行函数体} 登录后复制 这段代码的意思是当网页内容加载完成后要做什么。 在js的领域,window对象有着双重角色…

    2025年3月8日
    200
  • 详解JavaScript中Switch语句的用法

    除了if … else之外,javascript还有一个称为switch语句的功能。 switch是一种条件语句,它将针对多种可能的情况评估表达式,并根据匹配的情况执行一个或多个代码块。 switch语句与包含许多其他if块的条…

    2025年3月8日
    200
  • 4个开发React应用的实用技巧

    【相关专题推荐:react面试题(2020)】 背景 Hooks 自推出以来就很火, 它改变了我们编写React 代码的方式, 有助于我们写更简洁的代码。 今天这边文章不是说Hooks的,Hooks之外, 还有很多实用的技巧可以帮助我们编写…

    2025年3月8日
    200
  • 深入了解JavaScript中的原型和继承

    本文主要讲了原型如何在JavaScript中工作,以及如何通过[Prototype]所有对象共享的隐藏属性链接对象属性和方法;以及如何创建自定义构造函数以及原型继承如何工作以传递属性和方法值。 介绍 javascript是一种基于原型的语言…

    2025年3月8日
    200

发表回复

登录后才能评论