JavaScript中???、??=、?.和?||的區(qū)別淺析
前言
undefined和null是兩個(gè)比較特殊的數(shù)據(jù)類型,是不能用點(diǎn)操作符去訪問屬性的,否則將會(huì)報(bào)錯(cuò)
let a;
console.log(a?.name); //undefined
console.log(a.name); //報(bào)錯(cuò)
let obj = {};
console.log(obj.name); //undefined
console.log(obj?.name?.a); //undefined
console.log(obj.name.a); //報(bào)錯(cuò)
?? 與 || 的區(qū)別
相同點(diǎn):
?? 和 || 的用法相同,都是前后是值,中間用符號(hào)連接,根據(jù)前面的值來判斷最終是返回前面的值還是后面的值。
A ?? B
A || B
不同點(diǎn):
判斷的方法不同:
使用 ?? 時(shí),只有A為 null 或者 undefined 時(shí)才會(huì)返回 B;
使用 || 時(shí),A會(huì)先轉(zhuǎn)化為布爾值判斷,為true時(shí)返回A , false 返回B
// ??
console.log(undefined ?? 2); // 2
console.log(null ?? 2); // 2
console.log(0 ?? 2); // 0
console.log("" ?? 2); // ''
console.log(true ?? 2); // true
console.log(false ?? 2); // false
// ||
console.log(undefined || 2); // 2
console.log(null || 2); // 2
console.log(0 || 2); // 2
console.log("" || 2); // 2
console.log(true || 2); // true
console.log(false || 2); // 2空值合并操作符 ??
只有當(dāng)左側(cè)為null 或者undefined 時(shí),才會(huì)返回右側(cè)的值
可選鏈操作符 ?.
?. 允許讀取連接對(duì)象鏈深處的屬性的值,而不必明確驗(yàn)證鏈中的每個(gè)引用是否有效。
?. 操作符的功能類似于. 鏈操作符,不同之處在于,在引用為空,即 null 或者 undefined 的情況下不會(huì)引起錯(cuò)誤,該表達(dá)式短路返回值。
const obj = { a: { b: [{ name: "obj" }] } };
// 原本的寫法
console.log(obj && obj.a && obj.a.b.length && obj.a.b[0].name); //obj
// 可選鏈寫法
console.log(obj?.a?.b?.[0]?.name); // obj
console.log(obj?.b?.c?.d); // undefined?.可以和 ?? 運(yùn)算符結(jié)合使用
const obj = { a: { name: "obj" } };
console.log(obj?.a?.b ?? "hello world"); // hello world空值賦值運(yùn)算符(??=)
當(dāng)??=左側(cè)的值為null、undefined的時(shí)候,才會(huì)將右側(cè)變量的值賦值給左側(cè)變量.其他所有值都不會(huì)進(jìn)行賦值
let a = "你好";
let b = null;
let c = undefined;
let d = 0;
let e = "";
let f = true;
let g = false;
console.log((b ??= a)); // 你好
console.log((c ??= a)); // 你好
console.log((d ??= a)); // 0
console.log((e ??= a)); // ''
console.log((f ??= a)); // true
console.log((g ??= a)); // false
console.log(b); // 你好
console.log(c); // 你好
console.log(d); // 0
console.log(e); // ''
console.log(f); // true
console.log(g); // false補(bǔ)充:?. 鏈判斷運(yùn)算符
鏈判斷運(yùn)算符?. 允許開發(fā)人員讀取深度嵌套在對(duì)象鏈中的屬性值,而不必驗(yàn)證每個(gè)引用。當(dāng)引用為空時(shí),表達(dá)式停止計(jì)算并返回 undefined。
let travelPlans = {
destination: 'DC',
monday: {
location: 'National Mall',
budget: 200,
host: null
}
}
let res = travelPlans?.tuesday?.location ?? "locahost"; // => locahost
let res2 = travelPlans?.host; // => undefined
這個(gè)是什么操作呢??
這個(gè)location是哪里來的呢?這個(gè)tuesday又是哪里來的呢?就算不是外面的travelPlans這個(gè)對(duì)象里也沒有l(wèi)ocation和tuesday?。。。〗?jīng)過詢問大佬后得
let res = travelPlans?.tuesday?.location; <=等價(jià)=> let res = travelPlans&& travelPlans.tuesday&& travelPlans.tuesday.location
作用就是判斷這個(gè)對(duì)象(travelPlans)下的(tuesday)下的(location)是否為null或者undefined,當(dāng)其中一鏈為null或者undefined時(shí)就返回undefined,這樣即使中間缺少一個(gè)屬性也不會(huì)報(bào)錯(cuò),雙問號(hào)后面接的就是默認(rèn)值。
總結(jié)
到此這篇關(guān)于JavaScript中? ?、??=、?.和 ||區(qū)別的文章就介紹到這了,更多相關(guān)JS中? ?和??=和?.和 ||區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
原生js canvas實(shí)現(xiàn)鼠標(biāo)跟隨效果
這篇文章主要為大家詳細(xì)介紹了原生js canvas實(shí)現(xiàn)鼠標(biāo)跟隨效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08
JS鮮為人知的問題之[] == ![]結(jié)果為true、而{} == !{}卻為false
這篇文章主要給大家介紹了關(guān)于JS鮮為人知的問題之[] == ![]結(jié)果為true、而{} == !{}卻為false的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
淺析JavaScript中的同名標(biāo)識(shí)符優(yōu)先級(jí)
這篇文章主要介紹了JavaScript中的同名標(biāo)識(shí)符優(yōu)先級(jí)。需要的朋友可以過來參考下,希望對(duì)大家有所幫助2013-12-12
使用Auto.js?調(diào)用系統(tǒng)短信、電話模塊實(shí)現(xiàn)功能
這篇文章主要介紹了如何使用Auto.js調(diào)用系統(tǒng)短信與電話模塊,并實(shí)現(xiàn)讀取短信與聯(lián)系人的功能,并給出了實(shí)現(xiàn)相應(yīng)功能的代碼2023-03-03
利用Javascript判斷操作系統(tǒng)的類型實(shí)現(xiàn)不同操作系統(tǒng)下的兼容性
在通過Javascript實(shí)現(xiàn)客戶端和服務(wù)端的交互時(shí),有時(shí)候需要對(duì)操作系統(tǒng)進(jìn)行判斷,以便實(shí)現(xiàn)不同操作系統(tǒng)下的兼容性;從而實(shí)現(xiàn)網(wǎng)站在跨平臺(tái)瀏覽時(shí)候保持良好的用戶體驗(yàn),感興趣的朋友可以了解下啊,或許對(duì)你有所幫助2013-01-01
javaScript讓文本框內(nèi)的最后一個(gè)文字的后面獲得焦點(diǎn)實(shí)現(xiàn)代碼
讓文本框內(nèi)的最后一個(gè)文字的后面獲得焦點(diǎn),在應(yīng)用中很常見,接下來提供解決方案,按興趣的朋友可以了解下2013-01-01

