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 相关文章推荐
dojo学习第一天 Tab选项卡 实现
Aug 28 Javascript
基于jquery的DIV随滚动条滚动而滚动的代码
Jul 20 Javascript
Javascript中对象继承的实现小例
May 12 Javascript
js语法学习之判断一个对象是否为数组
May 13 Javascript
js实现的黑背景灰色二级导航菜单效果代码
Aug 24 Javascript
EasyUI 中combotree 默认不能选择父节点的实现方法
Nov 07 Javascript
Vue + Webpack + Vue-loader学习教程之功能介绍篇
Mar 14 Javascript
ES6 迭代器(Iterator)和 for.of循环使用方法学习(总结)
Feb 08 Javascript
深入学习JavaScript中的bom
May 27 Javascript
Vue微信公众号网页分享的示例代码
May 28 Javascript
原生JS实现音乐播放器
Jan 26 Javascript
JS如何使用剪贴板操作Clipboard API
May 17 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
Yii2实现ajax上传图片插件用法
2016/04/28 PHP
php文件包含目录配置open_basedir的使用与性能详解
2017/04/03 PHP
CI框架附属类用法分析
2018/12/26 PHP
JavaScript中Array 对象相关的几个方法
2006/12/22 Javascript
Javascript的一种模块模式
2008/03/22 Javascript
Javascript 数组排序详解
2014/10/22 Javascript
JS实现倒计时和文字滚动的效果实例
2014/10/29 Javascript
仿JQuery输写高效JSLite代码的一些技巧
2015/01/13 Javascript
js模仿php中strtotime()与date()函数实现方法
2015/08/11 Javascript
基于jQuery实现仿百度首页换肤背景图片切换代码
2015/08/25 Javascript
Vue.js动态组件解析
2016/09/09 Javascript
表单元素值获取方式js及java方式的简单实例
2016/10/15 Javascript
利用js+css+html实现固定table的列头不动
2016/12/08 Javascript
Jquery EasyUI Datagrid右键菜单实现方法
2016/12/30 Javascript
js图片轮播手动切换特效
2017/01/12 Javascript
Angular 4依赖注入学习教程之简介(一)
2017/06/04 Javascript
js 事件的传播机制(实例讲解)
2017/07/20 Javascript
基于jquery实现的tab选项卡功能示例【附源码下载】
2019/06/10 jQuery
axios异步提交表单数据的几种方法
2019/08/11 Javascript
leaflet加载geojson叠加显示功能代码
2020/02/21 Javascript
[02:03]完美世界DOTA2联赛10月30日赛事集锦
2020/10/31 DOTA
Python 字符串定义
2009/09/25 Python
Python简单计算文件夹大小的方法
2015/07/14 Python
jupyter notebook 中输出pyecharts图实例
2020/04/23 Python
Python调用百度根据经纬度查询地址的示例代码
2019/07/07 Python
python实现拉普拉斯特征图降维示例
2019/11/25 Python
Python 脚本的三种执行方式小结
2019/12/21 Python
python 解决tqdm模块不能单行显示的问题
2020/02/19 Python
django 取消csrf限制的实例
2020/03/13 Python
Django 权限管理(permissions)与用户组(group)详解
2020/11/30 Python
八一建军节感言
2014/02/28 职场文书
运动会加油口号
2014/06/07 职场文书
购房协议书范本
2014/10/02 职场文书
2014年村计划生育工作总结
2014/11/14 职场文书
教师实习自我鉴定总结
2019/08/20 职场文书
javascript对象3个属性特征
2021/11/17 Javascript