let const
var
- 污染全局變量
- 導致變量提升
- 可以被重復(fù)聲明
let
- 塊級作用域
- 可以解決重復(fù)定義問題
const
常量 不會變的量 (地址不變即可)
const obj = {name: 1}
obj = {name: 2} // 只是改變常量的內(nèi)容,沒有改變常量的地址和大小
... 展開運算符
- 合并數(shù)組
let arr1 = [1,2,3]
let arr2 = [4,5,6]
let arr3 = [...arr1, ...arr2]
- 深拷貝 淺拷貝
let school = {name: 'zfpx'}
let my = {age: {count: 18}, name: 'jw'} // 里面的count是個對象,是個指針,存放的是個地址
// 把原來的my放在新對象里,用一個新的age把原來的age也拷貝一份
let newMy = {...my, age: {...my.age}}
let all = {...schooll, ...newMy} // 這里的age是18 深拷貝的實現(xiàn)
my.age.count = 100
// 自己實現(xiàn)一個深拷貝的方法
// 掌握類型判斷 typeof instanceof object.prototype.toString.call() constructor
function deepClone(obj) {// 判斷obj是null還是undefined
if (obj==null) return obj
// 不是對象就不用拷貝了
if (obj instanceof Date) return new Date(obj)
if (obj instanceof RegExp) return new RegExp(obj)
if (typeof !== 'object') return obj
// 剩下的是數(shù)組或者對象
let cloneObj= new obj.constructor
// 用for in 來遍歷數(shù)組和對象
for (let key in obj) { // 實現(xiàn)深拷貝
if(obj.hasOwnProperty(key)) { // 遍歷私有屬性
cloneObj[key] = deepClone(obj[key])
}
}
return cloneObj
}
deepClone()
set / map 是兩種存儲解構(gòu)
set 集合 不能重復(fù)的東西,放了,就白放了,去重
let s = new Set([1,2,3,4])
typeof s // set
// 基礎(chǔ)數(shù)據(jù)類型 string number boolean undefined object 私有,bol
- 添加和刪除 并且沒有順序
s.add('5') // 增加
s.delete('5') // 刪除
s.values()
- 集合 并集 交集 差集
let s01 = [1,2,3,1,2]
let s02 = [3,4,5,1,2]
// 并集
function union() {
let s1 = new Set(s01)
let s2 = new Set(s02)
console.log([...new Set([...s1,...s2])])
}
// 交集
function intersection() {
return [...new Set(s01)].filter(v => new Set(s02).has(v))
}
// 差集
function diff() {
return [...new Set(s01)].filter(v => !new Set(s02).has(v)) // 取出相差的部分留下來
}
map
map 是有key的,不能放重復(fù)
let m = new Map()
m.set('name', 'zfjg')
m.set('name', '124')
let obj = {name: 1}
m.set(obj, '456') // 這個obj的引用空間被set所引用
obj = null // 把obj清空 這個空間還是在的
console.log(obj) // null
console.log(m) // {name =>'123', {name:1} => '456'}
weakMap 弱鏈接 map的區(qū)別 回收機制
- WeakMap 弱鏈接集合 的key 必須是對象類型
// 修改深拷貝代碼 解決循環(huán)引用問題
function deepClone(obj, hash=new Map()) {// 判斷obj是null還是undefined
if (obj==null) return obj
// 不是對象就不用拷貝了
if (obj instanceof Date) return new Date(obj)
if (obj instanceof RegExp) return new RegExp(obj)
if (typeof !== 'object') return obj
if (hash.has(obj)) return hash.get(obj) // 如果weakMap中有對象就直接返回
// 剩下的是數(shù)組或者對象
let cloneObj= new obj.constructor
// 如果是對象,把他放到weakMap中,如果再拷貝這個對象存在 就直接返回這個對象即可
hash.set(obj, cloneObj)
// 用for in 來遍歷數(shù)組和對象
for (let key in obj) { // 實現(xiàn)深拷貝
if(obj.hasOwnProperty(key)) { // 遍歷私有屬性
cloneObj[key] = deepClone(obj[key], hash)
}
}
return cloneObj
}
deepClone()
object.defineProperty es5 vue
// 通過object.defineProperty定義屬性,可以增加攔截器