写出更好的JavaScript程序之undefined篇(中)_javascript技巧

写在前面的依然是消歧义声明:本文中JavaScript是指一般意义上的JavaScript,并不只限定“自称是JavaScript”的运行环境;“全局变量”和“全局对象的属性”是指同样的东西,只是因为要配合上下文才用了不同的说法,正文中我就不再另外解释了;“声明”指通过“var”语句声明变量和/或对函数及其签名的定义;“变量”指通过“var”语句声明过或者在函数体中试图访问的命名参数;“undefined”指名为“undefined”的值(全局或本地变量),而“未定义”指type(...) == “undefined”的概念值;“output”是向我们显示传入参数的函数,其实就是“alert”的同类。

首先介绍的是和void(0)具有异曲同工之妙的一种办法,我们知道在JavaScript中尝试访问任何一个“没有返回值”的函数的执行结果,都会得到“未定义”这个概念值,所以我们可以这样做:
myVar = function(){}();
这个方法的原理是创建一个空函数,并且获取其(根本不存在的)返回值。很明显,我们会得到“未定义”这个概念值,这个原理是和void(0)一样的。
需要特别注意的是,只有当function关键字不在语句之首的时候,才可以使用这种调用方式;如果需要直接调用一个匿名函数,应该这样做:

(function(){
// code here
})();
假如我们不想污染全局作用域,我们就可以用这种方式来创造一个闭包——很多现有的JavaScript库就是这样做的。
这种办法是在不了解void(0)的执行效果的情况下诞生的,既然我们知道void(0),也就不需要这种办法了。

第二种不常见的办法是访问window.undefined,就像下边这样:
output(myVar === window.undefined);
myVar = window.undefined;
这种办法的原理是:
如果JavaScript的运行环境预定义了undefined这一值,window.undefined就可以直接访问到;
如果没有预先定义undefined这一值,window.undefined就会返回“未定义”这一概念值——还是我们想要的东西。
访问形式从“全局变量”变成“属性”以后,脚本引擎就不会认为这是一个意外操作了,因此代码可以正确执行。

然而这种办法还是存在不足:
undefined在所有的JavaScript引擎中都不是保留字,也就是说它是可以被污染的,这会影响我们的程序的运行效果;
直接访问全局对象的属性效率是很差的,应该避免这么做。

因此,接下来就要介绍我所见过的最为有趣的办法——在本地声明undefined变量!
它的做法是这样的:
function myFunc(){
var undefined;
// some code here
output(myVar === undefined);
myVar = undefined;
}
说到这里我要提一下,有的人对“早期的浏览器上没有undefined”这一说法有不同的理解,认为上面这样的做法是行不通的。
而我认为这种观点是不对的,在我的印象中(大约是2003年),IE5虽然没有预定义undefined,但并不影响我们的不指派声明。
不过毕竟是很多年前的事情,记忆模糊,为了避免想当然造成的错误,我特地装了Windows 98来实验一下:

上面两幅是用了QQ屏幕截取 ,不知道为什么变成了JPG,下边这幅是用OneNote截取的。

由此可以得出,为这样不指派声明undefined变量担忧是多余的。
前一篇解释过,在JavaScript中,如果尝试读取一个没有预定义也未声明过的变量,会引发一个“不存在(未定义)”异常,因此在早期的浏览器上如果直接访问undefined的操作可能会失败。
这种(引发异常的)现象可能是为了方便排除故障而有意设计的;而对于声明过的变量,即使是未经赋值,也不会在读取的时候引发异常——经过声明就表示开发人员确定有“这个东西”。

上面这种在函数作用域内声明本地变量undefined的做法,既解决了引用未声明变量会引发异常的问题,又避免了受全局变量污染的影响,还取代了void(0)这种乍看之下意味不明的小把戏,不仅没有造成难以觉察的拼写错误的隐患,还能提高运算效率——真是一举N得的妙招!
所以了解了这么多之后就发现,最后介绍的这种办法实在是居家旅行、杀人灭口的首选
如果有人问:“undefined应该怎么用?”我们现在就可以回答:就这么用!

终于到了结尾,有的人可能忍不住要问了:为什么在这个系列中我的代码示例都用三个等号的“严格相等”来比较?两个等号的普通的“相等”有什么问题吗?
这就是这个系列的下篇要讲解的内容:undefined及其各种等价形态的适用场合。

时间: 2024-10-29 15:26:55

写出更好的JavaScript程序之undefined篇(中)_javascript技巧的相关文章

写出更好的JavaScript之undefined篇(上)_javascript技巧

"全局变量"和"全局对象的属性"是指同样的东西,只是因为要配合上下文才用了不同的说法,正文中我就不再另外解释了:"声明"指通过"var"语句声明变量和/或对函数及其签名的定义:"变量"指通过"var"语句声明过或者在函数体中试图访问的命名参数:"undefined"指名为"undefined"的值(全局或本地变量),而"未定义"

