Javascript中判断一个值是否为undefined的方法详解


Posted in Javascript onSeptember 28, 2016

前言

相信大家都知道当声明一个变量,并且没有给赋值的情况下,它的初始值是undefined。但是在javascript中,怎么检查一个值是否为undefined呢?

简单来说,在现代浏览器中,你可以安全的比较变量是否为undefined

if (name === undefined) {...}

一些人反对直接使用undefined变量进行比较,因为在旧的浏览器中允许它的值被重新赋值,比如下面这样:

undefined = "test"

在被重新赋值后,使用undefined指令将不能正确的检测一个变量是否被赋值。

不过,这个行为在2009年的ECMAScript 5被修复了。

15.1.1.3 undefined
The value of undefined is undefined (see 8.1). This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

在现代浏览器中,undefined的值将不能被重写

我们需要支持IE8或者更古老的浏览器怎么办

通常undefined指令是安全的。在应用中并没有什么理由需要修改undefined的值。

Thomas的回答使用具有说服力的推理,论证了这一点。

I don't hear people telling me that I shouldn't use setTimeout because someone can
我不听别人告诉我,我不应该使用setTimeout,因为有的人像这样用:
window.setTimeout = function () {
  alert("Got you now!");
};

下面一行,“它可以被重新赋值”,raw === undefined返回false

如果你仍然很在意,有两个方法可以检查一个值是否为undefined,即使全局window.undefined已经被重写

if (name === void(0)) {...}

在这个例子中0没有任何实际意义,你想要使用 1 or function(){}也无所谓。 void(anything)都会计算得到undefiend

另外一种选择,你可以使用typeof操作符安全地检查是否已经被赋值。你可以检查一个值的类型是否为”undefined”代替与全局的undefined比较.

if (typeof name === "undefined") {...}

注意第二个选择与前一个方案稍微有点差异.尽管name没有被声明,typeof会返回他是undefined。如果你直接使用name与undefinedor void(0)你会得到ReferenceError异常的错误.

但是不要使用VOID(0)指令

在代码中避免使用void(0)或者 typeof x === "undefined" ,你可以使用isUndefined function方法把他们包起来,这样你使用的时候就不用再特意说明了.

function isUndefined(value){
  //获得undefined,保证它没有被重新赋值
  var undefined = void(0);
  return value === undefined;
}

一些工具库已经部署了这个方法,例如: _.isUndefinedunderscore中的isUndefined方法

总结

以上就是这篇文章的全部内容了,希望能对大家的学习或者工作带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
javascript下IE与FF兼容函数收集
Sep 17 Javascript
JavaScript在IE中“意外地调用了方法或属性访问”
Nov 19 Javascript
通用javascript脚本函数库 方便开发
Oct 13 Javascript
基于jquery的bankInput银行卡账号格式化
Aug 22 Javascript
js Array对象的扩展函数代码
Apr 24 Javascript
js简单实现HTML标签Select联动带跳转
Oct 23 Javascript
js实现鼠标经过时图片滚动停止的方法
Feb 16 Javascript
基于JS代码实现当鼠标悬停表格上显示这一格的全部内容
Jun 12 Javascript
vue.js入门教程之绑定class和style样式
Sep 02 Javascript
基于Vue渲染与插件的加载顺序的问题详解
Mar 05 Javascript
详解node.js 事件循环
Jul 22 Javascript
JS异步堆栈追踪之为什么await胜过Promise
Apr 28 Javascript
BootStrap Validator使用注意事项(必看篇)
Sep 28 #Javascript
使用BootStrapValidator完成前端输入验证
Sep 28 #Javascript
request请求获取参数的实现方法(post和get两种方式)
Sep 27 #Javascript
使用JavaScript获取Request中参数的值方法
Sep 27 #Javascript
详解JavaScript权威指南之对象
Sep 27 #Javascript
Web性能优化系列 10个提升JavaScript性能的技巧
Sep 27 #Javascript
JS点击某个图标或按钮弹出文件选择框的实现代码
Sep 27 #Javascript
You might like
探讨PHP中OO之静态关键字以及类常量的详解
2013/06/07 PHP
PHP实现多进程并行操作的详解(可做守护进程)
2013/06/18 PHP
PHP解决中文乱码
2017/04/28 PHP
JavaScript CSS修改学习第三章 修改样式表
2010/02/19 Javascript
jQuery表格列宽可拖拽改变且兼容firfox
2014/09/03 Javascript
JavaScript用select实现日期控件
2015/07/17 Javascript
解决js图片加载时出现404的问题
2020/11/30 Javascript
js实现Tab选项卡切换效果
2020/07/17 Javascript
vue路由组件按需加载的几种方法小结
2018/07/12 Javascript
解决v-for中使用v-if或者v-bind:class失效的问题
2018/09/25 Javascript
js限制input只能输入有效的数字(第一个不能是小数点)
2018/09/28 Javascript
详解基于iview-ui的导航栏路径(面包屑)配置
2019/02/22 Javascript
解决Echarts 显示隐藏后宽度高度变小的问题
2020/07/19 Javascript
[02:19]DOTA选手解说齐贺岁
2018/02/11 DOTA
[01:32]寻找你心中的那团火 DOTA2 TI9火焰传递活动今日开启
2019/05/16 DOTA
Python随机生成彩票号码的方法
2015/03/05 Python
使用Python的web.py框架实现类似Django的ORM查询的教程
2015/05/02 Python
python简单实现获取当前时间
2016/08/27 Python
Python使用MyQR制作专属动态彩色二维码功能
2019/06/04 Python
tensor和numpy的互相转换的实现示例
2019/08/02 Python
pytorch 自定义数据集加载方法
2019/08/18 Python
Python获取当前脚本文件夹(Script)的绝对路径方法代码
2019/08/27 Python
Python 3.6打包成EXE可执行程序的实现
2019/10/18 Python
IronPython连接MySQL的方法步骤
2019/12/27 Python
使用Python3 poplib模块删除服务器多天前的邮件实现代码
2020/04/24 Python
纯HTML+CSS3制作导航菜单(附源码)
2013/04/24 HTML / CSS
CSS3实现滚动条动画效果代码分享
2016/08/03 HTML / CSS
Html5调用手机摄像头并实现人脸识别的实现
2018/12/21 HTML / CSS
理肤泉加拿大官网:La Roche-Posay加拿大
2018/07/06 全球购物
函授毕业生自我鉴定
2013/11/06 职场文书
2014两会学习心得:时代的发展
2014/03/17 职场文书
《新型玻璃》教学反思
2014/04/13 职场文书
万能检讨书开头与结尾怎么写
2015/02/17 职场文书
毛主席纪念堂观后感
2015/06/17 职场文书
校运会广播稿
2015/08/19 职场文书
有趣的二维码:使用MyQR和qrcode来制作二维码
2021/05/10 Python