理解Javascript_02_理解undefined和null

来自普遍的回答:

其实在 ECMAScript 的原始类型中,是有Undefined 和 Null 类型的。 这两种类型都分别对应了属于自己的唯一专用值,即undefined 和 null。
值 undefined 实际上是从值 null 派生来的,因此 ECMAScript 把它们定义为相等的,通过下列代码可以验证这一结论:
alert(undefined == null); //true


尽管这两个值相等,但它们的含义不同。

undefined 是声明了变量但未对其初始化时赋予该变量的值,null 则用于表示尚未存在的对象。如果函数或方法要返回的是对象,那么找不到该对象时,返回的通常是 null。

所以alert(undefined===null);//false

 

说实话,我没有看明白,为什么undefined会继承null,即然是继承那为什么undefined!==null,还有未初始化的变量与函数返回的对象不存在之间有什么区别,问题种种,让人很不信服。

 

看看内存是怎么说的:

Udefined代表没有赋值的基本数据类型。

Null代表没有赋值的引用数据类型。

我们来看一段代码:

var age; 
var id = 100;
var div02 = document.getElementById("div02");//注:div02是不存在的
var div01 = document.getElementById("div01");//注:div01存在
alert(id);//100
alert(age);//undefined
alert(div02);//null
alert(div01);//object

再来看一下内存的情况:

解决第一个问题:为什么undefine继承自null

在Javascript中,基本数据类型都有一个与其对应的引用数据类型,number Number,string String,boolean Boolean...,他们具有完全相同的行为,并且相互之间会产生自动拆箱与装箱的操作。在内存分析一文中已经讲述了基本数据类型放在栈内存中的意义,由此这们可以得出一个肤浅的结论:基本数据类型是对应引用数据类型的子类,只不过是为了提高效率,将其放在栈内存中而已,对应的Undefined代表无值的基本类型,Null代表无值的引用类型,那势必就可以推出undefined继承null。

解决第二个问题:为什么undefined==null

 推出来的答案undefined继承自null,内存告诉我们的答案他们都处于栈中

解决第三个问题:为什么undefined!==null

内存告诉我们,它们的意义确实是不一样的,老话一句:Udefined代表没有赋值的基本数据类型,Null代表没有赋值的引用数据类型。他们的内存图有很大的区别

解决额外的问题:null是处理引用的,为什么null处在栈内存中,而不是堆内存中

答案一样的简单,效率!有必要在栈中分配一块额外的内存去指向堆中的null吗!

额外的收获:

当我们要切断与对象的联系,但又并不想给变量赋于其他的值,那么我们可了置null,如var obj = new Object();obj=null;

 

一些关于undefined和null的行为

 null 参与数值运算时其值会自动转换为 0 ,因此,下列表达式计算后会得到正确的数值:

表达式:123 + null    结果值:123

typeof null 返回object,因为null代表是无值的引用。

 

undefined是全局对象(window)的一个特殊属性,其值为Undefined类型的专用值undefined

undefined参与任何数值计算时,其结果一定是NaN。

 当声明的变量未初始化时,该变量的默认值是undefined,但是undefined并不同于未定义的值。Typeof运算符无法区分这两种值

