…剩余運算符
const obj1 = {a: 1,b: 2
}
const obj2 = {a: 100,b: 2,c: 300
}
const obj = {...obj1,...obj2
}
console.log(obj) // 和Object.assign(obj, obj1, obj2)結果相同
[Symbol.hasInstance]
Symbol構造函數上的屬性,默認調用了方法
iterator迭代器
- 對數據結構讀取的一種方式,是有序的,連續的,基于拉取的一種消耗數據的組織方式
const arr = [1, 2, 3]
const iterFn = arr[Symbol.iterator] // 方法
console.log(iterFn)
const iter = arr[Symbol.iterator]()
console.log(iter) // 對象
console.log(iter.next()) // 迭代結果
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
有序的數據類型
- 數組
- 類數組:arguments、nodeList、Map、Set、weakMap、weakSet
在不知道數據長度情況下,無法用for循環進行遍歷 - 自定義迭代器
// 這個寫法不對?
const arr = [1, 2, 3]
function makeIterator(arr) {let index = 0return {next() {return {value: index < arr.length ? arr[index++] : undefined,done: index < arr.length ? false : true}}}
}
const iter = makeIterator(arr)
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
二進制數據
- js中沒有typeArray和typedArray
- typeArray類型數組
const tArray = new Int8Array(8) // 8進制數據
console.log(tArray)
for…of遍歷接口
- 只要部署了iterator接口
let arr = [1, 2, 3]
for (let i of arr) {console.log(i) // 1 2 3
}
- 注意for…in拿的是下標,用來遍歷對象
- for…of拿到值,用來迭代部署了iterator接口的數據類型
- 對象是無序的、非連續的,是不可迭代的
為對象部署iterator
- 可以用…展開
- 或者用for of迭代
let obj = {start: [1, 3, 2, 4],end: [5, 7, 6],[Symbol.iterator]() {let index = 0,arr = [...this.start, ...this.end],len = arr.length;return {next() {if (index < len) {return {value: arr[index++],done: false}} else {return {value: undefined,done: true}}// 不能這么寫,會少迭代一次// return {// value: index < len ? arr[index++] : undefined,// done: index < len ? false : true// }}}}
}
console.log(...obj) // 1 3 2 4 5 7 6
for (let val of obj) {console.log(val)
}
- 使用iter.next()完成迭代后,再使用for of遍歷,據說有可能會失敗,這種場景遇到了再記錄
注意事項
- 最后一行為什么打印出空,因為在前面的代碼中迭代已經完成了