void 0是什么?為什么比undefined好用?
點擊上方?前端陽光,關(guān)注公眾號
回復加群,加入技術(shù)交流群交流群
1一、void 0 === undefined ?true!why?
源碼涉及到 undefined 表達都會被編譯成 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;
//等價于
if(context?===?undefined)?return?fn;
為什么呢?void文檔里面解釋道
void 運算符通常只能用于獲取 undefined 的原始值,一般用void(0),等同于void 0,也可以使用全局變量 undefined 替代。
那什么是void 0、void 0 有什么意義、與undefined有什么關(guān)系呢?我們一起來總結(jié)一下。
2二、為什么不直接寫 undefined
undefined 是 js 原始類型值之一,也是全局對象window的屬性,在一部分低級瀏覽器(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?可以改寫undefined
//舊版IE
var?undefined?=?'666'
console.log(undefined)//666?直接覆蓋改寫undefined
window.undefined在局部作用域中是可以被修改的 在ES5開始,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é)
以上的栗子證明如果想要知道一個變量是否等于undefined的時候,判斷不嚴謹,存在風險;undefined全局屬性可以被修改,這樣會導致判斷undefined存在風險。
4三、void 0
(1)void 是一元運算符
void 運算符對給定的表達式進行求值,然后返回undefined
(2)語法
void?expression
(3)描述
這個運算符能向期望一個表達式的值是undefined的地方插入會產(chǎn)生副作用的表達式
void 運算符通常只用于獲取 undefined的原始值,一般使用void(0)(等同于void 0)。在上述情況中,也可以使用全局變量undefined 來代替(假定其仍是默認值)
(4)void 后跟著表達式,表達式中的語句會全部執(zhí)行
思考一下為什么void 66+99是NaN?為什么void (66+99)是undefined。
這是因為 void 66+99沒有加括號,代碼從左到右執(zhí)行,void 66 是 undefined—undefined + 99是NaN
(5)void 返回值永遠是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ù),會進行調(diào)用執(zhí)行語句,不會返回值
????var?dd?=?{
????????a:?66,
????????get?view()?{
????????????console.log(this.a);
????????????return?this.a++;
????????}
????}
????var?cc?=?void?dd.view?//?66??void?會執(zhí)行計算
????cc?//?undefined
????dd.a?//?67
5四、為什么要用void 0 替代undefined
①某些情況下用undefined判斷存在風險,因undefined有被修改的可能性,但是void 0返回值一定是undefined
②兼容性上void 0 基本所有的瀏覽器都支持
③ void 0比undefined字符所占空間少。?————————————————
版權(quán)聲明:本文為CSDN博主「傲嬌味的草莓」的原創(chuàng)文章 原文鏈接:https://blog.csdn.net/weixin_45709829/article/details/123795909


往期推薦
我組建了技術(shù)交流群,里面有很多?大佬,歡迎進來交流、學習、共建?;貜?加群?即可。后臺回復「電子書」即可免費獲取?27本?精選的前端電子書!回復內(nèi)推,可內(nèi)推各廠內(nèi)推碼
???“分享、點贊、在看” 支持一波??