JavaScript 程序执行顺序问题总结_javascript技巧

顺序可能比较乱,写多了再整理,有些术语可能运用也不恰当,欢迎批评指正.以下使用的示例程序都经过了本人的实际验证,兼容各大浏览器.OK,步入正题. 1. 变量的声明和引用 变量必须先声明后引用,这个大家是都知道的,但还是要说说,因为后面要说到一个相关的问题. [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行] 2. 函数的声明和调用 JavaScript是一种描述型脚本语言,由浏览器进行动态的解析与执行.函数的定义方式大体有以下两种,浏览器对于不同的方式有不同的解析顺序. 复制代码 代码如

JavaScript null和undefined区别分析_javascript技巧

一时间不好回答,特别是undefined,因为这涉及到undefined的实现原理.于是,细想之后,写下本文,请各位大侠拍砖. 总所周知:null == undefined 但是:null !== undefined 那么这两者到底有啥区别呢? 请听俺娓娓道来... null 这是一个对象,但是为空.因为是对象,所以 typeof null 返回 'object' . null 是 JavaScript 保留关键字. null 参与数值运算时其值会自动转换为 0 ,因此,下列表达式计算后会得到正

Javascript异步编程的4种方法让你写出更出色的程序_javascript技巧

你可能知道,Javascript语言的执行环境是"单线程"(single thread). 所谓"单线程",就是指一次只能完成一件任务.如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推.  这种模式的好处是实现起来比较简单,执行环境相对单纯:坏处是只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行.常见的浏览器无响应(假死),往往就是因为某一段Javascript代码长时间运行(比如死循环),导致整个页面卡在这个地方,其

吸烟如何妨碍你写出更好的程序

问题描述 程序员工作压力大,工作时间长,很多人都有吸烟的习惯.本来我们对吸烟危害的认识只在于伤肺,有些人会说,"我不在乎,我的观念是livefast and dieyoung",但是当吸烟还伤脑,这下问题就严重了.你不但死得快,有生之年创造出的产品也不怎么样,没有人会记住你年轻.短暂又毫无闪光点的生命.这次环环就带大家来看看吸烟会怎么妨碍你写出更好的程序.一项新研究发现,抽烟不仅会伤害你的肺部,还有可能影响你的大脑.之前有研究表明,相比非吸烟人群,早年开始吸烟的人到了晚年后,记忆力和认

[译] SQL 指引:如何写出更好的查询

本文讲的是[译] SQL 指引:如何写出更好的查询, 原文地址:SQL Tutorial: How To Write Better Queries 原文作者:Karlijn Willems 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- 译者:临书 校对者:steinliber, xiaoyusilen SQL 指引:如何写出更好的查询 结构化查询语言(SQL)是数据科学行业的一种不可或缺的技能,一般来说,学习这项技能是相当简单的.然而大多数人都忘记 SQL

写出更轻巧、更快并且更不会让你头疼的CSS

网页制作Webjx文章简介:写出更轻巧.更快并且更不会让你头疼的CSS. 为什么我们的CSS变得一团糟--我们真的很容易陷入这样的困惑中. 有时这是一开始就马虎编程的结果,有时是由于后期多重的附加代码(hacks)和修改造成的. 无论是哪种原因,这都不是无法避免的.写出干净,超级可管理的CSS很简单,只要你走对了路,你的代码会更便于今后的维护和编辑. 写出更轻巧.更快并且更不会让你头疼的CSS,以下这10个技巧将会提高你这方面的能力. 1.保持条理性 像任何事情一样,让自己保持条理性(有组织)是

【译】使用 currentColor 属性写出更好的 CSS 代码

本文讲的是[译]使用 currentColor 属性写出更好的 CSS 代码, 总有一些极其强大的 CSS 属性在目前已经有了很好的浏览器支持,但却很少被开发者使用. currentColor 就是这样的属性之一. MDN 把 currentColor 定义为: currentColor 代表了当前元素被应用上的 color 颜色值.它允许让继承自属性或子元素属性的 color 属性为默认值而不再继承. 在本文中,我们将通过一些有趣的方式来概述如何使用 CSS currentColor 这一关键

掌握解决问题的艺术,学会迭代开发,成为协作开发的专家,然后为写出更好的代码而担忧(转)

很多开发人员普遍犯有一个错误,认为他们的工作就是写代码.这不是一个开发人员要做的事情. 一个开发人员的工作是解决问题. 解决问题的一部分过程通常涉及到写代码,但是这部分工作是非常非常小的.开发有用的东西才花更多时间. 明白如何迭代开发,随着对问题有更好的理解,你才能给难题增加一些小功能,因为从头开发完美的产品是不可能的.不用写代码就能验证功能,因为很明显,写代码是相当昂贵的. 用于测试.评测和抛弃想法的系统也是极其重要的,因为要是没有它,整个开发组将耗费越来越多的精力,还有用来帮助他们执行得更有