侧边栏壁纸
博主头像
钛极客技术站博主等级

行动起来,活在当下

  • 累计撰写 2 篇文章
  • 累计创建 1 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

关于Js中的 undefined 和 void 0

HJW
HJW
2023-11-24 / 0 评论 / 0 点赞 / 26 阅读 / 3200 字

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)

0

评论区