删除数组中的元素
- 使用splice(会改变原数组)
arr.splice(index,len,item);
//index,删除或者替换的起始位置
//len,删除或者替换的长度
//item,替换的内容
arr = ["a","b","c","d"]
//删除
arr.splice(1,2) ====>["a","d"]
//替换
arr.splice(1,1,"tt") ====> ["a","tt","c","d"]
arr.splice(1,2,"tt") ====> ["a","tt","d"]
//添加
arr.splice(1,0,"ttt") ====> ["a","tt","b","c","d"]
- 使用remove删除指令的元素
arr.remove(xx)
- 使用delete
//数组长度不变,置为undefined
delete arr[1] ====> ["a",,"c","d"]
删除对象的属性
- 使用delete
delete obj.properti
let map = new Map(["name","xxx"])
map.delete("name")
存在的问题
1.没有直接释放内存,使得hiddenClas变成slowClass。
2.hidden class:由于 JavaScript是一种动态编程语言,属性可进行动态的添加和删除,这意味着一个对象的属性是可变的,大多数的 JavaScript 引擎(V8)为了跟踪对象和变量的类型引入了隐藏类的概念。在运行时 V8 会创建隐藏类,这些类附加到每个对象上,以跟踪其形状/布局。这样可以优化属性访问时间。
- 将对象属性置成undefined
obj.property = undefined;
- 使用流式操作符(spread operator for objects)
const obj = {
name: xxx
}
const omit = (prop,{[prop]: _,...rest}) => rest //删除属性的函数
const newObj = omit("name",obj)
- 使用第三方工具lodash
1.移除属性
const obj = {
name: xxx,
sex: xxx
}
const result = _.omit(obj,["name"])
2.保留属性
const result = _.pick(obj,["sex"])
- 仿照lodash实现一个删除的流失操作函数
// 中规中矩式
const omit = (obj, uselessKeys) =>
Object.keys(obj).reduce((acc, key) =>
return uselessKeys.includes(key) ?
acc :
{...acc, [key]: acc[key]}
}, {});
// 投机取巧式
const omit = (obj, uselessKeys) =>
uselessKeys.reduce((acc, key) => {
return {...acc, [key]: undefined}
}, obj)
// 粗暴式
const omit = (obj, uselessKeys) => {
uselessKeys.forEach(key => {
delete obj[key]
})
return obj
}
- 几种方法的执行速度比较
执行速度:undefined >map.delete > obj.delete > omit