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


Posted in Javascript onNovember 22, 2009

“全局变量”和“全局对象的属性”是指同样的东西,只是因为要配合上下文才用了不同的说法,正文中我就不再另外解释了;“声明”指通过“var”语句声明变量和/或对函数及其签名的定义;“变量”指通过“var”语句声明过或者在函数体中试图访问的命名参数;“undefined”指名为“undefined”的值(全局或本地变量),而“未定义”指type(...) == “undefined”的情况;“output”是一个显示传入参数的函数,可以看作是“alert”的同类。

我们写JavaScript程序的时候总有需要用到“未定义”的时候,比方说我们要知道某一个值是不是已经经过赋值,或者我们希望消除某一个已经赋予的值,我们就可能这样做:

output(myVar === undefined); 
myVar = undefined;

然而这样做并不太好,如果我们尝试“读”(或者比较)一个不存在的变量,就会引发一个异常。
比方说如果因为设计得不够周全,执行上面的代码的时候还没有定义过myVar这个变量,上面的代码就会出错;
另外在较早的浏览器版本上,也不存在undefined这个预定义值,所以为了提高兼容性和容错性,我们可以这样做:
output(typeof(myVar) == "undefined"); 
myVar = void(0);

typeof运算符是JavaScript的语言功能,虽然上面的代码看起来像是这样的一种东西:
output(oneFunction(myVar) == "undefined"); 
myVar = void(0);

但这两者有一个重要区别——当myVar不存在的时候,前者可以正确执行,并返回字符串"undefined";而后者不管内部构造是什么样的,都会引发异常。
void则是另一个语言功能,这个运算符的意义是向脚本的其它部分隐藏它的传入参数;而假如有一个语句试图得到void“运算”的结果,它就只能得到“未定义”。
因为void的这个特性,void最常见的功能就有两种:一是像上面的代码中那样将“未定义”值赋予给其它变量/属性;另一种就是像下面这样:
<a href="javascript:void(favList.push(curItem));">添加到收藏列表</a>
其中favList是一个JavaScript数组,而curItem是一个已经定义的对象——数组的push方法会返回执行push操作以后数组的长度,在这个例子里面这个长度对我们来说一点用都没有,但如果放任它不管的话,浏览器就可能会跳转到一个几乎为空白的脚本结果页面,只显示push的返回值,比方说“3”。
因此需要用一个void运算符来“欺骗”浏览器:这里啥都没有。
现在把目光回到对“未定义”的使用上,就会发现前面我们用来同“未定义”比较的“高容错性”的typeof运算符,用起来有点麻烦:总共需要多写“typeof()""”这样10个字符。
虽然我们是成天跟麻烦打交道的程序员,但这也不能说明我们不该想办法减少麻烦啊~各种开发工具其实不都是为了把编程工作变得简单才出现的么?
所以说如果明确知道一个变量一定一定绝对绝对已经声明过,就可以把这个变量直接和已知的“未定义”相比较,比方说这样:
output(myVar === void(0));

相比于使用typeof运算符,后面这个办法除了少打几个字符,还有一些好处:可以避免难以察觉的拼写错误(比方说把“undefined”写成“undefinied”什么的) 。

到这里,最常见的关于“undefined”/“未定义”的技巧,已经介绍完了。
在下一篇里面,我会介绍另一些不太常见的技巧。

Javascript 相关文章推荐
Prototype源码浅析 Number部分
Jan 16 Javascript
javascript之典型高阶函数应用介绍
Jan 10 Javascript
js实现拉伸拖动iframe的具体代码
Aug 03 Javascript
js中的onchange和onpropertychange (onchange无效的解决方法)
Mar 08 Javascript
使用Jquery获取带特殊符号的ID 标签的方法
Apr 30 Javascript
谷歌浏览器调试JavaScript小技巧
Dec 29 Javascript
javascript删除数组重复元素的方法汇总
Jun 24 Javascript
Js与Jq获取浏览器和对象值的方法
Mar 18 Javascript
Vue项目服务器部署之子目录部署方法
May 12 Javascript
vue实现axios图片上传功能
Aug 20 Javascript
vue项目从node8.x升级到12.x后的问题解决
Oct 25 Javascript
JavaScript字符和ASCII实现互相转换
Jun 03 Javascript
COM中获取JavaScript数组大小的代码
Nov 22 #Javascript
面向对象的编程思想在javascript中的运用上部
Nov 20 #Javascript
javascript 设置文本框中焦点的位置
Nov 20 #Javascript
ExtJS Grid使用SimpleStore、多选框的方法
Nov 20 #Javascript
Jquery中增加参数与Json转换代码
Nov 20 #Javascript
ExtJS的FieldSet的column列布局
Nov 20 #Javascript
页面版文本框智能提示JS代码
Nov 20 #Javascript
You might like
php连接mysql数据库代码
2009/03/10 PHP
div li的多行多列 无刷新分页示例代码
2013/10/16 PHP
php不使用copy()函数复制文件的方法
2015/03/13 PHP
php生成酷炫的四个字符验证码
2016/04/22 PHP
PHP使用自定义方法实现数组合并示例
2016/07/07 PHP
php格式文件打开的四种方法
2018/02/24 PHP
Laravel推荐使用的十个辅助函数
2019/05/10 PHP
基于jquery的无缝循环新闻列表插件
2011/03/07 Javascript
使用jquery hover事件实现表格的隔行换色功能示例
2013/09/03 Javascript
js和php如何获取当前url的内容
2013/09/22 Javascript
关于页面嵌入swf覆盖div层的问题的解决方法
2014/02/11 Javascript
jquery中ajax函数执行顺序问题之如何设置同步
2014/02/28 Javascript
JavaScript使用yield模拟多线程的方法
2015/03/19 Javascript
原生JS轮播图插件
2017/02/09 Javascript
微信小程序实现带刻度尺滑块功能
2017/03/29 Javascript
详解JS中的this、apply、call、bind(经典面试题)
2017/09/19 Javascript
JavaScript中EventLoop介绍
2018/01/22 Javascript
VueJs组件之父子通讯的方式
2018/05/06 Javascript
浅谈javascript中的prototype和__proto__的理解
2019/04/07 Javascript
基于vue开发微信小程序mpvue-docs跳转页面功能
2019/04/10 Javascript
JavaScript怎样在删除前添加确认弹出框?
2019/05/27 Javascript
微信小程序实现多图上传
2020/06/19 Javascript
浅析我对JS延迟异步脚本的思考
2020/10/12 Javascript
Python中的Classes和Metaclasses详解
2015/04/02 Python
通过5个知识点轻松搞定Python的作用域
2016/09/09 Python
python tkinter界面居中显示的方法
2018/10/11 Python
Python递归函数实例讲解
2019/02/27 Python
解决jupyter notebook 出现In[*]的问题
2020/04/13 Python
css3实现背景颜色渐变让图片不再是唯一的实现方式
2012/12/18 HTML / CSS
HTML5的文档结构和新增标签完全解析
2017/04/21 HTML / CSS
英国羊绒服装购物网站:Pure Collection
2018/10/22 全球购物
小学师德标兵先进事迹材料
2014/05/25 职场文书
反对四风问题自我剖析材料
2014/09/29 职场文书
汽车转让协议书范本
2014/12/07 职场文书
Python time库的时间时钟处理
2021/05/02 Python
redis数据一致性的实现示例
2022/03/18 Redis