JavaScript 對象循環(huán)遍歷的四種方式,以及它們的優(yōu)缺點
如何在JavaScript 中循環(huán)對象屬性和值?它與數(shù)組不同,它們沒有內(nèi)置的循環(huán)方法。在這篇博文中,我將向您展示:循環(huán) JavaScript 對象的四種不同方法 ,每種方法的優(yōu)點和缺點。
循環(huán)對象鍵
JavaScript 對象鍵或?qū)傩允谴鎯υ趯ο笾械闹档拿Q或標識符。JavaScript 對象是JavaScript 中的非原始數(shù)據(jù)類型之一。它們可以是字符串、符號或數(shù)字,用于訪問或修改對象的值。例如,person.name 是一個返回 person 對象的名稱值的屬性。
const={
name:"John",
age:30,
favoriteColors:["Red","Green"]
};
我們將在整篇文章中使用同一個對象。
方法 1:JavaScript 使用 Object.keys() 循環(huán)對象鍵
JavaScript Object.keys()方法返回對象的所有鍵(或?qū)傩悦Q)的數(shù)組。然后,您可以使用 for 循環(huán)或 forEach() 方法來迭代數(shù)組并訪問鍵。要循環(huán)訪問 person 對象的鍵,您可以使用 Object.keys() 靜態(tài)方法,如下所示:
const keys = Object.keys(person);
// Output: ["name", "age", "favoriteColors"]
// 1. Using a for() loop
for (let i = 0; i < keys.length; i++) {
console.log(keys[i]);
}
// Output: "name", "age", "favoriteColors"
// 2. Using a forEach() method
keys.forEach(key => {
console.log(key);
});
// Output: "name", "age", "favoriteColors"
這種方法的優(yōu)點是:
- 它簡單易用。
- 它適用于任何對象,無論其結構或復雜性如何。
- 它與舊版瀏覽器兼容,因為它是 ECMAScript 5 標準的一部分。
這種方法的缺點是:
- 此方法為您提供對象自己的鍵。它忽略從原型鏈獲得的密鑰。有時,這正是您所需要的。其他時候,您可能也想包含這些鍵。
- 對象的鍵沒有固定的順序。這意味著您不能總是期望它們以相同的順序出現(xiàn)。如果您的邏輯取決于按鍵順序,請小心,因為它可能不會按您的預期工作。
- 這段代碼創(chuàng)建了另一個數(shù)組。這會減慢您的代碼速度并使用更多內(nèi)存。如果物體很大或有很多部分,情況會更糟。
方法 2:使用 Object.values() 循環(huán)對象值
Object.values() 為我們提供了一個包含對象所有值的數(shù)組。您可以循環(huán)數(shù)組并輕松獲取值。例如,看看這個 person 對象。您可以像這樣使用 Object.values() :
// Output: ["John", 40, ["Red", "Green"]]
// 1. Using a for() loop
for (let index = 0; index < values.length; index++) {
console.log(values[index]);
}
// Output: ["John", 40, ["Red", "Green"]
// 2. Using a forEach() method
values.forEach(key => {
});
// Output: ["John", 40, ["Red", "Green"]
這種方法的優(yōu)點是:
- 它簡單易用。
- 它適用于任何對象,無論其結構或復雜性如何。
- 它是 ECMAScript 2017 標準的一部分,這意味著它是一項現(xiàn)代且受到廣泛支持的功能。
這種方法的缺點是:
- 它只返回對象本身的值。這意味著它不包括從對象原型鏈繼承的值。這可能是也可能不是您想要的,具體取決于您的用例。
- Object.values() 不關心值的順序,因為對象沒有排序。如果您的代碼依賴于順序,這可能會成為問題。
- 這是一個新功能,因此一些舊瀏覽器不支持它。在這些情況下,您可能需要使用一些技巧才能使其發(fā)揮作用。
- Object.values() 使用值創(chuàng)建一個新數(shù)組,這會影響代碼使用的速度和內(nèi)存量。如果您的對象很大或很復雜,這可能是一個問題。
方法 3:使用 Object.entries() 循環(huán)對象條目
你想獲取一個對象的鍵值對嗎?你可以使用Object.entries()!它為您提供了一個數(shù)組數(shù)組,其中每個子數(shù)組都有一個鍵和一個值。然后,您可以使用 for 或 forEach 循環(huán)數(shù)組,并根據(jù)需要使用條目。
例如,使用與之前相同的 person 對象,您可以使用 Object.entries() 方法,如下所示:
// 1. Using a for() loop
for (let index = 0; index < entries.length; index++) {
}
// Output: ["name", "John"], ["age", 30], ["favoriteColors", ["Red", "Green"]]
// 2. Using a forEach() method
entries.forEach(entry => {
});
// Output: ["name", "John"], ["age", 30], ["favoriteColors", ["Red", "Green"]]
這種方法的優(yōu)點是:
- 它簡單易用。
- 它適用于任何對象,無論其結構或復雜性如何。
- 它是 ECMAScript 2017 標準的一部分,這意味著它是一項現(xiàn)代且受到廣泛支持的功能。
- 它返回對象的鍵和值,如果您需要在邏輯中訪問這兩個鍵和值,這會很有用。
這種方法的缺點是:
- 它只返回對象自己的條目,這意味著它不包括從對象原型鏈繼承的條目。這可能是也可能不是您想要的,具體取決于您的用例。
- 它不保證條目的順序,因為對象本質(zhì)上是無序的。如果您的邏輯依賴于條目的順序,這可能會導致一些問題。
- 它會創(chuàng)建一個額外的數(shù)組,這可能會影響代碼的性能和內(nèi)存使用情況,特別是在對象很大或嵌套的情況下。
- 它與舊版瀏覽器不兼容,因為它是一個相對較新的功能。您可能需要使用 polyfill 或轉(zhuǎn)譯器才能使其在較舊的環(huán)境中工作。
方法 4:JavaScript 使用 for...in 循環(huán)對象屬性
使用 for...in 循環(huán),您可以遍歷對象的所有屬性。它為您提供一個保存屬性名稱的變量。然后您可以使用帶有點或括號的變量來獲取屬性值。
例如,使用與之前相同的 person 對象,我們可以使用 for...in 語句,如下所示:
const person = {
name: "John",
age: 30,
favoriteColors: ["Red", "Green"]
};
// Using a for...in statement
for (let key in person) {
console.log(key); // Output: "name", "age", "favoriteColors"
console.log(person[key]); // Output: "John", 30, ["Red", "Green"]
}
這種方法的優(yōu)點是:
- 它簡單易用。
- 它不會創(chuàng)建額外的數(shù)組,這可能會提高代碼的性能和內(nèi)存使用率,特別是在對象很大或嵌套的情況下。
- 它返回對象的鍵和值,如果您需要在邏輯中訪問這兩個鍵和值,這會很有用。
這種方法的缺點是:
- 它返回對象的所有可枚舉屬性,這意味著它包括從對象原型鏈繼承的屬性。這可能是也可能不是您想要的,具體取決于您的用例。如果只想循環(huán)對象自身的屬性,則需要使用 hasOwnProperty() 方法過濾掉繼承的屬性。
- 它不保證屬性的順序,因為對象本質(zhì)上是無序的。如果您的邏輯依賴于屬性的順序,這可能會導致一些問題。
- 它與 JavaScript 的一些新功能不兼容,例如 Symbol 屬性或 Object.defineProperty()。這些功能可以創(chuàng)建 for…in 語句不可見的不可枚舉屬性。
不同循環(huán)對象屬性的比較
這是四種方法的快速比較表:
方法 | 退貨 | 擁有/全部 | 命令 | 表現(xiàn) | 兼容性 |
Object.keys() | 按鍵 | 自己的 | 不 | 低的 | 高的 |
Object.values() | 價值觀 | 自己的 | 不 | 低的 | 中等的 |
對象.entries() | 鍵值 | 自己的 | 不 | 低的 | 中等的 |
for...in | 特性 | 全部 | 不 | 高的 | 低的 |
在 JavaScript 中循環(huán)對象的最佳方法取決于您想要實現(xiàn)的目標以及您想要如何編寫代碼。但是,一般的經(jīng)驗法則是,如果要訪問對象的鍵、值或條目,則使用 Object 方法;如果要訪問對象的屬性及其原型鏈,則使用 for...in 語句。