JavaScript獲取對(duì)象鍵名的五種方法
一、核心方法對(duì)比表(一表打盡關(guān)鍵差異)
方法/語(yǔ)法 | 返回類型 | 繼承屬性 | 可枚舉性 | Symbol 鍵 | 鍵類型 | 排序規(guī)則 | 核心特性總結(jié) |
---|---|---|---|---|---|---|---|
Object.keys(obj) | 字符串?dāng)?shù)組 | ? 否 | ? 僅可枚舉 | ? 否 | 字符串 | 數(shù)值鍵升序,字符串鍵按插入順序 | 最常用,快速獲取對(duì)象自身可枚舉字符串鍵(忽略 Symbol 和不可枚舉鍵) |
for...in 循環(huán) | -(遍歷過(guò)程) | ? 是 | ? 僅可枚舉 | ? 否 | 字符串 | 同上 | 遍歷原型鏈可枚舉鍵,需手動(dòng)過(guò)濾原型屬性(hasOwnProperty ) |
Object.getOwnPropertyNames(obj) | 字符串?dāng)?shù)組 | ? 否 | ? 包含不可枚舉 | ? 否 | 字符串 | 同上 | 獲取對(duì)象自身所有字符串鍵(包括不可枚舉,如數(shù)組的 length ) |
Object.getOwnPropertySymbols(obj) | Symbol 數(shù)組 | ? 否 | ? 包含不可枚舉 | ? 是 | Symbol | 按 Symbol 創(chuàng)建順序 | 專門用于獲取對(duì)象自身的 Symbol 鍵(無(wú)論是否可枚舉) |
Reflect.ownKeys(obj) | 混合數(shù)組(字符串+Symbol) | ? 否 | ? 包含不可枚舉 | ? 是 | 混合 | 數(shù)值鍵→字符串鍵→Symbol鍵(按創(chuàng)建順序) | 終極方案:獲取對(duì)象自身所有鍵(字符串+Symbol,可枚舉+不可枚舉) |
二、逐方法詳解:適用場(chǎng)景與代碼示例
1. Object.keys(obj):快速提取可枚舉字符串鍵
用途:獲取對(duì)象自身的 可枚舉字符串鍵(最常用)
特點(diǎn):忽略繼承屬性、Symbol 鍵、不可枚舉鍵
示例:
const obj = { a: 1, b: 2, [Symbol('sym')]: 3 }; Object.defineProperty(obj, 'c', { value: 4, enumerable: false }); // 不可枚舉鍵 console.log(Object.keys(obj)); // ["a", "b"](僅返回可枚舉字符串鍵)
2. for...in 循環(huán):遍歷原型鏈可枚舉鍵(需過(guò)濾)
用途:遍歷對(duì)象(包括原型鏈)的 可枚舉字符串鍵注意:必須用 hasOwnProperty
排除原型屬性
示例:
const obj = { x: 1 }; Object.prototype.y = 2; // 原型屬性 for (const key in obj) { if (obj.hasOwnProperty(key)) { // 過(guò)濾原型屬性 console.log(key); // 輸出 "x"(忽略原型屬性 "y") } }
3. Object.getOwnPropertyNames(obj):獲取自身所有字符串鍵(含不可枚舉)
用途:獲取對(duì)象自身的 所有字符串鍵(包括不可枚舉鍵)
典型場(chǎng)景:處理數(shù)組的 length
(不可枚舉)或配置項(xiàng)
示例:
const arr = [1, 2, 3]; console.log(Object.getOwnPropertyNames(arr)); // ["0", "1", "2", "length"](包含不可枚舉的 length) const obj = { [Symbol('sym')]: 4 }; console.log(Object.getOwnPropertyNames(obj)); // 空數(shù)組(Symbol 鍵不被包含)
4. Object.getOwnPropertySymbols(obj):專屬 Symbol 鍵獲取
用途:?jiǎn)为?dú)獲取對(duì)象自身的 Symbol 鍵(無(wú)論是否可枚舉)
場(chǎng)景:處理通過(guò) Symbol()
創(chuàng)建的唯一鍵
示例:
const sym1 = Symbol('key1'); const sym2 = Symbol('key2'); const obj = { [sym1]: 'value1', [sym2]: 'value2' }; console.log(Object.getOwnPropertySymbols(obj)); // [Symbol(key1), Symbol(key2)]
5. Reflect.ownKeys(obj):終極全量鍵獲取
用途:獲取對(duì)象自身的 所有鍵(字符串+Symbol,可枚舉+不可枚舉)
排序規(guī)則:
- 數(shù)值鍵按升序(如
1
,2
→["1", "2"]
) - 字符串鍵按插入順序(如
a
,b
→["a", "b"]
) - Symbol 鍵按創(chuàng)建順序(如先創(chuàng)建的 Symbol 在前)
示例:
const obj = { 2: 'two', 1: 'one', b: 'string', a: 'string', [Symbol('sym1')]: 'sym1', [Symbol('sym2')]: 'sym2' }; console.log(Reflect.ownKeys(obj)); // 輸出順序:["1", "2", "a", "b", Symbol(sym1), Symbol(sym2)]
三、場(chǎng)景化選擇指南(快速?zèng)Q策)
需求場(chǎng)景 | 最佳方法 |
---|---|
快速獲取自身可枚舉字符串鍵 | Object.keys(obj) |
遍歷原型鏈可枚舉鍵(需過(guò)濾原型) | for...in + hasOwnProperty |
獲取自身所有字符串鍵(含不可枚舉) | Object.getOwnPropertyNames(obj) |
單獨(dú)獲取自身 Symbol 鍵 | Object.getOwnPropertySymbols(obj) |
獲取自身所有鍵(全量,含 Symbol) | Reflect.ownKeys(obj) |
四、避坑指南
- 原型鏈污染風(fēng)險(xiǎn):
for...in
會(huì)遍歷原型屬性,必須用obj.hasOwnProperty(key)
過(guò)濾 - Symbol 鍵特殊性:所有字符串鍵相關(guān)方法(如
Object.keys
)均會(huì)忽略 Symbol 鍵,需單獨(dú)處理 - 不可枚舉鍵陷阱:默認(rèn)方法(如
Object.keys
)只返回可枚舉鍵,操作length
等屬性時(shí)需用getOwnPropertyNames
五、總結(jié)
掌握這 5 種方法,就能應(yīng)對(duì) 99% 的對(duì)象鍵名操作場(chǎng)景:
- 高頻場(chǎng)景用
Object.keys
,簡(jiǎn)單直接 - 復(fù)雜場(chǎng)景(如包含 Symbol 或不可枚舉鍵)用
Reflect.ownKeys
兜底 - 遍歷場(chǎng)景注意原型鏈過(guò)濾,避免不必要的屬性干擾
通過(guò)表格對(duì)比和場(chǎng)景化選擇,從此告別「該用哪個(gè)方法」的困惑,高效操作對(duì)象鍵名!
以上就是JavaScript獲取對(duì)象鍵名的五種方法的詳細(xì)內(nèi)容,更多關(guān)于JavaScript獲取對(duì)象鍵名的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Jsonp 關(guān)鍵字詳解及json和jsonp的區(qū)別,ajax和jsonp的區(qū)別
這篇文章主要介紹了Jsonp 關(guān)鍵字詳解及json和jsonp的區(qū)別,ajax和jsonp的區(qū)別 的相關(guān)資料,需要的朋友可以參考下2015-12-12前端根據(jù)后端返回的文本流逐個(gè)展示文本內(nèi)容代碼示例
前端如何根據(jù)后端返回的文本流逐個(gè)展示文本內(nèi)容的實(shí)現(xiàn)步驟,前端調(diào)用特定方法來(lái)獲取文本流,然后通過(guò)處理這些文本流,逐個(gè)在界面上展示文本內(nèi)容,需要的朋友可以參考下2025-01-01微信小程序?qū)崿F(xiàn)授權(quán)登錄之獲取用戶信息
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)授權(quán)登錄之獲取用戶信息,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05HTML+JavaScript實(shí)現(xiàn)筋斗云導(dǎo)航欄效果
這篇文章主要為大家介紹了如何利用HTML+JavaScript+CSS實(shí)現(xiàn)筋斗云導(dǎo)航欄效果,當(dāng)鼠標(biāo)經(jīng)過(guò)某個(gè)li,筋斗云跟著到當(dāng)前的位置,感興趣的小伙伴可以試一試2022-03-03JavaScript模擬實(shí)現(xiàn)加入購(gòu)物車飛入動(dòng)畫效果
這篇文章主要為大家詳細(xì)介紹了如何使用JavaScript模擬實(shí)現(xiàn)加入購(gòu)物車飛入動(dòng)畫效果,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考下2024-03-03幾個(gè)比較實(shí)用的JavaScript 測(cè)試及效驗(yàn)工具
JavaScript 是一款強(qiáng)大的廣泛運(yùn)用于現(xiàn)代Web站點(diǎn)及應(yīng)用的腳本語(yǔ)言。作為一個(gè)技藝精湛的 Web 開發(fā)者,掌握J(rèn)avaScript可以增強(qiáng)用戶的使用體驗(yàn),提供交互及富客戶端等功能。2010-04-04