欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解JS如何判斷對(duì)象上是否存在某個(gè)屬性

 更新時(shí)間:2023年05月31日 08:30:58   作者:只會(huì)番茄炒蛋  
判斷某一個(gè)對(duì)象里面是否存在某個(gè)屬性,是常見錯(cuò)誤場(chǎng)景排查,但是你真的知道該如何使用嘛,本文為大家整理了常用的三種方法,希望對(duì)大家有所幫助

判斷某一個(gè)對(duì)象里面是否存在某個(gè)屬性,常見錯(cuò)誤場(chǎng)景排查,但是你真的知道該如何使用嘛。

關(guān)于這個(gè)問題,大家第一眼看到腦海中肯定會(huì)有多種方案去實(shí)現(xiàn),但你有具體想過每個(gè)方案的實(shí)現(xiàn)有哪些其他問題存在嘛,這樣的寫法是否錯(cuò)誤等,實(shí)際上在實(shí)現(xiàn)這個(gè)需求的的時(shí)候大家都會(huì)犯很多常見的問題。這個(gè)問題也是往往能考察出大家基礎(chǔ)知識(shí)掌握的熟練不熟練。

以下列出幾種錯(cuò)誤的寫法,方便大家去思考錯(cuò)在哪里,為什么錯(cuò)了

第一種

判斷這個(gè)屬性是否有值

/**
 * @method hasProperty 判斷對(duì)象中是否存在某個(gè)屬性
 * @param {Object} obj
 * @param {String} key
 * @returns Boolean
 */
function hasProperty(obj, key) {
  return obj[key] !== undefined;
}

以上的方法有個(gè)明顯的錯(cuò)誤,假如我這個(gè)對(duì)象剛好有個(gè)屬性的值就是undefined的話

const obj = { a: undefined };
hasProperty(obj, "a"); // false

所以不能用undefined去做判斷

第二種

通過Object.keys()方法得到對(duì)象里所有屬性形成的數(shù)組,然后使用includes方法判斷該屬性存不存在

/**
 * @method hasProperty 判斷對(duì)象中是否存在某個(gè)屬性
 * @param {Object} obj
 * @param {String} key
 * @returns Boolean
 */
function hasProperty(obj, key) {
  return Object.keys(obj).includes(key);
}

const obj = { a: undefined };
hasProperty(obj, "a"); // true

通過上述方法,我們發(fā)現(xiàn)它實(shí)現(xiàn)了第一種方式不能判斷undefined的方法,感覺這個(gè)方法好像可以,但是有另外的一種情況它又不能判斷了

const obj = { a: undefined, b: 1 };

Object.defineProperty(obj, "c", {
  value: 2,
  enumerable: false,
});

console.log(obj.c); // 2

hasProperty(obj, "c"); // false

我們通過Object.defineProperty給該對(duì)象添加一個(gè)c屬性值為2,但是不可遍歷,這時(shí)候發(fā)現(xiàn)判斷c屬性是否存在時(shí)是拿不到c的,說明這種方案也存在缺陷。

第三種

使用js提供的一個(gè)函數(shù)hasOwnProperty,這是js專門提供的一個(gè)用來判斷對(duì)象里面是否存在某一個(gè)屬性的方法

/**
 * @method hasProperty 判斷對(duì)象中是否存在某個(gè)屬性
 * @param {Object} obj
 * @param {String} key
 * @returns Boolean
 */
function hasProperty(obj, key) {
  return obj.hasOwnProperty(key);
}

const obj = { a: undefined, b: 1 };

Object.defineProperty(obj, "c", {
  value: 2,
  enumerable: false,
});

hasProperty(obj, "c"); // true

我們發(fā)現(xiàn)這個(gè)方案實(shí)現(xiàn)了上述兩種方案缺陷的部分,也能正確的判斷了,但是問題來了,這個(gè)方法有沒有缺陷呢?沒錯(cuò)它也有缺陷

console.log(hasProperty(obj, "toString")); // false
console.log(obj.toString); // [Function: toString]

沒錯(cuò),如果你基礎(chǔ)知識(shí)掌握的可以的話你會(huì)知道,對(duì)象的原型鏈上存在一個(gè)toString方法,但是上述的方案就沒辦法判斷了,因?yàn)閔asOwnProperty只能判斷自身的屬性,沒有辦法判斷原型鏈上的屬性,但通常我們能說到這個(gè)方案也基本可以了。那有沒有最終的解決方案呢

