集合及相关
对象
- 增删改查
let obj = {name: '',data: {age: 18}
}
// 增加属性
obj.sister = ‘anier’
Object.assign(obj.data, {sex: ‘man’})
// 删除属性
Reflect.deleteProperty(obj, ‘name’)
// 修改属性
obj.name = ‘tom’
Object.assign(obj.data, {age: 20})
// 查询属性(自身属性)
obj.hasOwnProperty(‘name’)
// 查询属性(自身及原型链)
Reflect.has(obj, ‘name’)
name in obj
- 对象中属性描述符的定义和修改
Object.defineProperty(obj, prop, descriptor)
let obj = {_age: 3
};
<!-- 数据属性 -->
Object.defineProperty(obj, 'name', {configurable: false, // 能否通过 delete 删除属性,能否修改属性的特性,能否把属性修改为访问器属性。enumerable: false, // 能否通过 for-in 循环返回属性。 writable: true, // 能否修改属性的值value: '张三' // 这个属性的数据值。
})
<!-- 访问器属性 -->
Object.defineProperty(obj, 'age', {configurable: true,enumerable: true,get: function () {return this._age;},set: function (newValue) {if (newValue > 5) {this._age += newValue;} else {this._age = newValue;}}
})
- 对象的深拷贝
let obj = {name: '',data: {age: 18}
}方式1、JSON.parse(JSON.stringify(o))
JSON.parse(JSON.stringify(obj))
JSON.parse(JSON.stringify(obj.data)) => {age: 18}
注意:这种方式无法实现对对象中方法的深拷贝方式2、递归实现,这种方式可以深拷贝对象中的方法
function copy(obj){let res = obj instanceof Array ? [] : {}let arr = Object.entries(obj)for(let [key,value] of arr){res[key] = typeof value == 'object' ? copy(value) : value;}return res
}
let aa = copy(obj);
-------------------------------------------------
// 以下属于浅拷贝
变量赋值、拓展运算符、Object.assign 都是浅拷贝
let newObj = obj
let newArr = [...arr]
let newObj = {...obj}
let newObj = Object.assign({},obj)
数组
Map
- 初始化
// 方法一
let map = new Map([['a', 1],['b', 2],['c', 3],
])
// 方法二
let map = new Map()
map.set('name', 'jim')
- 方法属性
增和改:set(key, val)
删:delete(key), clear()
查:has(key),size
其他:keys(),values(),entries()
- 遍历
// forEach
map.forEach((value, key,map) => {// value是88, key是math,map是原map
}
// for of
for(let item of map){ // item是['math', 88]
...
}
for(let item of entries){ // item是['math', 88]
...
}
for(let key of keys){ // key是'math'
...
}
- 转数组
keys() values() entries()并没有转成数组,需要用延展符号放到[]中
let map = new Map([['math', 88], ['english', 55]]) //Map(2) 0:{'math' => 88} 1:{'english' => 55}
let entries = map.entries() //MapIterator 0: {'math' => 88} 1: {'english' => 55}
let keys = map.keys() //MapIterator 0: 'math' 1: 'english'
let values = map.values() //MapIterator 0:88 1: 55
// 若使用数组方法,需要先转数组
let arr = [...map ] 或者 let arr = [...entries ] //arr为[['math', 88], ['english', 55]]
let keyArr = [...keys]
let valueArr = [...values]
Set
- 方法属性
增和改:add(val)
删:delete(key), clear()
查:has(key),size
其他:keys(),values(),entries() //keys()和values()返回的结果一样
- 与数组之间的转化
let set = new Set(arr)
let arr = Array.from(set)
let arr = [...set]
- 应用
// 数组、字符串去重
new Set(...arr)// 两个Set取交集
[...set].filter(item => {return set2.has(item)
})
// 两个Set取并集
[...set1, ...set2]