в JavaScriptdelete
оператор用于删除对象的某个属性。 Например
const person = {
name: 'sudada',
gender: 'female'
}
delete person.name
console.log(person.name) // undefined
В отличие от наиболее интуитивной семантики, используйтеdelete
операторОн не освобождает память напрямую, но это означает, что он сделает память в движке V8 (Javascript)hidden classНедействительный объект в общийslow object, что значительно снижает скорость выполнения.
hidden class: Поскольку JavaScript является динамическим языком программирования, свойства могут добавляться и удаляться динамически, что означает, что свойства объекта могут изменяться.Большинство движков JavaScript (V8) вводят скрытые классы для отслеживания типов объектов и переменных, о которых идет речь. Во время выполнения V8 создает скрытые классы, которые присоединяются к каждому объекту, чтобы отслеживать его форму/макет. Это оптимизирует время доступа к атрибуту.
Ссылаться на:
тогда, если вы не используетеdelete
, как мы удаляем свойство объекта?
Наиболее эффективным способом должно быть установка нежелательного свойства наundefined
,Например
const person = {
name: 'sudada',
gender: 'female'
}
person.name = undefined // 删除 name 属性
Или вы также можете рассмотреть возможность использования оператора распространения для объектов, например.
const person = {
name: 'sudada',
gender: 'female'
}
const omit = (prop, { [prop]: _, ...rest }) => rest;
const newObj = omit('name', person); // 删除 name 属性
оSpread Operator for objectsдля справки:juejin.cn/post/1
Такdelete
,Установить какundefined
,omit
Как выбрать из трех способов?
На графике показана эффективность (количество выполнений в секунду) трех методов при разных ядрах Javascript. Очевидно, что можно сделать вывод о том, чтоundefined
> delete
> omit
.
Адрес экземпляра:JSP и F.com/removing-VA…
но настроен наundefined
, результат
{
name: undefined,
gender: 'female'
}
Иногда требуются дополнительные операции, например
JSON.parse(JSON.stringify(person))
// 或者
Object.keys(person).reduce((pre, cur) => {
const value = person[cur]
return value === undefined ? pre : {...pre, [cur]: value}
}, {})
Таким образом, КПД будет сильно снижен, поэтому его можно будет учитывать в практическом деле.Mapзаменитьobject
,Например
let map = new Map([['a', 1]])
let obj = { a: 1 };
// 执行
delete obj.a;
map.delete('a');
Из рисунка видно, чтоmap.delete
лучше чемdelete
.