在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变量的原因!
分享到:
相关推荐
"3Dbody手机APP在神经系统解剖教学中的应用" 该研究旨在探讨3Dbody手机APP在神经系统解剖教学...3Dbody手机APP在神经系统解剖教学中的应用具有重要的教学意义和推广价值,对提高教学质量和学生学习效率具有重要影响。
1. **基础语法**:JavaScript的基础包括变量、数据类型(如字符串、数字、布尔、null、undefined、对象和数组)、操作符(算术、比较、逻辑、赋值)、流程控制(条件语句、循环)以及函数的使用。 2. **函数与作用...
接下来,在图Ⅷ-2中,我们可以看到大鼠和小鼠的整体骨骼左前面观,展示了骨骼系统的左前面观,包括肋骨、胸椎、颈椎、肩胛骨、肱骨、桡骨、尺骨、掌骨、指骨、腰椎、髂骨、尾骨、股骨、髌骨、腓骨、胫骨、跖骨和趾骨...
"基于VRML JavaScript的交互式《人体解 剖学》3D虚拟实验室的构建及应用" ...本文介绍了基于VRML JavaScript的交互式《人体解剖学》3D虚拟实验室的构建及应用,旨在提高学生的学习兴趣和学习效率,推动教学改革。
《C语言深度解剖》是两本专注于C语言学习与进阶的重要著作,第一版和第二版的结合为读者提供了全面而深入的C语言知识体系。这个压缩包包含的资源,"C语言总结",是对C语言基础知识的精炼概述,涵盖了C语言的关键概念...
系统解剖学是医学领域中的一门基础学科,主要研究人体的结构组成和各器官之间的关系。在给定的文件内容中,涉及了众多解剖学术语和解剖结构的特点,以下是根据文件内容提炼的知识点: 标准解剖学姿势:解剖学研究中...
人体解剖学是医学专业的重要基础课程之一,涉及人体骨骼、关节、肌肉、内脏器官等的结构和位置。解剖学习题集作为学习和复习的材料,对于学生掌握和巩固解剖学知识至关重要。本题集涵盖了人体骨学的基本知识点,通过...
人体解剖学主要分为两个方面:大体解剖学和显微解剖学。大体解剖学关注的是肉眼可见的结构,如骨骼、肌肉、器官等,而显微解剖学则通过显微镜观察细胞和组织的细微结构。此外,根据研究目的的不同,还可以细分为系统...
在医疗和健康领域,3D人体解剖图是一种先进的学习和研究工具,它利用三维技术将人体结构以直观、立体的方式展现出来。这种技术对于医学生、医生、物理治疗师以及其他健康专业人士来说,是非常有价值的资源,能帮助...
在描述中提到的“比较简单,透视三维效果”,意味着这个解剖动画可能采用了基础的3D建模技术,能够提供基本的视角变换和透视效果。这种简化版的三维模型通常包含关键的人体器官和系统,如骨骼、肌肉、神经系统、血液...
根据提供的文件信息,这里将基于“最全,最经典的人体解剖图”这一主题进行展开,探讨人体解剖学中的关键知识点。 ### 一、人体解剖学概述 人体解剖学是研究人体结构的一门学科,它帮助我们了解身体各部位的位置、...
在CG(Computer Graphics,计算机图形学)领域,MediView是一款极具价值的工具,专为学习和理解人体解剖学设计。这款软件利用先进的三维技术和360度观看功能,提供了一个直观、立体的观察平台,使用户能够从各个角度...
目的:本研究旨在描述喉上神经外分支的解剖变化,并估计甲状腺手术中处于危险中的神经的频率。 方法:我们于2016年9月于2018年5月31日在马里巴马科的医学和牙医学口腔解剖学实验室实现了一项前瞻性研究。 所有未接受...
《C语言深度解剖》是一本专为C语言学习者和开发者设计的深入解析书籍,旨在帮助读者全面理解和掌握C语言的核心概念和技术。C语言,作为一种基础且强大的编程语言,被广泛应用于系统开发、嵌入式系统、软件工程等多个...
局部解剖学是医学专业的一门重要学科,主要研究人体局部区域的解剖结构和相互关系。根据提供的内容,我们可以了解到山东大学《局部解剖学》期末复习资料中的一些详细知识点。 一、头部结构 在头部局部解剖学中,...
《医疗纠纷死亡案例中尸体解剖工作规范化探索》这篇文献主要探讨了在医疗纠纷中尸体解剖的重要性和规范化问题。尸体解剖对于确定诊断、查明死因、提高医疗水平、研究疾病以及教学等方面具有重大意义,特别是在医疗...
《临床解剖学》是医学领域的一门...这些复习资料中的知识点是临床解剖学的重点,也是医生在实习和临床工作中需要掌握的基础知识。通过对这些内容的深入学习,学生可以更好地理解和应用解剖学理论,提高临床实践能力。
从这些信息中,我们可以推断出文件应该是关于人体解剖学的图谱,涉及到的主要系统包括消化系统、呼吸系统和循环系统,并且在文档中会有序号标示以区分不同的解剖结构或部分。 在继续深入讨论这些系统前,需要了解的...