JavaScript對(duì)象屬性遍歷與描述詳解
一、對(duì)象屬性的遍歷方法
1. for...in 循環(huán)
for...in
循環(huán)用于遍歷對(duì)象的可枚舉屬性,包括對(duì)象自身的屬性和繼承自原型鏈上的屬性。
收起
const obj = { id: 1, name: 'zhangsan', age: 18 }; for (let key in obj) { console.log(key + '---' + obj[key]); }
如果該屬性是可枚舉性的,那么這個(gè)屬性就能被 for...in
查找遍歷到。需要注意的是,它會(huì)包含原型上的屬性。
2. Object.keys() 和 Object.values()
Object.keys(obj)
:返回一個(gè)表示給定對(duì)象的所有可枚舉 自身屬性的鍵名組成的字符串?dāng)?shù)組。Object.values(obj)
:返回一個(gè)表示給定對(duì)象的所有可枚舉 自身屬性的值組成的數(shù)組。
const obj = { id: 1, name: 'zhangsan', age: 18 }; console.log(Object.keys(obj)); console.log(Object.values(obj));
參數(shù) obj
是要返回其枚舉自身屬性的對(duì)象。
3. Object.getOwnPropertyNames(obj)
該方法返回一個(gè)數(shù)組,包含對(duì)象自身的所有屬性(包含不可枚舉屬性),但不會(huì)獲取繼承自原型鏈上的屬性。通過(guò)遍歷該數(shù)組可以獲取屬性的 key
和 value
。
function Person() { this.name = '張三'; } Person.prototype = { constructor: Person, job: "student" }; var student1 = new Person(); Object.defineProperty(student1, 'age', { value: "33", enumerable: false // 設(shè)置為**不可枚舉**屬性 }); Object.getOwnPropertyNames(student1).forEach(function (key) { console.log(key + '---' + student1[key]); // 結(jié)果:name---張三 age---33 });
4. Object.entries()
Object.entries()
方法返回一個(gè)給定對(duì)象自身 可枚舉屬性的鍵值對(duì)數(shù)組,其排列與使用 for...in
循環(huán)遍歷該對(duì)象時(shí)返回的順序一致(區(qū)別在于 for-in
循環(huán)也枚舉繼承自原型鏈中的屬性)。
let per = { name: 'zdx', age: 18 }; for (let [key, value] of Object.entries(per)) { console.log(key, value); } // 輸出: // name zdx // age 18
5. Reflect.ownKeys()
Reflect.ownKeys(target)
方法返回所有的屬性 key
,包括不可枚舉類型,但不包括繼承的屬性。
let obj = { name: 'zhangsan', age: '18' }; console.log(Reflect.ownKeys(obj));
參數(shù) target
是獲取目標(biāo)對(duì)象的屬性,如果 target
不是對(duì)象則會(huì)報(bào)錯(cuò),返回值是由 target
自身屬性組成的數(shù)組。
二、對(duì)象屬性的描述
對(duì)象的每一個(gè)屬性都有一個(gè)描述對(duì)象,用來(lái)描述和控制該屬性的行為。可以使用 Object.getOwnPropertyDescriptor
方法來(lái)獲取該描述對(duì)象,使用 Object.defineProperty
方法來(lái)設(shè)置。
let obj = { start: '123' }; console.log(Object.getOwnPropertyDescriptor(obj, 'start')); // 輸出內(nèi)容: // { // configurable: true, // enumerable: true, // value: "123", // writable: true // } Object.defineProperty(obj, "sex", { value: "female", enumerable: false });
描述對(duì)象的四個(gè)屬性
- configurable:表示能否通過(guò)
delete
刪除此屬性,能否修改屬性的特性,或能否修改把屬性修改為訪問(wèn)器屬性。如果直接使用字面量定義對(duì)象,默認(rèn)值為true
。 - enumerable:表示該屬性是否可枚舉,即是否能通過(guò)
for-in
循環(huán)或Object.keys()
返回屬性。如果直接使用字面量定義對(duì)象,默認(rèn)值為true
。 - writable:表示能否修改屬性的值。如果直接使用字面量定義對(duì)象,默認(rèn)值為
true
。 - value:該屬性對(duì)應(yīng)的值,默認(rèn)為
undefined
。
與 enumerable 相關(guān)的操作
目前,有四個(gè)操作不包含 enumerable
為 false
的屬性:
for…in
循環(huán):只遍歷對(duì)象自身的和繼承的可枚舉的屬性。Object.keys()
:返回對(duì)象自身的所有可枚舉的屬性的鍵名。JSON.stringify()
:只串行化對(duì)象自身的可枚舉的屬性。Object.assign()
:拷貝對(duì)象自身的可枚舉的屬性。
三、區(qū)分自身屬性和原型屬性
對(duì)象的屬性有自身屬性和繼承自原型的屬性之分,自身屬性是對(duì)象自己的屬性,繼承自原型的屬性是存在于原型鏈上的屬性??梢允褂?nbsp;Object.prototype.hasOwnProperty()
判斷是自身屬性還是繼承自原型的屬性,而 in
操作符只可以判斷對(duì)象是否有某個(gè)屬性,不能判斷是自身的還是繼承自原型的。
綜上所述,掌握這些對(duì)象屬性的遍歷方法和屬性描述的知識(shí),能夠幫助我們更好地操作和管理 JavaScript 對(duì)象。
以上就是JavaScript對(duì)象屬性遍歷與描述詳解的詳細(xì)內(nèi)容,更多關(guān)于JavaScript對(duì)象屬性的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JavaScript實(shí)現(xiàn)讀取條碼中的二進(jìn)制數(shù)據(jù)
條碼是一種以機(jī)器可讀的可視形式表示數(shù)據(jù)的方法,我們可以從條碼獲取二進(jìn)制數(shù)據(jù),并通過(guò)不同方法去讀碼,下面我們就來(lái)看看如何實(shí)現(xiàn)讀取條碼中的二進(jìn)制數(shù)據(jù)吧2024-03-03CascadeView級(jí)聯(lián)組件實(shí)現(xiàn)思路詳解(分離思想和單鏈表)
本文介紹自己最近做省市級(jí)聯(lián)的類似的級(jí)聯(lián)功能的實(shí)現(xiàn)思路,為了盡可能地做到職責(zé)分離跟表現(xiàn)與行為分離,這個(gè)功能拆分成了2個(gè)組件并用到了單鏈表來(lái)實(shí)現(xiàn)關(guān)鍵的級(jí)聯(lián)邏輯,下一段有演示效果的gif圖2016-04-04Iview DatePicker 限制選擇當(dāng)前月份及以后的月份
文章介紹了如何使用iviewDatePicker組件限制用戶只能選擇當(dāng)前月份及以后的月份,并提供了相關(guān)的html代碼和js代碼示例,感興趣的朋友跟隨小編一起看看吧2024-11-11詳解全棧開發(fā)Vercel數(shù)據(jù)庫(kù)存儲(chǔ)服務(wù)
這篇文章主要為大家介紹了全棧開發(fā)Vercel數(shù)據(jù)庫(kù)存儲(chǔ)服務(wù)功能使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05JavaScript使用IEEE 標(biāo)準(zhǔn)進(jìn)行二進(jìn)制浮點(diǎn)運(yùn)算產(chǎn)生莫名錯(cuò)誤的解決方法
javascript做帶小數(shù)的計(jì)算時(shí),會(huì)出現(xiàn)9的循環(huán),以下方法幫助解決。2011-05-05在SSM框架下用laypage和ajax實(shí)現(xiàn)分頁(yè)和數(shù)據(jù)交互的方法
今天小編大家分享一篇在SSM框架下用laypage和ajax實(shí)現(xiàn)分頁(yè)和數(shù)據(jù)交互的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09Javascrip實(shí)現(xiàn)文字跳動(dòng)特效
這篇文章主要介紹了Javascrip實(shí)現(xiàn)文字跳動(dòng)特效的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-11-11ECharts異步加載數(shù)據(jù)與數(shù)據(jù)集(dataset)
這篇文章介紹了ECharts異步加載數(shù)據(jù)與數(shù)據(jù)集(dataset),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06JavaScript超詳細(xì)實(shí)現(xiàn)網(wǎng)頁(yè)輪播圖
這篇文章主要介紹了JavaScript超詳細(xì)實(shí)現(xiàn)網(wǎng)頁(yè)輪播圖,我們經(jīng)常會(huì)看到各種輪播圖的效果,它們到底是怎樣實(shí)現(xiàn)的呢?今天我們就一起來(lái)看一下具體實(shí)現(xiàn)方法吧2021-12-12