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 相关文章推荐
编写js扩展方法判断一个数组中是否包含某个元素
Nov 08 Javascript
jquery easyui combobox模糊过滤(示例代码)
Nov 30 Javascript
滚动条响应鼠标滑轮事件实现上下滚动的js代码
Jun 30 Javascript
JavaScript中的small()方法使用详解
Jun 08 Javascript
深入浅析JavaScript中的3DES
Aug 24 Javascript
js当前页面登录注册框,固定div,底层阴影的实例代码
Oct 04 Javascript
vuejs指令详解
Feb 07 Javascript
@ResponseBody 和 @RequestBody 注解的区别
Mar 08 Javascript
微信小程序实现用table显示数据库反馈的多条数据功能示例
May 07 Javascript
Node配合WebSocket做多文件下载以及进度回传
Nov 07 Javascript
Vue实现boradcast和dispatch的示例
Nov 13 Javascript
5种 JavaScript 方式实现数组扁平化
Oct 05 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 前一天或后一天的日期
2008/06/28 PHP
探讨fckeditor在Php中的配置详解
2013/06/08 PHP
php断点续传之文件分割合并详解
2016/12/13 PHP
php批量转换文件夹下所有文件编码的函数类
2017/08/06 PHP
IE6-IE9不支持table.innerHTML的解决方法分享
2012/09/14 Javascript
DIV+CSS+JS不间断横向滚动实现代码
2013/03/19 Javascript
extjs_02_grid显示本地数据、显示跨域数据
2014/06/23 Javascript
js实现点击后将文字或图片复制到剪贴板的方法
2014/08/04 Javascript
js生成验证码并直接在前端判断
2015/05/15 Javascript
使用jquery实现鼠标滑过弹出更多相关信息层附源码下载
2015/11/23 Javascript
vue开发心得和技巧分享
2016/10/27 Javascript
Vue.js实现无限加载与分页功能开发
2016/11/03 Javascript
微信小程序 实现动态显示和隐藏某个控件
2017/04/27 Javascript
JS奇技之利用scroll来监听resize详解
2017/06/15 Javascript
在vue中使用SockJS实现webSocket通信的过程
2018/08/29 Javascript
JQuery常见节点操作实例分析
2019/05/15 jQuery
JS/CSS实现字符串单词首字母大写功能
2019/09/03 Javascript
Layui Form 自定义验证的实例代码
2019/09/14 Javascript
解决antd 表单设置默认值initialValue后验证失效的问题
2020/11/02 Javascript
python实现类的静态变量用法实例
2015/05/08 Python
python正则表达式之作业计算器
2016/03/18 Python
Python中的字符串查找操作方法总结
2016/06/27 Python
Python实现生成随机日期字符串的方法示例
2017/12/25 Python
python利用插值法对折线进行平滑曲线处理
2018/12/25 Python
详解Python Matplot中文显示完美解决方案
2019/03/07 Python
利用python实现PSO算法优化二元函数
2019/11/13 Python
基于css3实现漂亮便签样式
2013/03/18 HTML / CSS
英国最大的线上保健品零售商之一:Vitamin Planet
2016/12/01 全球购物
柯基袜:Corgi Socks
2017/01/26 全球购物
法国票务网站:Ticketmaster法国
2018/07/09 全球购物
造型师求职自荐信
2013/09/27 职场文书
介绍信的写法
2015/01/31 职场文书
小区环境卫生倡议书
2015/04/29 职场文书
2015年音乐教学工作总结
2015/07/22 职场文书
《烈火英雄》观后感:致敬和平时代的英雄
2019/11/11 职场文书
Golang标准库syscall详解(什么是系统调用)
2021/05/25 Golang