【JS】對象的遍歷

1. 可能存在的類型

2. 屬性描述對象

元屬性
Object.defineProperty

3 各種循環(huán)

3.1 foreach

傳送門

  • 數(shù)組專屬
  • 升序遍歷
  • 忽略已刪除或未初始化項(xiàng)
  • 第一個參數(shù)是一個callback函數(shù),包含三個參數(shù)
    • 當(dāng)前迭代item
    • 當(dāng)前索引index
    • array本身
  • 第二個參數(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
  • 支持returnbreak來退出循環(huán)

3.3 for...of

傳送門

  • 遍歷【可迭代】對象(普通對象不可迭代)
  • 【不會】遍歷原型鏈上的屬性,
  • 若需要對象支持for...of遍歷,需實(shí)現(xiàn)[Symbol.iterator],讓對象擁有可迭代屬性
  • 處理大型數(shù)組時,比foreach性能更優(yōu)
  • 支持returnbreak來退出循環(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ù)組
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 回想起剛?cè)腴TJS的時候,初次接觸JS原型繼承,令我頭大,心想啊,為什么要把繼承搞得這么復(fù)雜。隨著時間推移,學(xué)習(xí)源碼...
    forJavascript閱讀 431評論 2 1
  • 參數(shù) target要使用 Proxy 包裝的目標(biāo)對象(可以是任何類型的對象,包括原生數(shù)組,函數(shù),甚至另一個代理)。...
    landidzu閱讀 3,729評論 0 0
  • 一、 入門 1、 JS代碼書寫的位置 寫在行內(nèi) 寫在script標(biāo)簽中 寫在外部js文件中,在頁面引入 注意點(diǎn): ...
    寵辱不驚丶?xì)q月靜好閱讀 932評論 0 0
  • js對象的屬性有很多種,總結(jié)這一篇文章是為將來理解對象復(fù)制和對象繼承打基礎(chǔ)。 數(shù)據(jù)描述符 1. 可枚舉性(Enum...
    csRyan閱讀 519評論 0 2
  • 1,js對象分兩種 首先申明一點(diǎn)prototype是函數(shù)特有的,對象并沒有從圖上也能看出打印obj時,它的原型是 ...
    草祭木初閱讀 274評論 0 1

友情鏈接更多精彩內(nèi)容