Object.entries
모두 반환 可枚举
的键值对,不会追寻原型链上的 key
let obj = { key1: 'value1', key2: 'value2', key3: 'value3', } Object.entries(obj).forEach(entry => { let key = entry[0] let value = entry[1] // entry 会是这样 ["key1", "value1"] })
Object.keys
객체의 열거 가능한 모든 키를 반환
let obj = { key1: 'value1', key2: 'value2', key3: 'value3', } Object.keys(obj).forEach(key => { let value = obj[key] })
Object.values
반환 객체의 모든 열거 가능한 키 값
let obj = { key1: 'value1', key2: 'value2', key3: 'value3', } Object.values(obj).forEach(value => { // 只能使用 value })
for…in loop
열거 가능한 속성을 반복하고 프로토타입 체인을 따라 검색됩니다.
let obj = { key1: 'value1', key2: 'value2', key3: 'value3', } for (const key in obj) { let value = obj[key] if (obj.hasOwnProperty(key)) { // 本身的 } else { // 来自原型链的 } }
Object.getOwnPropertyNames
객체의 모든(열거 불가능한 키 포함) 키(원본 텍스트 포함)를 반환합니다. 프로토타입 체인을 찾을 수 있다는 말은 옳지 않습니다.)
let obj = { key1: 'value1', key2: 'value2', key3: 'value3', } Object.getOwnPropertyNames(obj).forEach(key => { let value = obj[key] })
성능 비교
다음 코드는 위 메소드를 사용하여 1,000,000개의 속성을 가진 객체를 순회하고 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] }) )
다음 결과는 제가 직접 실행한 결과입니다. , 순차는 값을 할당할 때 인덱스를 직접 사용하는 것을 의미하고, 무작위는 키-값 쌍에 임의의 숫자를 삽입하는 것을 의미합니다. 또한 얻은 성능 순위는 작성자의 순위와 동일합니다. 또한 node.js와 chrome은 모두 V8이므로 이것도 성능을 나타냅니다. 브라우저에서 정렬.
// 顺序 ;[ ['FORIN', 4677.321499], ['KEYS', 4812.776572], ['GETOWP', 8610.906197], ['VALUES', 9914.674390999999], ['ENTRIES', 19338.083694], ] // 随机 ;[ ['KEYS', 4502.579589], ['FORIN', 4678.013548000001], ['GETOWP', 8880.325031999999], ['VALUES', 10104.106962], ['ENTRIES', 17089.637588999998], ]
엔진이 더 빠르게 작동하기 위해 다음 값을 추측한다고 들었습니다. 데이터를 보면 큰 영향을 미치지 않는 것 같습니다.
그것도 약간의 유용한 정보입니다. 오셔서 원본 기사에 오셔서 저자에게 박수를 보내주세요
추천 튜토리얼: "JS Tutorial"
위 내용은 JavaScript 객체 반복 방법 및 성능 비교의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!