1. 介紹|for…in 陳述式能解決什麼問題?
JavaScript 是網頁開發中最廣泛使用的程式語言之一。其眾多功能中,迴圈是處理資料重複操作的關鍵。特別是 for…in 陳述式,在遍歷物件屬性時非常實用。
本文目的
在本文中,我們將詳細說明以下重點:
- JavaScript for…in 迴圈的基本語法與用法
- 在陣列上使用事項
- 與其他迴圈結構(for…of 與 forEach)的差異
- 常見錯誤與解決方式
你將學到
- 如何有效地處理物件屬性與陣列元素
- for…in 陳述式的使用注意點與安全寫法
- 實作範例與效能比較
本文的架構旨在為初學者與中階 JavaScript 開發者提供實用知識。接下來的章節將從 for…in 陳述式的基礎說起。
2. 什麼是 JavaScript for…in 陳述式?【基本說明】
在 JavaScript 中,for…in 陳述式 用於遍歷物件的屬性。此語法特別適合物件,讓你一次處理每一個屬性名稱(key)。
基本語法
以下是 for…in 迴圈的基本語法:
for (variable in object) {
// Repeated processing
}
參數說明:
variable:儲存目前的屬性名稱(key)。
object:你想要遍歷的目標物件。
使用範例:列舉物件屬性
const person = {
name: "Taro",
age: 25,
city: "Tokyo"
};
for (const key in person) {
console.log(`${key}: ${person[key]}`);
}
輸出:
name: Taro
age: 25
city: Tokyo
注意:列舉屬性的順序
for…in 迴圈中屬性的順序並不保證。依照 JavaScript 規範,當鍵為字串時,順序可能不會與插入順序相同。若需要嚴格的順序,請改用 Object.keys() 等方式。
功能小結
- 輕鬆取得物件鍵值:在動態存取屬性名稱時當有用。
- 僅列舉可枚舉屬性:
enumerable: false的屬性會被排除。 - 也會列舉原型繼承的屬性:這可能會造成問題,下一節將說明相關情況。

3. 陣列與 for…in 陳述式|關鍵注意點
JavaScript 的 for…in 陳述式 主要設計用來列舉物件屬性,但也可以用在陣列上。然而,將它套用於陣列時會有多項限制與陷阱。以下將詳細探討其行為與常見問題。
陣列的基本行為
請參考以下範例:
const fruits = ["Apple", "Banana", "Orange"];
for (const index in fruits) {
console.log(index, fruits[index]);
}
輸出:
0 Apple
1 Banana
2 Orange
注意 1:原型屬性可能被列舉
Array.prototype.newMethod = function () {
return "New Method";
};
for (const index in fruits) {
console.log(index, fruits[index]);
}
輸出:
0 Apple
1 Banana
2 Orange
newMethod undefined
解決方案:
for (const index in fruits) {
if (fruits.hasOwnProperty(index)) {
console.log(index, fruits[index]);
}
}
注意 2:順序不保證
const data = [];
data[10] = "Apple";
data[1] = "Banana";
data[5] = "Orange";
for (const index in data) {
console.log(index, data[index]);
}
輸出:
1 Banana
5 Orange
10 Apple
注意 3:索引會被視為字串
const numbers = [10, 20, 30];
for (const index in numbers) {
console.log(typeof index); // "string"
}
解決方案:
for (const index in numbers) {
const numIndex = parseInt(index, 10);
console.log(numIndex, numbers[numIndex]);
}
摘要
- for…in 陳述式更適合用於物件而非陣列。
- 對於順序和數值索引處理,建議使用 for…of 或傳統的 for 迴圈。

4. for…in 和 for…of 的差異【比較表格】
在 JavaScript 中,for…in 和 for…of 皆可用於迴圈,但它們的使用情境和行為有所不同。
語法比較
for…in:
const obj = { a: 1, b: 2, c: 3 };
for (const key in obj) {
console.log(key); // Retrieves keys
}
for…of:
const arr = [10, 20, 30];
for (const value of arr) {
console.log(value); // Retrieves values
}
比較表格
| Aspect | for…in | for…of |
|---|---|---|
| Target | Objects and arrays | Arrays and iterable objects |
| Output | Property names (keys) | Values themselves |
| Prototype Enumeration | May include prototype properties | Does not enumerate prototype properties |
| Order Guarantee | Not guaranteed | Guaranteed |
實際範例|陣列處理
const arr = ['a', 'b', 'c'];
// for...in
for (const index in arr) {
console.log(index); // Output: 0, 1, 2
}
// for...of
for (const value of arr) {
console.log(value); // Output: 'a', 'b', 'c'
}
摘要
- for…in: 最適合處理物件鍵值。
- for…of: 最適合陣列和可迭代物件。
5. 實際應用:for…in 陳述式的應用與最佳實務
在這裡,我們將探討 JavaScript for…in 陳述式 的實際應用,並介紹在實際開發中有用的最佳實務。
1. 範例 1|篩選物件屬性
const user = {
name: "Tanaka",
age: 30,
email: "tanaka@example.com",
password: "secret123"
};
const publicData = {};
for (const key in user) {
if (key !== "password") {
publicData[key] = user[key];
}
}
console.log(publicData);
輸出:
{ name: 'Tanaka', age: 30, email: 'tanaka@example.com' }
2. 範例 2|處理巢狀物件
const data = {
user: {
name: "Sato",
info: {
age: 28,
city: "Osaka"
}
}
};
function printNested(obj) {
for (const key in obj) {
if (typeof obj[key] === "object") {
printNested(obj[key]);
} else {
console.log(`${key}: ${obj[key]}`);
}
}
}
printNested(data);
輸出:
name: Sato
age: 28
city: Osaka
3. 最佳實務|排除原型屬性
const obj = { a: 1, b: 2 };
Object.prototype.c = 3;
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
console.log(`${key}: ${obj[key]}`);
}
}
輸出:
a: 1
b: 2
摘要
- 我們介紹了用於篩選和處理巢狀物件的適當使用情境。
- 使用 hasOwnProperty() 來防止意外的原型繼承被枚舉。

