你真的知道为什么要使用void(0)代替undefined吗?
我们平时用到的\(\color{#FF3030}{undefined}\)只是\(\color{#FF3030}{window}\)对象下的一个属性。
Object.getOwnPropertyDescriptor(window, undefined);
//{value: undefined, writable: false, enumerable: false, configurable: false}
也正是因为如此,导致它在函数作用域中是可以修改。
但前提要加声明,因为不加声明,操作的\(\color{#FF3030}{window.undefined}\),而\(\color{#FF3030}{window.undefined}\)的属性描述符是:
| 属性 | 值 |
|---|---|
| value | undefined |
| writable | false |
| enumerable | false |
| configurable | false |
\(\color{#FF3030}{value}\)不能修改,不能遍历,并且\(\color{#FF3030}{属性描述符}\)也不能修改(不能用\(\color{#FF3030}{Object.defineProperty}\)来修改\(\color{#FF3030}{writable、enumerable、configurable}\)的值)。
但是我们是可以在\(\color{#FF3030}{函数作用域}\)或者\(\color{#FF3030}{块级作用域}\)对\(\color{#FF3030}{undefined}\)的值进行\(\color{#FF3030}{“修改”}\)的,比如:
function fn(){
undefined = 1111;
console.log('undefined : ' + undefined);
}
fn();//undefined : undefined
function fn(){
var undefined = 1111;
console.log('undefined : ' + undefined);
}
fn();//undefined : 1111
{
let undefined = 1111;
console.log('undefined : ' + undefined);//undefined : 1111
}
这是因为在\(\color{#FF3030}{函数作用域}\)或者\(\color{#FF3030}{块级作用域}\)中也定义了一个\(\color{#FF3030}{undefined}\)变量,在此作用域中就会优先使用新定义的变量,而不会去使用\(\color{#FF3030}{window.undefined}\),从而造成一种我们将\(\color{#FF3030}{window.undefined}\)的值改变了的假象。
所以我们在判断变量的类型时,最好使用:
var obj;
typeof obj === 'undefined';
而不要去使用:
var obj;
obj === undefined;
使用\(\color{#FF3030}{void关键字}\)也是可以的,因为\(\color{#FF3030}{void关键字}\)无论如何都会返回\(\color{#FF3030}{undefined}\):
var obj;
obj === void(0);
这也是在实际开发中经常使用\(\color{#FF3030}{void(0)}\)来代替\(\color{#FF3030}{undefined}\)的原因了。
你真的知道为什么要使用void(0)代替undefined吗?的更多相关文章
- 【跟着子迟品underscore】从用 `void 0` 代替 `undefined` 说起
Why underscore 最近开始看 underscore源码,并将 underscore源码解读 放在了我的 2016计划 中. 阅读一些著名框架类库的源码,就好像和一个个大师对话,你会学到很多 ...
- 为什么js中要用void 0 代替undefined
这个是Backbone.js中的一句源码 if (callback !== void 0 && 'context' in opts && opts.context == ...
- void 0 与 undefined
偶然看到一个问题:为什么有的编程规范要求用 void 0 代替 undefined? 如果不知道这个答案的小伙伴,第一反应就要问void 0是什么鬼? void 0 void是JavaScript的一 ...
- 为什么有的编程规范要求用 void 0 代替 undefined
Undefined Undefined 类型表示未定义,它的类型只有一个值,就是 undefined. 任何变量在被赋值前它的值都是 undefined,但是在 JavaScript 引擎中,unde ...
- js 用 void 0 替代 undefined
underscore 源码没有出现 undefined,而用 void 0 代替之.为什么要这么做?我们可以从两部分解读,其一是 undefined 哪里不好了,你非得找个替代品?其二就是替代品为毛要 ...
- void 0 或者 undefined
Problem 在检查一个值是否为undefined的时候.你们是假设去測试的? 要是之前的我会这样子測试 function isUndefined(obj){ return obj === unde ...
- JS - What does `void 0` mean?
语法 void expression // or void(expression) MDN的描述 能向期望一个表达式的值是 undefined 的地方插入会产生副作用的表达式.也就是为了避免产生某种副 ...
- undefined 与void 0
参考:https://segmentfault.com/a/1190000000474941 Javascript中void是一个操作符,该操作符指定要计算一个表达式但是不返回值.void 操作符用法 ...
- 源码学习之void 0
今天看源码的时候看到 void 0 这样的写法,平时在业务代码里基本没有这样的写法,于是学习了一下. 在控制台运行了一下void 0,得到返回值是undefined. 在MDN上搜了一下void,了解 ...
随机推荐
- 使用swagger上传文件
经常使用swagger,可以通过设置[ProducesResponseType]标记接口的返回信息:swagger也能通过接口的参数列表,自动获得发送的数据结构信息. 不过有一个例外,就是上传文件的时 ...
- Oracle-序列-存储过程-视图-索引-触发器
课程介绍 1. 约束(掌握) 2. 序列(掌握) 3. 索引(掌握) 4. 视图(掌握) 5. 存储过程(掌握) 6. 自定义函数(掌握) 7. 触发器(掌握) 数据库对象的命名规则 1.对象名称必须 ...
- Beta冲刺——第七天
这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzzcxy/2018SE1 这个作业要求在哪里 https://edu.cnblogs.com/campus/fz ...
- IdentityServer4 之 Resource Owner Password Credentials 其实有点尴尬
前言 接着IdentityServer4的授权模式继续聊,这篇来说说 Resource Owner Password Credentials授权模式,这种模式在实际应用场景中使用的并不多,只怪其太开放 ...
- node.js常用内置模块一
在使用内模块的时候需要先将所需的内置模块进行引入. OS模块 在nodejs中OS模块提供了与操作系统相关的属性和方法 // 导入OS内置模块,必须先进行导入,否则无法使用 const os = re ...
- 手把手教你搭建SSH框架(Eclipse版)
原文来自公众号[C you again],若需下载完整源码,请在公众号后台回复"ssh". 本期文章详细讲解了SSH(Spring+SpringMVC+Hibernate)框架的搭 ...
- 洛谷 P4396 [AHOI2013]作业
题目描述 题目传送门 分析 因为询问是关于区间的,并且没有强制在线,所以能用莫队解决 但是还要支持查询区间内大于等于 \(a\),小于等于 \(b\) 的数的个数和数值的个数 所以还要套一个数据结构 ...
- MATLAB OPC错误OPCenum service is not operating correctly解决办法
错误截图: 出错原因:C:\Windows\SysWOW64下没有OpcEnum.exe等文件,opc需要这些文件才能正常运行.有些系统内置了,有些系统没有. 解决方法:去opc官网https://o ...
- H5手机网页元素识别
- 【Oracle】userenv()函数介绍分析
说到这个userenv()使用起来还是很有用的 参数 功能 CLINET_INFO 返回最高可达64个字节存储的用户会话信 ...