void 0是什么?為什么比undefined好用?

1一、void 0 === undefined ?true!why?
源碼涉及到 undefined 表達(dá)都會(huì)被編譯成 void 0

//源碼
const a: number = 6
a === undefined

//編譯后
"use strict";
var a = 6;
a === void 0;
void 0 === undefined

if(context === void 0) return fn;
//等價(jià)于
if(context === undefined) return fn;
為什么呢?void文檔里面解釋道

void 運(yùn)算符通常只能用于獲取 undefined 的原始值,一般用void(0),等同于void 0,也可以使用全局變量 undefined 替代。

那什么是void 0、void 0 有什么意義、與undefined有什么關(guān)系呢?我們一起來(lái)總結(jié)一下。

2二、為什么不直接寫(xiě) undefined
undefined 是 js 原始類型值之一,也是全局對(duì)象window的屬性,在一部分低級(jí)瀏覽器(IE7-IE8)中or局部作用域可以被修改。

//IE5.5~8
var strangerUndefined = undefined;
undefined = 1;
console.log(typeof strangerUndefined === 'number') // true
undefined在js中,全局屬性是允許被覆蓋的

//undefined是window的全局屬性
console.log(window.hasOwnProperty('undefined'))
console.log(window.undefined)
舊版IE 可以改寫(xiě)undefined
//舊版IE
var undefined = '666'
console.log(undefined)//666 直接覆蓋改寫(xiě)undefined
window.undefined在局部作用域中是可以被修改的 在ES5開(kāi)始,undefined就已經(jīng)被設(shè)定為僅可讀的,但是在局部作用域內(nèi),undefined依然是可變的

//window.undefined在局部作用域中是可以被修改的
  var testUndefined = function () {
      var obj = {}
      var undefined = 'underscore'
      var window = {
          'undefined': 'bb'
      }
      console.log(window)
      console.log(undefined)
      console.log(window.undefined)
      console.log(obj.name === undefined)
      console.log(obj.name === window.undefined)
      console.log(obj.name === (void 0))
  }
testUndefined()





3總結(jié)
以上的栗子證明如果想要知道一個(gè)變量是否等于undefined的時(shí)候,判斷不嚴(yán)謹(jǐn),存在風(fēng)險(xiǎn);undefined全局屬性可以被修改,這樣會(huì)導(dǎo)致判斷undefined存在風(fēng)險(xiǎn)。

4三、void 0
(1)void 是一元運(yùn)算符

void 運(yùn)算符對(duì)給定的表達(dá)式進(jìn)行求值,然后返回undefined

(2)語(yǔ)法

void expression
(3)描述

這個(gè)運(yùn)算符能向期望一個(gè)表達(dá)式的值是undefined的地方插入會(huì)產(chǎn)生副作用的表達(dá)式

void 運(yùn)算符通常只用于獲取 undefined的原始值,一般使用void(0)(等同于void 0)。在上述情況中,也可以使用全局變量undefined 來(lái)代替(假定其仍是默認(rèn)值)

(4)void 后跟著表達(dá)式,表達(dá)式中的語(yǔ)句會(huì)全部執(zhí)行

思考一下為什么void 66+99是NaN?為什么void (66+99)是undefined。

這是因?yàn)?void 66+99沒(méi)有加括號(hào),代碼從左到右執(zhí)行,void 66 是 undefined—undefined + 99是NaN

(5)void 返回值永遠(yuǎn)是undefined

    var a = void 0
    console.log(a)

    var a = console.log('hello world')
    console.log(a)

    var a = void alert('I am a girl')
    console.log(a)

    var a = void(66 + 99)
    console.log(a)
(6)void后面跟含有g(shù)etter屬性的函數(shù),會(huì)進(jìn)行調(diào)用執(zhí)行語(yǔ)句,不會(huì)返回值

    var dd = {
        a: 66,
        get view() {
            console.log(this.a);
            return this.a++;
        }
    }
    var cc = void dd.view // 66  void 會(huì)執(zhí)行計(jì)算
    cc // undefined
    dd.a // 67
5四、為什么要用void 0 替代undefined
①某些情況下用undefined判斷存在風(fēng)險(xiǎn),因undefined有被修改的可能性,但是void 0返回值一定是undefined

②兼容性上void 0 基本所有的瀏覽器都支持

③ void 0比undefined字符所占空間少。 ————————————————

版權(quán)聲明:本文為CSDN博主「傲嬌味的草莓」的原創(chuàng)文章 原文鏈接:https://blog.csdn.net/weixin_45709829/article/details/123795909

作者:傲嬌味的草莓

歡迎關(guān)注微信公眾號(hào) :前端陽(yáng)光