javascript中的undefined可以被重写
问题:
为什么有的编程规范要求用 void 0 代替 undefined?
众所周知,当声明一个变量,并且没有给赋值的情况下,它的初始值是 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
的值是undefined
。这个属性有不可写,不可枚举,不可配置的特性。
在现代浏览器中,undefined
的值将不能被重写
我们需要支持ie8或者更古老的浏览器怎么办
通常undefined
指令是安全的。在应用中并没有什么理由需要修改undefined
的值。
如果你仍然很在意,有两个方法在即使全局 window.undefined
已经被重写的情况下,依然可以检查一个值是否为 undefined
。
if (name === void(0)) { //... }
在这个例子中 0
没有任何实际意义,你想要使用 1
or function(){}
也无所谓。 void(anything)
都会计算得到undefiend
另外一种选择,你可以使用typeof
操作符安全地检查是否已经被赋值。你可以检查一个值的类型是否为 "undefined
" 代替与全局的 undefined
比较.
if (typeof name === "undefined") { //... }
注意第二个选择与前一个方案稍微有点差异。虽然name
没有被声明,typeof
仍然会说他是 undefined
。如果你直接使用 name
与 undefined
or void(0)
你会得到ReferenceError
异常的错误.
但是不要直接使用void(0)
在代码中避免使用void(0)
或者 typeof x === "undefined"
,这些表达式不是自解释的,应该包装在isUndefined function
函数中,像这样:
function isUndefined(value){ //获得undefined,保证它没有被重新赋值 var undefined = void(0); return value === undefined; }
许多的工具库已经部署了这个方法,例如: _.isUndefined
,underscore中的isUndefined方法
参考:https://segmentfault.com/a/1190000007015757
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
2022-01-19 Do not access Object.prototype method 'hasOwnProperty' from target object
2021-01-19 ES5/ES6中JS实现继承的几种方式
2021-01-19 Web 性能优化-CSS3 硬件加速(GPU 加速)