undefined的两层含义
1. undefined是一个 JavaScript 的基本类型。
> 基本类型(基本数值、基本数据类型)是一种既非对象也无方法的数据。在 JavaScript 中,共有 7 种基本类型:string,number,bigint,boolean,null,undefined,symbol (ECMAScript 2016 新增)。
它表示一个声明未定义的变量的初始值,或没有实际参数的形式参数。
例如:
var x; //创建一个变量,但并没有赋值
console.log("X的值是", x) //返回X的值是undefined
2. undefined是全局对象window的一个属性。也就是说,它是全局作用域的一个变量。undefined的最初值就是基本类型undefined。
在现代浏览器(JavaScript 1.8.5/Firefox 4+),自 ECMAscript5 标准以来 undefined 是一个不能被配置(non-configurable),不能被重写(non-writable)的属性。但是事实并非如此,在一部分低级浏览器(IE7-IE8)中或者局部作用域是可以被修改的。
例如:
// IE5.5~8
var testUndefined = undefined;
undefined = 1;
console.log(typeof testUndefined === 'number') // true
// undefined是window的全局属性
console.log(window.hasOwnProperty('undefined')) // true
console.log(window.undefined) // undefined
//旧版IE可以直接覆盖改写undefined
var undefined = '123'
console.log(undefined) // 123
// window.undefined在局部作用域中是可以被修改的
var test = function () {
var obj = {}
var undefined = 'changeundefined'
var window = {
'undefined': 'change'
}
console.log(window)
console.log(undefined) // changeundefined
console.log(window.undefined) // change
console.log(obj.name === undefined) // false
console.log(obj.name === window.undefined) // false
console.log(obj.name === (void 0)) // true
}
test()
void的含义与用法
void是一个一元运算符, 其作用是对给定的表达式进行求值,然后返回undefined。
语法为:
void expression
void 运算符通常只用于获取 undefined的原始值,一般使用void(0)(等同于void 0)
void可以在箭头函数中避免泄漏, 箭头函数标准中,允许在函数体不使用括号来直接返回值。 如果右侧调用了一个原本没有返回值的函数,其返回值改变后,则会导致非预期的副作用。 安全起见,当函数返回值是一个不会被使用到的时候,应该使用 void 运算符,来确保返回 undefined(如下方示例),这样,当 API 改变时,并不会影响箭头函数的行为。
button.onclick = () => void doSomething();
以上确保了当 doSomething 的返回值从 undefined 变为 true 的时候,不会改变函数的行为。
如何判断一个变量是否是undefined
从以上的说明和例子可以看到, 因为undefined全局属性可以被修改, 如果想要判断一个变量是否等于基本类型undefined的时候,如果使用undefined来判断会不严谨,存在风险。正确的方法是借助void 0总是返回undefined的特性, 使用void 0来判断变量是否是undefined的。
总结
某些情况下用undefined判断存在风险,因undefined有被修改的可能性,但是void 0返回值一定是undefined
兼容性上 void 0 基本所有的浏览器都支持
void 0比undefined字符所占空间少 (6字符 vs 9字符)
参考
[1] [undefined](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/undefined)
[2] [void运算符](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/void)
评论区