js 中null,undefined区别

首先摘自阮一峰先生的文章:

      

大多数计算机语言,有且仅有一个表示"无"的值,比如,C语言的NULL,Java语言的null,Python语言的None,Ruby语言的nil。

有点奇怪的是,JavaScript语言居然有两个表示"无"的值:undefined和null。这是为什么?

undefined vs. null

一、相似性

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


var a = undefined;var a = null; 

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

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


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

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

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

二、历史原因

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

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

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


Number(null) // 0 5 + 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) // NaN 5 + 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() // undefined var o = new Object(); o.p // undefined var x = f(); x // undefined 

然后来看下JS中几个空值的类型:

      

 typeof(undefined) == 'undefined'typeof(null) == 'object'typeof("") == 'string'typeof(0) == 'number'typeof(false) == 'boolean'

    这五个值的共同点是,在if语句中做判断,都会执行false分支。当然从广义上来看,是说明这些数值都是其对应数据类型上的无效值或空值。还有这五个值作!运算,结果全为:true

 

最后来我们看下这五个值做字符串转换时的差异

 String(undefined) -> "undefined"String(null) -> "null"String("") -> ""String(0) -> "0"String(false) -> "false"

  

转载于:https://www.cnblogs.com/qyzy1024/p/4036661.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398909.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

六款值得推荐的Android开源框架简介

六款值得推荐的Android开源框架简介 技术不再多,知道一些常用的、不错的就够了。下面就是最近整理的“性价比”比较高的Android开源框架,应该是相对实用的。 1、volley 项目地址 https://github.com/smanikandan14/Volley-demo JSON,图像等的…

数据库杂谈(一)——数据库基本概念

文章目录1 数据库基本概念1.1数据库和数据库管理系统1.2 数据库系统和文件系统1.3 数据模型1.4 数据库三级模式和两级独立性1.4.1 三级模式1.4.2 二级映像功能1.4.3 数据独立性1.5 数据库发展历史及分类1.6 数据库系统的组成和生命周期1.6.1 三个概念1.6.2 生命周期1.6.3 存储管…

【转】Java删除文件夹和文件

原文网址:http://kxjhlele.iteye.com/blog/323657 以前在javaeye看到过关于Java操作文件的一篇文章,写的很好,但找了半天也没找到,就把找到底几篇文章整理一下,做个总结,算是一个学习备份…… 1&#xff0c…

数据库杂谈(二)——数据模型

2 数据模型 摘要:数据模型(Data Model)是数据特征的抽象,它从抽象层次上描述了系统的静态特征、动态行为和约束条件,为数据库系统的信息表示与操作提供一个抽象的框架。数据模型所描述的内容有三部分,分别是…

android编译系统apk文件,VS2012中MonoForAndroid打包编译APK文件详细图文教程

本文用于介绍Visual Studio 2012中Xamarin Mono For Android 如何打包编译APK文件,从如何创建Android项目,到如何启动调试,都会逐个配图讲解。1 新建项目2 选择安卓3 选择安卓程序4 随便取名和设置存放路径5 确定1 创建完一个新的项目2 点击“…

判断程序是否已经运行

近段时间,需要写一个小功能,就是需要判断程序是否已经运行。某个程序安装后,也许被多个用户运行。那怎样判断当前用户已经运行了此程序了呢?下面是Insus.NET的做法,就是:《VB.NET WinForm获取运行程序用户名…

浅谈缓存技术在ASP.NET中的运用

本篇文章虽不谈架构,但是Cache又是架构中不可或缺的部分,因此,在讲解Cache的同时,将会提及到部分架构知识,关于架构部分,读者可以不用理解,或者直接跳过, 你只需关心Cache即可&#…

Git快速入门+复习笔记

对于学习编程的同志来说,学习Git是必不可少的一项技术,如果你是第一次观看我的文章,欢迎关注我的频道,我会分享更多有趣的知识。 文章目录1 目标2 概述2.1 开发中的实际场景2.2 版本控制器的方式2.3 工作流程图3 Git安装和常用命令…

Android浏览器速度测试,Android平台浏览器网页加载速度对比评测

