我们平时用到的\(\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. Linux 时间同步 05 chrony时间同步

    Linux 时间同步 05 chrony时间同步 目录 Linux 时间同步 05 chrony时间同步 chrony 的优势: chrony包介绍 安装chrony 配置与外部时间服务器进行时间同步 ...

  2. 记录一次 Nginx 配置 proxy_pass 后 返回404问题

    一. Nginx 配置 proxy_pass 后 返回404问题 故障解决和定位 1.1. 问题 在一次生产涉及多次转发的配置中, 需求是下面的图: 在配置好了 proxy_pass 之后,请求 ww ...

  3. 11. const 修饰成员函数

    const 限定只读,对函数的实参进行保护 常数据成员:必须出现在类的定义体中,常数据成员必须进行初始化,并且不能被更新,但常数据成员的初始化只能通过构造函数的初始化列表进行 1. 常函数 成员函数加 ...

  4. ES6箭头函数与this指向

    一.ES6箭头函数 ES6之前的语法想要定义一个函数,如图example1,ES6之后定义一个函数如图example2,相比较之下简洁了很多 二.函数的this指向 非箭头函数,谁调用函数this指向 ...

  5. linux下用户管理命令、用户组管理命令

    useradd 添加新用户 1.基本语法 useradd 用户名                   (功能描述:添加新用户) useradd -g 组名 用户名      (功能描述:添加新用户到某 ...

  6. Spring(3) --事务,隔离级别,设计模式

    什么是事务?事物的四大特性? 事务是指单个逻辑工作单元执行的一系列操作(ACID),这些操作要么全部执行,要么全部不执行,是不可中断的. (1)原子性(Atomicity)是指事务所有操作是不可中断的 ...

  7. hadoop完全分布式

    虚拟机克隆 a. vim /etc/udev/rules.d/70-persistent-net.rules 更改网卡名     b. vim /etc/sysconfig/network-scrip ...

  8. Mirai qq机器人 c++版sdk(即用c++写mirai)

    Mirai机器人c++版 前言 类似教程 本文git,gitee地址 c++开发mirai 原理 大概流程 实现 如何使用 注意事项 常见错误 前言 改分支版本以及过时,暂时不再维护 请看最新版kot ...

  9. java的重载与重写

    原文链接http://zhhll.icu/2020/11/11/java%E5%9F%BA%E7%A1%80/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1/%E9%87%8 ...

  10. mysql高并发解决方案

    mysql高并发的解决方法有: 优化SQL语句,优化数据库字段,加缓存,分区表,读写分离以及垂直拆分,解耦模块,水平切分等. 高并发大多的瓶颈在后台,在存储mysql的正常的优化方案如下: (1)代码 ...