我们平时用到的\(\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吗?的更多相关文章

  1. 【跟着子迟品underscore】从用 `void 0` 代替 `undefined` 说起

    Why underscore 最近开始看 underscore源码,并将 underscore源码解读 放在了我的 2016计划 中. 阅读一些著名框架类库的源码,就好像和一个个大师对话,你会学到很多 ...

  2. 为什么js中要用void 0 代替undefined

    这个是Backbone.js中的一句源码 if (callback !== void 0 && 'context' in opts && opts.context == ...

  3. void 0 与 undefined

    偶然看到一个问题:为什么有的编程规范要求用 void 0 代替 undefined? 如果不知道这个答案的小伙伴,第一反应就要问void 0是什么鬼? void 0 void是JavaScript的一 ...

  4. 为什么有的编程规范要求用 void 0 代替 undefined

    Undefined Undefined 类型表示未定义,它的类型只有一个值,就是 undefined. 任何变量在被赋值前它的值都是 undefined,但是在 JavaScript 引擎中,unde ...

  5. js 用 void 0 替代 undefined

    underscore 源码没有出现 undefined,而用 void 0 代替之.为什么要这么做?我们可以从两部分解读,其一是 undefined 哪里不好了,你非得找个替代品?其二就是替代品为毛要 ...

  6. void 0 或者 undefined

    Problem 在检查一个值是否为undefined的时候.你们是假设去測试的? 要是之前的我会这样子測试 function isUndefined(obj){ return obj === unde ...

  7. JS - What does `void 0` mean?

    语法 void expression // or void(expression) MDN的描述 能向期望一个表达式的值是 undefined 的地方插入会产生副作用的表达式.也就是为了避免产生某种副 ...

  8. undefined 与void 0

    参考:https://segmentfault.com/a/1190000000474941 Javascript中void是一个操作符,该操作符指定要计算一个表达式但是不返回值.void 操作符用法 ...

  9. 源码学习之void 0

    今天看源码的时候看到 void 0 这样的写法,平时在业务代码里基本没有这样的写法,于是学习了一下. 在控制台运行了一下void 0,得到返回值是undefined. 在MDN上搜了一下void,了解 ...

随机推荐

  1. JavaScript内置可用类型

    string,number,boolean,null和undefined,object,symbol(ES6新语法)

  2. Redis底层数据结构实现

    REDIS  较宽泛的支持5种数据结构  分别为 字符串 列表 集合 散列 有序集合 关于这几种数据结构的使用 相信网上有很多资料,查看官网API 也很详细了  读者可以自己随意翻阅 很方便 . 接下 ...

  3. TurtleBot3 Waffle (tx2版华夫)(12)建图-hector建图

    1)[Remote PC] 启动roscore $ roscore 2)[TurBot3] 启动turbot3 $ roslaunch turbot3_bringup minimal.launch 3 ...

  4. 【SpringBoot1.x】SpringBoot1.x 入门

    SpringBoot1.x 入门 文章源码 简介 传统的 JavaEE 开发,十分笨重且配置繁琐,开发效率很低,而且有很复杂的部署流程,对于第三方技术的集成也很困难. Sring 全家桶时代则解决了上 ...

  5. LeetCode222 判断是否为完全二叉树并求节点个数

    给出一个完全二叉树,求出该树的节点个数. 说明: 完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置.若最底 ...

  6. 【Vue】Vue开发环境搭建

    Vue前置学习环境 文章目录 Vue前置学习环境 IDE Node.js 调试环境 工程环境 小结 IDE WebStorm 官网下载:https://www.jetbrains.com/websto ...

  7. 电子邮箱、邮件地址、网站地址正则表达式!几个有用的RE、regex、regexp!

    几个常用的正则表达式! r"\w[-\w\.]*@\w[-\w]*(\.\w[-\w]*)+" 这个是电子邮件地址的. r"<TAG\b[^>]*<(. ...

  8. [Usaco2015 dec]Breed Counting

    原题链接https://www.lydsy.com/JudgeOnline/problem.php?id=4397 用线段树维护区间和即可.时间复杂度\(O((N+Q)logN)\). #includ ...

  9. Podinfo,迷你的 Go 微服务模板

    ​项目介绍 Podinfo 是一个用 Go 制作的小型 web 应用程序,它展示了在 Kubernetes 中运行微服务的最佳实践. 它已实现的技术指标(截选自官方 README.md ): 里面每一 ...

  10. 【pytest】(十)fixture参数化-巧用params和ids优雅的创建测试数据

    我们都知道参数化. 比如我要测试一个查询接口/test/get_goods_list,这个接口可以查询到商品的信息. 在请求中,我可以根据请参数goods_status的不同传值,可以查询到对应状态的 ...