参与测试的浏览器手机上网已经渐渐成为人们的一种习惯,无论在等公交时、乘地铁时、吃饭等餐时,很多朋友都习惯掏出手机简单浏览一下微博、人人、新闻网站等页面。移动网络的确为我们带来了莫大的便利,但网速和稳定性却是移动网络的硬伤。针对…

操作系统随笔(一)

你好朋友,当你点进来这份读书笔记时,我相信你不是无意中点进来就是对这一部分饶有兴趣,可惜的是,我也只是个普通的大学生,有时候对知识的见解获取没有屏幕前的你那么有天赋,所以在阅读完这篇文章的同时点个…

codeforces 483B Friends and Presents 解题报告

题目链接:http://codeforces.com/problemset/problem/483/B 题目意思:有两个 friends,需要将 cnt1 个不能整除 x 的数分给第一个friend,cnt2 个不能整除 y 的数分给第二个friend。x 和 y 都是素数来的。要求求出最小的 v&#xff…

并行计算随笔(一)

如果觉得本篇文章对你有所启发,请给我点个赞好吗,这对我很重要,谢谢 文章目录1 并行计算基础1.1 什么是并行计算1.1.1 对计算速度的需求1.1.2 并行计算1.1.3 并行计算的基本条件1.1.4 平行计算和分布式计算1.2 为什么需要并行计算1.3 并行计算…

命令行的形式运行php

转自:http://www.cnblogs.com/myjavawork/articles/1869205.html 注意:在安装php时需要将php 的安装目录加到环境变量 PATH 中 (右击我的电脑->属性->高级->环境变量, 如果存在 PATH 则在原来的 PATH 中加入你的PHP安装目录, 如果不存在则新建一…

idea android 模块,IntelliJ IDEA 12 - 新的Android应用程序模块向导失败,“无法找到模块的资源目录”...

我面临的问题是一个非常简单的问题... 我无法使用IntelliJ IDEA 12来帮助我创建一个Android应用程序模块(项目)。IntelliJ IDEA 12 - 新的Android应用程序模块向导失败,“无法找到模块的资源目录”成功安装的IntelliJ IDEA 12和使IDE和二者的SDK(Java和Android设备)…

JQuery常用知识点汇总

2019独角兽企业重金招聘Python工程师标准>>> 0、JQuery的基本属性标识: $(".xxx"):标签的class属性; $("#xxx"):标签的id属性; $("xxx"): 标签名&#…

数据库杂谈(三)——关系代数

3 形式化关系查询语言 摘要:关系代数是一种抽象的查询语言,用对关系的运算来表达查询,作为研究关系数据语言的数学工具。在本文中,我们不仅谈论关系代数的知识点,而且还配备了对应的练习题。 文章目录3 形式化关系查询…

android native.js,Android Native与JS通信互调

写在最前:看Android最新技术总结,关注公众号:最近因为App与H5交互逻辑太乱,所以抽空梳理了下;对目前App与H5的各种交互通信做个总结,自取适合自己的交互方式。一、H5调用原生的native方法1、拦截shouldOver…

SharePoint2013 Excel导出好的代码

C#Excel操作类ExcelHelper.cs 来源:http://www.hellocsharp.com/article/67.aspx C#源码世界 发布于: 2014-09-12使用本类之前必须在本机安装了office excel组件或直接下载Microsoft.Office.Interop.Excel.dll文件引用到项目目录下: 然后复制…

基于PMOS的电源防反接电路

如下图所示,是来自TI的参考设计TIDA-00982中的一个电路,功能主要是防止输入反接,R6和C6形成吸收回路,可以对上电过冲有一定的抑制作用。电源正常接入时,PMOS导通,给负载供电,由于VDS的存在&…

计算机组成原理随笔(一)

1 计算机体系结构 计算机革命发展得非常快速,以至于使用老式计算机的很多电影现在看起来十分有年代感,有的电影甚至无法预料后来的计算机是什么样的。 计算机各个组成部分的技术发展非常不均衡,各部分性能差异非常大。在计算机的发展前期&a…