6. for…in 的常見錯誤與解決方案【適合初學者】
1. 錯誤範例 1|原型屬性被枚舉
const obj = { a: 1, b: 2 };
Object.prototype.c = 3;
for (const key in obj) {
console.log(key, obj[key]);
}
輸出:
a 1
b 2
c 3
解決方案:
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
console.log(key, obj[key]);
}
}
2. 錯誤範例 2|將 for…in 用於陣列
const arr = [10, 20, 30];
Array.prototype.extra = "Additional Data";
for (const index in arr) {
console.log(index, arr[index]);
}
輸出:
0 10
1 20
2 30
extra undefined
解決方案:
for (const value of arr) {
console.log(value);
}
3. 錯誤範例 3|處理未定義值
const obj = { a: 1, b: undefined, c: 3 };
for (const key in obj) {
console.log(key, obj[key]);
}
解決方案:
for (const key in obj) {
const value = obj[key] ?? "Default Value";
console.log(key, value);
}
摘要
- 原型屬性問題: 使用 hasOwnProperty()。
- 陣列處理: 優先使用 for…of 或 forEach 而非 for…in。
- 未定義值: 使用空值合併運算子 (
??) 來指派預設值。
7. for…in 的效能測試與替代方案
1. 效能比較
for…in 陳述式:
const obj = { a: 1, b: 2, c: 3 };
console.time("for...in");
for (const key in obj) {
console.log(key, obj[key]);
}
console.timeEnd("for...in");
Object.keys():
console.time("Object.keys");
Object.keys(obj).forEach(key => {
console.log(key, obj[key]);
});
console.timeEnd("Object.keys");
2. 範例比較結果
for...in: 0.015ms
Object.keys: 0.005ms
3. 推薦的替代方案
- 物件處理: 建議使用
Object.keys()以獲得更佳的效能與安全性。 - 陣列處: 使用 for…of 或 forEach 以獲得更快且更可靠的迭代。
總結
- for…in 陳述式使用方便,但應根據效能與安全性考量,選擇最適合的迴圈結構。

8. 結論|了解 for…in 陳述式與後續步驟
1. 重點摘要
- 基本語法與使用方式 for…in:
- 用於遍歷物件的屬性名稱。
- 專門用於物件鍵值,而非陣列。
- 使用於陣列時的注意事項:
- 順序不保證,且可能會包含原型鏈上的屬性。
- 對於陣列,請改用 for…of 或 forEach()。
- for…in 與 for…of 的差異:
- for…in: 迭代屬性名稱(鍵)。
- for…of: 迭代陣列或可迭代物件的實際值。
- 實務應用與最佳實踐:
- 使用遞迴處理巢狀物件。
- 使用 hasOwnProperty() 排除原型繼承的屬性。
- 透過 Object.keys() 或 Object.entries() 提升效能與安全性。
1 效能最佳化:
- 建議使用 Object.keys() + forEach() 以確保順序與效率,成為比 for…in 更安全的替代方案。
2. 常見問題解答
Q1. 我應該避免使用 for…in 陳述式嗎?
- A: 它適合列舉物件屬性,但對於陣列或效能關鍵的任務,for…of 或 Object.keys() 更安全且更有效率。
Q2. 原型屬性會永遠被列舉嗎?
- A: 會。依照規範,繼承的原型屬性也會被列舉。可使用 hasOwnProperty() 來避免此問題。
Q3. 依據陣列與物件,哪種迴圈最佳?
- 物件: 使用 for…in 或 Object.keys()。
- 陣列: 使用 for…of 或 forEach()。
3. 後續步驟|接下來要學什麼
- 可迭代物件與 Iterable Objects:
- 如 Map、Set、WeakMap、WeakSet 等資料結構,以及相應的迴圈處理方式。
- 資料處理的高階函式:
- 實務上使用 map()、filter()、reduce()。
- 進階物件與陣列技巧:
- 使用 Object.values() 與 Object.entries() 進行高效資料處理。
- 現代 JavaScript 特性:
- ES6+ 的特性,如 展開運算子 與 解構賦值,讓程式碼更簡潔。
- 使用 Promise/Async/Await 的非同步程式設計:
- 在即時處理(如資料抓取、動態物件處理)中應用迴圈。
4. 結語|精通 JavaScript 迴圈
在本篇文章中,我們聚焦於 JavaScript for…in 陳述式,涵蓋其基本用法、進階應用、常見陷阱與替代方案。
最重要的要點:
- …in 適合列舉物件屬性,但對於陣列或以效能為重的任務,應使用其他方法。
- 必須遵循最佳實踐與安全措施,以避免程式錯誤與意外行為。
下一步!
深入了解替代方法與高階函式,將你的 JavaScript 技能提升到更高層次。


