這篇文章主要介紹了js對(duì)象迭代方法與性能的比較,具有一定借鑒價(jià)值,需要的朋友可以參考下。如下資料是關(guān)于javascript對(duì)象迭代方法的詳細(xì)內(nèi)容。
成都創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供林州網(wǎng)站建設(shè)、林州做網(wǎng)站、林州網(wǎng)站設(shè)計(jì)、林州網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、林州企業(yè)網(wǎng)站模板建站服務(wù),十載林州做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
Object.entries
返回對(duì)象所有可枚舉
的鍵值對(duì),不會(huì)追尋原型鏈上的 key
let obj = { key1: 'value1', key2: 'value2', key3: 'value3', } Object.entries(obj).forEach(entry => { let key = entry[0] let value = entry[1] // entry 會(huì)是這樣 ["key1", "value1"] })
Object.keys
返回對(duì)象所有可枚舉的鍵
let obj = { key1: 'value1', key2: 'value2', key3: 'value3', } Object.keys(obj).forEach(key => { let value = obj[key] })
Object.values
返回對(duì)象所有可枚舉的值
let obj = { key1: 'value1', key2: 'value2', key3: 'value3', } Object.values(obj).forEach(value => { // 只能使用 value })
for…in loop
迭代可枚舉屬性,會(huì)順著原型鏈找下去
let obj = { key1: 'value1', key2: 'value2', key3: 'value3', } for (const key in obj) { let value = obj[key] if (obj.hasOwnProperty(key)) { // 本身的 } else { // 來自原型鏈的 } }
Object.getOwnPropertyNames
返回對(duì)象所有(包括不可枚舉)的鍵(原文說會(huì)找原型鏈?zhǔn)清e(cuò)的)
let obj = { key1: 'value1', key2: 'value2', key3: 'value3', } Object.getOwnPropertyNames(obj).forEach(key => { let value = obj[key] })
性能比較
下面的代碼用上面的幾種方法遍歷有 1000000 個(gè)屬性的對(duì)象,循環(huán) 10 次
const { PerformanceObserver, performance } = require('perf_hooks') let objectSize = 1000000 let iterations = 10 console.log( 'Starting performance test with %d object size and %d iterations', objectSize, iterations ) let values = { ENTRIES: 0, KEYS: 0, VALUES: 0, FORIN: 0, GETOWP: 0, } const obs = new PerformanceObserver(items => { let entry = items.getEntries()[0] console.log(entry.name, entry.duration) values[entry.name] += entry.duration performance.clearMarks() }) obs.observe({ entryTypes: ['measure'] }) function generateObject() { let obj = {} for (let i = 0; i < objectSize; i++) { obj['key' + Math.random()] = 'val' + Math.random() } return obj } for (let i = 0; i < iterations; i++) { let obj = generateObject() //Object.entries performance.mark('A') Object.entries(obj).forEach(entry => { let key = entry[0] let value = entry[1] }) performance.mark('B') performance.measure('ENTRIES', 'A', 'B') //Object.Keys performance.mark('A') Object.keys(obj).forEach(key => { let value = obj[key] }) performance.mark('B') performance.measure('KEYS', 'A', 'B') //Object.Values performance.mark('A') Object.values(obj).forEach(value => {}) performance.mark('B') performance.measure('VALUES', 'A', 'B') //For In performance.mark('A') for (const key in obj) { let value = obj[key] } performance.mark('B') performance.measure('FORIN', 'A', 'B') //Object.getOwnPropertyNames performance.mark('A') Object.getOwnPropertyNames(obj).forEach(key => { let value = obj[key] }) performance.mark('B') performance.measure('GETOWP', 'A', 'B') } console.log( Object.entries(values).sort((a, b) => { return a[1] - b[1] }) )
下面的結(jié)果是我自己跑的,順序的是指賦值的時(shí)候直接用 index,隨機(jī)則是鍵值對(duì)都插入隨機(jī)數(shù),得到的性能排序是和作者一樣的,也因?yàn)?node.js 和 chrome 都是 V8,所以這個(gè)應(yīng)該也是代表在瀏覽器上的性能排序。
// 順序 ;[ ['FORIN', 4677.321499], ['KEYS', 4812.776572], ['GETOWP', 8610.906197], ['VALUES', 9914.674390999999], ['ENTRIES', 19338.083694], ] // 隨機(jī) ;[ ['KEYS', 4502.579589], ['FORIN', 4678.013548000001], ['GETOWP', 8880.325031999999], ['VALUES', 10104.106962], ['ENTRIES', 17089.637588999998], ]
之前聽說引擎會(huì)猜測(cè)下一個(gè)值讓運(yùn)行速度更快,看數(shù)據(jù)似乎沒有太大影響。
以上就是js對(duì)象迭代方法與性能比較的詳細(xì)內(nèi)容了,看完之后是否有所收獲呢?如果想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊!
文章名稱:js對(duì)象迭代方法與性能的比較
文章地址:http://aaarwkj.com/article18/ggphdp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、外貿(mào)建站、自適應(yīng)網(wǎng)站、ChatGPT、網(wǎng)站導(dǎo)航、
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)