1. 可能存在的類型
2. 屬性描述對象
3 各種循環(huán)
3.1 foreach
- 數(shù)組專屬
- 升序遍歷
- 忽略已刪除或未初始化項(xiàng)
- 第一個參數(shù)是一個
callback函數(shù),包含三個參數(shù)- 當(dāng)前迭代
item - 當(dāng)前索引
index -
array本身
- 當(dāng)前迭代
- 第二個參數(shù)
thisArg表示綁定this- 若沒有傳,參考this指向,因?yàn)槭莄allback函數(shù),所以在function里面指向window,在箭頭函數(shù)里面指向父級this
- 若傳了thisArg,則回調(diào)函數(shù)里面的this和這個thisArg綁定
- 若需要遍歷刪除,請使用
for+splice - 除非
throw error,否則無法退出循環(huán)
3.2 for...in
- 建議對象,數(shù)組也行(但是索引屬性是不按順序的)
- 遍歷順序不定
- 遍歷除【Symbol】以外的【可枚舉】屬性
- 會遍歷原型鏈上的屬性,若只遍歷自身的屬性,請配合使用hasOwnProperty
- 支持
return或break來退出循環(huán)
3.3 for...of
- 遍歷【可迭代】對象(普通對象不可迭代)
- 【不會】遍歷原型鏈上的屬性,
- 若需要對象支持
for...of遍歷,需實(shí)現(xiàn)[Symbol.iterator],讓對象擁有可迭代屬性 - 處理大型數(shù)組時,比
foreach性能更優(yōu) - 支持
return或break來退出循環(huán)
4. 獲取所有key
//測試對象
let testObj = {
bigInt: BigInt(123123),
set: new Set([2, 3, 3, 4, 2, 5]),
map: new Map([
["a", 23],
["b", "Lawson"],
["c", true],
]),
num: NaN,
num2: 0,
str: "",
str2: "@#$",
boolean: false,
undef: undefined,
nul: null,
obj: {
name: "我是內(nèi)部對象",
id: 2,
},
arr: [0, 1, 3],
arr2: [],
func: function () {
console.log("我是一個函數(shù)");
},
date: new Date(),
reg: new RegExp("/d[1414]6$/ig"),
[Symbol("Nion")]: "Nion測試",
};
Object.defineProperty(testObj, "innumerable", {
enumerable: false,
value: "不可枚舉屬性",
});//測試不可枚舉屬性
Object.prototype.protoObj = {
a: 1,
b: 2
};//測試原型鏈
4.1 Object.getOwnPropertyNames()

Object.getOwnPropertyNames.png
- 【不會】獲取原型鏈上的屬性
- 【會】獲取到不可枚舉屬性
- 【不會】獲取
Symbol屬性 - 得到上述
key組成的數(shù)組(順序:可枚舉屬性和for...in一致,不可枚舉屬性不定)
4.2 for...in

for...in.png
- 【會】獲取原型鏈上的屬性
- 【不會】獲取不可枚舉的屬性
- 【不會】獲取
Symbol屬性 - 這是一次遍歷,需另尋存儲
key數(shù)組
4.3 Object.keys()

Object.keys.png
- 【不會】獲取原型鏈上的屬性
- 【不會】獲取不可枚舉屬性
- 【不會】獲取
Symbol屬性 - 得到上述
key組成的數(shù)組
4.4 Reflect.ownKeys()

Reflect.ownKeys.png
- 【不會】獲取原型鏈上的屬性
- 【會】獲取不可枚舉屬性
- 【會】獲取
Symbol屬性 - 得到上述
key組成的數(shù)組