1. 可能存在的类型
2. 属性描述对象
元属性
Object.defineProperty
3 各种循环
3.1 foreach
传送门
- 数组专属
- 升序遍历
- 忽略已删除或未初始化项
- 第一个参数是一个
callback
函数,包含三个参数
- 当前迭代
item
- 当前索引
index
-
array
本身
- 第二个参数
thisArg
表示绑定this
- 若没有传,参考this指向,因为是callback函数,所以在function里面指向window,在箭头函数里面指向父级this
- 若传了thisArg,则回调函数里面的this和这个thisArg绑定
- 若需要遍历删除,请使用
for
+splice
- 除非
throw error
,否则无法退出循环
3.2 for...in
传送门
- 建议对象,数组也行(但是索引属性是不按顺序的)
- 遍历顺序不定
- 遍历除【Symbol】以外的【可枚举】属性
- 会遍历原型链上的属性,若只遍历自身的属性,请配合使用hasOwnProperty
- 支持
return
或break
来退出循环
3.3 for...of
传送门
- 遍历【可迭代】对象(普通对象不可迭代)
- 【不会】遍历原型链上的属性,
- 若需要对象支持
for...of
遍历,需实现[Symbol.iterator]
,让对象拥有可迭代属性
- 处理大型数组时,比
foreach
性能更优
- 支持
return
或break
来退出循环
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: "我是内部对象",
id: 2,
},
arr: [0, 1, 3],
arr2: [],
func: function () {
console.log("我是一个函数");
},
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
组成的数组(顺序:可枚举属性和for...in
一致,不可枚举属性不定)
4.2 for...in
- 【会】获取原型链上的属性
- 【不会】获取不可枚举的属性
- 【不会】获取
Symbol
属性
- 这是一次遍历,需另寻存储
key
数组
4.3 Object.keys()
传送门
- 【不会】获取原型链上的属性
- 【不会】获取不可枚举属性
- 【不会】获取
Symbol
属性
- 得到上述
key
组成的数组
4.4 Reflect.ownKeys()
传送门
- 【不会】获取原型链上的属性
- 【会】获取不可枚举属性
- 【会】获取
Symbol
属性
- 得到上述
key
组成的数组