今天刚开始学ts,看到TypeScript在处理函数的默认参数时,是先判断该参数是否存在(即是否是undefined),不存在的话则给它赋值。不过ts判断undefined并不是直接利用 target === undefined
, 而是用void 0
来替代undefined
,这是为什么呢?
先来说结论: 是因为undefiend可能会被重写
我们得先来简单谈下undefined
,它是标识符而非保留字,作为全局对象的一个属性,该属性的初始值表示基本数据类型值undefined
,在ES5之前是可以给全局的undefined
属性重新赋值,ES5规定将全局的undefined的值为只读。
但是!尽管全局的undefined
属性值不能再被修改,局部的undefined
依旧是可以的,在函数内部申明一个新的undefined,它都是可以被赋值无论是不是在严格模式下
(function changeUndefined() {
"use strict";
console.log(undefined); // 全局的undefined,打印undefined
var undefined = 10;
console.log(undefined); // 局部的undefined变量,打印10
})()
(function changeUndefined() {
"use strict";
undefined = 10; // Uncaught TypeError: Cannot assign to read only property 'undefined' of object '#<Window>', 非严格模式下不会报错
// console.log(undefined);
// var undefined = 10; 注释掉是因为var存在变量提升,否则上面那个修改的依旧是局部的undefined变量
// console.log(undefined);
})()
那为什么void 0
就可以了呢,看下MDN对void
的简介
The void operator evaluates the given
*expression*
and then returnsundefined
.
原来void操作符的作用就是先执行表达式,然后返回undefined,无论表达式是什么都是返回undefined值
void
另外一个作用是用作立即执行函数表达式(IIFE)
一个常见的IIFE
(function () {
// do something
})()
void function fn() {
console.log('be called')
return 10;
}(); //执行fn函数,并返回undefined而非10
另外一种判断undefined
的方法可以是typeof target === 'undefined'
总的来说用void
来表示undefined
既可以不用担心undefined
的值会被重写,也可以省下几个字节还是挺不错的