因此对于变量是否存在的判断操作是通过if(typeof var == ‘undefined’){ //code here } 来进行判断的,这样既完全兼容未定义(undefined)未初始化(uninitialized)两种情况的

 

哈哈,当你站在内存的高度的分析问题的时候,如此抽象的东西有了实际的表现,一切变得简单起来!

 

-----------------------------更新 2010/11/01 --------------------------------------------

undefined与参数判断

我们行来看一个简单的函数:

function bool(val){if(typeof val == 'undefined'){return true;}return !!val;
}

这个函数有问题吗?有,因为typeof返回undefined值有两种可能,一种是传进来的就是undefined,还有一种是没有传值。

alert(bool(undefined));//true
alert(bool());//true
 

很明显,bool(undefined)返回了不是我们所期望的false.怎么解决这个问题呢?

function bool(val){if(arguments.length !==0){return !!val;}return true;	
}

我们通过arguments参数长度来判断是否传递了参数,从而区分函数传递的参数是undefined,还是根本不就没有传值! 


chyingp 

转载于:https://www.cnblogs.com/fool/archive/2010/10/07/1845253.html

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

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

相关文章

服务器虚拟多台linux,VirtualBox环境下基于多台Ubuntu虚拟机的Hadoop分布式计算环境搭建...

export PATH$HADOOP_HOME/bin:$PATH接下来需要修改hadoop/conf/目录下的配置文件,共有6个文件需要修改,分别是masters、slaves、core-site.xml、mapred-site.xml、hdfs-site.xml、hadoop-env.sh,修改如下文件mastersUB01文件slavesUB02UB03文…

程序员的培养

作者: RayChase 来源: ITeye 发布时间: 2012-05-22 09:01 阅读: 2335 次 原文链接 全屏阅读  [收藏] 这篇文字是我好久以来的想法,有一些感悟,有一些激烈的言辞,我很自豪我就是一名程序员,我希望给程序员或者前程序员们带来…

[html] 你最喜欢html的哪个标签?为什么?

[html] 你最喜欢html的哪个标签?为什么? div,因为此标签是用得最多的也是最强大的HTML标签,许多其它标签也是基于此标签而产生的。个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚持一…

linux普通用户发送信号,Linux信号发送与作业控制

前言Linux中进程间通信又称为IPC(Inter process communication),大致上可以分为这么几类:消息队列(message queue),旗语(semerpore),共享内存(shared memory),信号(signal),Unix域套接字,socket…

[html] 写一个三栏布局,中间固定,两边自适应(平均)

[html] 写一个三栏布局&#xff0c;中间固定&#xff0c;两边自适应&#xff08;平均&#xff09; <style>html,body {height: 100%;margin: 0;padding: 0;}.container {display: flex;flex-wrap: wrap;width: 100%;height: 100%;}.content {flex: 1;}.side,.right {wid…

《图解CSS3:核心技术与案例实战》

《图解CSS3&#xff1a;核心技术与案例实战》 基本信息 作者&#xff1a; 大漠 丛书名&#xff1a; Web开发技术丛书 出版社&#xff1a;机械工业出版社 ISBN&#xff1a;9787111469209 上架时间&#xff1a;2014-7-2 出版日期&#xff1a;2014 年7月 开本&#xff1a;16开 …

对页面文章过长的处理方法

当在 一个页面显示一个文章的内容时&#xff0c;如果文章太长&#xff0c;会造成页面无限高&#xff0c;样式很不好看&#xff0c;对此我有两种解决方法&#xff1a;一&#xff0c;将内容放在<div>标签中&#xff0c;然后设置标签的style&#xff0c;具体<div style&q…

kali linux重启网络服务报错,Web安全学习笔记之在Kali Linux上安装Openvas以及启动失败修复...

现在用的kali linux是2018.1的版本&#xff0c;在安装openvas的时候报错&#xff0c;无法通过网络下载和安装openvas。主要错误是源配置错误&#xff0c;可能现在用的kali很久没更新了。一、解决和配置更新源问题apt-get upgrade报错显示无法更新&#xff0c;apt-get install o…

This document is opened by another project error message

This is quite annoying error. Finally, Ive found the problem is caused by Visual SVN VS 2008, but no further solution or path to fix this problem by Visual SVN at the moment. So I have to kick it out of my HDD. :( 转载于:https://www.cnblogs.com/javafun/ar…

linux下解压 cpio.gz格式文件

我是在安装oracle10G时从官网找的压缩吧。我个人觉得第二个好。 第一种方法&#xff1a; zcat 10201_database_linux_x86_64.cpio.gz| cpio –idmv 第二种方法 &#xff1a;第一步&#xff1a; gunzip 10201_database_linux_x86_64.cpio.gz第二步&#xff1a; cpio -idmv <…

linux脚本语句,LINUX shell 脚本语句

LINUX中shell脚本中语句的基本用法一、if ...then...fiif [ 条件判断一 ] && (||) [ 条件判断二 ]; then <if 是起始&#xff0c;后面可以接若干个判断式&#xff0c;使用 && 或 || 执行判断elif [ 条件判断三 ] && (||) [ …

Rstudio调用plot()函数时,出现错误的处理方法

按照书上的例子敲出代码后&#xff0c;发现Rstudio无法识别C盘user文件夹下的中文用户名。如下图所示&#xff1a; 按照网上的做法&#xff0c;尝试修改计算机user下的用户名&#xff0c;没修改成功。 另一种做法是在plot()函数前面加上一句dev.new(),便可绘制成功&#xff0c;…

外挂的介绍 什么是外挂

一、 前言 所谓游戏外挂&#xff0c;其实是一种游戏外辅程序&#xff0c;它可以协助玩家自动产生游戏动作、修改游戏网络数据包以及修改游 戏内存数据等&#xff0c;以实现玩家用最少的时间和金钱去完成功力升级和过关斩将。虽然&#xff0c;现在对游戏外挂程序的“合法” 身份…

linux清理备份日志,服务器日志清理备份

"历史上的今天"有没有API接口的功能想添加一个历史上今天功能。人生就像一张有去无回的单程车票&#xff0c;没有彩排&#xff0c;每一场都是现场直播&#xff0c;把握好每次演出便是对人生最好的珍惜。?《历史上的今天》有没有API接口&#xff1f;这个可以参考 Lss…

人事面试的那些问题及背后的考察点

问题 请你自我介绍一下你自己&#xff1f; 你觉得你个性上最大的优点是什么&#xff1f; 说说你最大的缺点&#xff1f; 你对加班的看法&#xff1f; 你对薪资的要求&#xff1f; 在五年的时间内&#xff0c;你的职业规划&#xff1f; 你朋友对你的评价&#xff1f; 你还有什么…

[html] 你知道短链接的生成原理吗?

[html] 你知道短链接的生成原理吗&#xff1f; 目的将长度较长的链接压缩成较短的链接&#xff0c;并通过跳转的方式&#xff0c;将用户请求由短链接重定向到长链接上去1.二种方式生成短链hash-可能会重复发号器发号压缩 URL2.短链跳转方式301 - 用户第一次访问某个短链接后&a…

股神巴菲特揭示致富的十大秘籍[转]

1. Reinvest your profits. “Even a small sum can turn into great wealth,” Schroeder writes, if you’re disciplined to not touch your profits. Let the power of compound interest work for you。   1. 把你现有的财富做再投资。就像史诺德写到过的那样&#xff1…

linux火狐浏览器49.0安装教程,火狐浏览器Linux最新版下载

火狐浏览器是一款免费开源的跨平台浏览器&#xff0c;firefox for linux引入了扩展同步机制用户能够在家用电脑和办公电脑之间进行无缝同步&#xff0c;能给用户更为流畅和高速的上网浏览体验&#xff0c;同时也让开发者能够开发出更为快速的网络应用和网站&#xff0c;有需要的…

shell与其他语言不同点

1.定义变量时&#xff0c;变量名不加美元符号&#xff08;$&#xff0c;PHP语言中变量需要&#xff09;&#xff0c;如&#xff1a; your_name"w3cschool.cn" 注意&#xff0c;变量名和等号之间不能有空格&#xff0c;这可能和你熟悉的所有编程语言都不一样。同时&am…

jquery +做CheckBoxList全选,反选

以前我们做CheckBoxList全选&#xff0c;反选&#xff0c;一般用AspxCodeFile、或者用JavaScript 现在我们可以用JQuery来帮我Easy Choose. 这里我来写三种&#xff1a; 第一种 全选 $(".checkBoxSelect").each(function() { $(this).attr("ch…