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 onmouseout 解决办法
Jul 17 Javascript
Javascript动态引用CSS文件的2种方法介绍
Jun 06 Javascript
JS+Canvas 实现下雨下雪效果
May 18 Javascript
Node.js环境下JavaScript实现单链表与双链表结构
Jun 12 Javascript
javascript学习之json入门
Dec 22 Javascript
使用Browserify来实现CommonJS的浏览器加载方法
May 14 Javascript
ES6新特性:使用export和import实现模块化详解
Jul 31 Javascript
vue-router动态设置页面title的实例讲解
Aug 30 Javascript
vue如何根据网站路由判断页面主题色详解
Nov 02 Javascript
使用Vue父子组件通信实现todolist的功能示例代码
Apr 11 Javascript
小程序封装路由文件和路由方法(5种全解析)
May 26 Javascript
Vue源码分析之Vue实例初始化详解
Aug 25 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
追忆往昔!浅谈收音机的百年发展历史
2021/03/01 无线电
PHP4实际应用经验篇(4)
2006/10/09 PHP
收集的PHP中与数组相关的函数
2007/03/22 PHP
php部分常见问题总结
2008/03/27 PHP
php缩放图片(根据宽高的等比例缩放)实例介绍
2013/06/09 PHP
linux下使用crontab实现定时PHP计划任务失败的原因分析
2014/07/05 PHP
初识PHP中的Swoole
2016/04/05 PHP
javascript 类方法定义还是有点区别
2009/04/15 Javascript
js 自制滚动条的小例子
2013/03/16 Javascript
页面定时刷新(1秒刷新一次)
2013/11/22 Javascript
js中typeof的用法汇总
2013/12/12 Javascript
jQuery实现网页抖动的菜单抖动效果
2015/08/07 Javascript
一篇文章,教你学会Vue CLI 插件开发
2019/04/17 Javascript
jQuery实现的解析本地 XML 文档操作示例
2020/04/30 jQuery
python dict remove数组删除(del,pop)
2013/03/24 Python
python实现读取excel写入mysql的小工具详解
2017/11/20 Python
python基础 range的用法解析
2019/08/23 Python
python numpy数组复制使用实例解析
2020/01/10 Python
python爬虫scrapy图书分类实例讲解
2020/11/23 Python
python爬虫中采集中遇到的问题整理
2020/11/27 Python
CSS3中的Media Queries学习笔记
2016/05/23 HTML / CSS
Html5 Canvas 实现一个“刮刮乐”游戏
2019/09/05 HTML / CSS
国际知名军事风格休闲装品牌:Alpha Industries(阿尔法工业)
2017/05/24 全球购物
JSF面试题:Jsf中的核心类用那些?有什么作用?LiftCycle六大生命周期是什么?
2014/07/17 面试题
金山毒霸系列的笔试题
2013/04/13 面试题
如何写出高质量、高性能的MySQL查询
2014/11/17 面试题
西安夏日科技有限公司Java笔试题
2013/01/11 面试题
制冷与电控专业应届生求职信
2013/11/11 职场文书
2015年幼儿园毕业感言
2014/02/12 职场文书
经济管理自荐书
2014/06/09 职场文书
学习党的群众路线教育实践活动心得体会范文
2014/11/03 职场文书
表扬稿格式范文
2015/01/16 职场文书
小学德育工作总结2015
2015/05/12 职场文书
家庭聚会祝酒词
2015/08/11 职场文书
PHP实现rar解压读取扩展包小结
2021/06/03 PHP
Vue中foreach数组与js中遍历数组的写法说明
2021/06/05 Vue.js