最佳方案

通過 in 關(guān)鍵判斷,它不單單能判斷屬性是否在對(duì)象身上,它還可以通過原型鏈去查找

/**
 * @method hasProperty 判斷對(duì)象中是否存在某個(gè)屬性
 * @param {Object} obj
 * @param {String} key
 * @returns Boolean
 */
function hasProperty(obj, key) {
  return key in obj;
}

const obj = { a: undefined, b: 1 };

Object.defineProperty(obj, "c", {
  value: 2,
  enumerable: false,
});

hasProperty(obj, "toString"); // true

通過上述的幾種方案我想大家應(yīng)該知道為什么會(huì)采用最后一種方案來判斷對(duì)象上是否存在某個(gè)屬性,當(dāng)然在某些業(yè)務(wù)場(chǎng)景下可能上述的幾種方案都能滿足需求,但我們一定是熟練掌握基礎(chǔ)知識(shí)后才能知道在哪種業(yè)務(wù)場(chǎng)景下使用哪種方案。

到此這篇關(guān)于詳解JS如何判斷對(duì)象上是否存在某個(gè)屬性的文章就介紹到這了,更多相關(guān)JS判斷對(duì)象是否存在屬性內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JS實(shí)現(xiàn)點(diǎn)擊文本框改變背景顏色

    JS實(shí)現(xiàn)點(diǎn)擊文本框改變背景顏色

    這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)點(diǎn)擊文本框改變背景顏色,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 在前端中Proj4.js使用簡單介紹及進(jìn)階應(yīng)用

    在前端中Proj4.js使用簡單介紹及進(jìn)階應(yīng)用

    這篇文章主要介紹了在前端中Proj4.js使用簡單介紹及進(jìn)階應(yīng)用的相關(guān)資料,Proj4是一個(gè)用于處理JavaScript里的幾何圖形和坐標(biāo)計(jì)算的庫,它提供了多邊形、點(diǎn)、線等幾何對(duì)象的計(jì)算功能,需要的朋友可以參考下
    2025-01-01
  • JS的時(shí)間格式化和時(shí)間戳轉(zhuǎn)換函數(shù)示例詳解

    JS的時(shí)間格式化和時(shí)間戳轉(zhuǎn)換函數(shù)示例詳解

    這篇文章主要介紹了JS的時(shí)間格式化和時(shí)間戳轉(zhuǎn)換函數(shù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 微信小程序使用Echarts和分包的完整步驟

    微信小程序使用Echarts和分包的完整步驟

    這篇文章主要給大家介紹了關(guān)于微信小程序使用Echarts和分包的完整步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • JS實(shí)現(xiàn)微信

    JS實(shí)現(xiàn)微信"炸屎"大作戰(zhàn)功能

    這篇文章主要介紹了JS實(shí)現(xiàn)微信 "炸屎"大作戰(zhàn),本文通過實(shí)例代碼圖文展示給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • 如何安裝控制器JavaScript生成插件詳解

    如何安裝控制器JavaScript生成插件詳解

    這篇文章主要給大家介紹了關(guān)于如何安裝控制器JavaScript生成插件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10
  • layui擴(kuò)展上傳組件模擬進(jìn)度條的方法

    layui擴(kuò)展上傳組件模擬進(jìn)度條的方法

    今天小編就為大家分享一篇 layui擴(kuò)展上傳組件模擬進(jìn)度條的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • Javascript中的包裝類型介紹

    Javascript中的包裝類型介紹

    這篇文章主要介紹了Javascript中的包裝類型介紹,包裝類型是指在執(zhí)行代碼的一瞬間把數(shù)據(jù)包裝成引用類型,本文講解的就是這個(gè)小知識(shí),需要的朋友可以參考下
    2015-04-04
  • JavaScript中雙符號(hào)的運(yùn)算詳解

    JavaScript中雙符號(hào)的運(yùn)算詳解

    這篇文章主要給大家介紹了JavaScript中雙符號(hào)的運(yùn)算,其中包括雙波浪號(hào)和雙感嘆號(hào)的運(yùn)算,文中給出了詳細(xì)的示例代碼,需要的朋友們可以參考借鑒,下面來一起看看吧。
    2017-03-03
  • 顯示/隱藏側(cè)邊欄

    顯示/隱藏側(cè)邊欄

    顯示/隱藏側(cè)邊欄...
    2006-10-10

最新評(píng)論