Usuwanie nieruchomości w JavaScript
Na tej stronie znajduje się wiele różnych opcji, nie dlatego, że większość opcji jest błędna - lub ponieważ odpowiedzi są duplikatami - ale dlatego, że odpowiednia technika zależy od sytuacji, w której się znajdujesz i celów zadań, które Ty i / lub Ty zespół stara się spełnić. Aby odpowiedzieć na twoje pytanie jednoznacznie, musisz wiedzieć:
- Wersja ECMAScript, na którą celujesz
- Zakres typów obiektów, na których chcesz usunąć właściwości, oraz rodzaj nazw właściwości, które musisz pominąć (tylko ciągi znaków? Symbole? Słabe referencje odwzorowane z dowolnych obiektów? Od lat wszystkie typy wskaźników właściwości w JavaScript )
- Etos programowania / wzorce, których używasz Ty i Twój zespół. Czy faworyzujesz podejście funkcjonalne, a mutacja jest w twoim zespole werbalna, czy używasz technik obiektowych zorientowanych na mutacje na dzikim zachodzie?
- Czy chcesz to osiągnąć w czystym JavaScript, czy chcesz i możesz korzystać z biblioteki innej firmy?
Po udzieleniu odpowiedzi na te cztery pytania istnieją zasadniczo cztery kategorie „usuwania właściwości” w JavaScript, które można wybrać, aby osiągnąć swoje cele. Oni są:
Usuwanie właściwości obiektu mutującego, niebezpieczne
Ta kategoria służy do operowania literałami obiektów lub instancjami obiektów, gdy chcesz zachować / kontynuować używanie oryginalnego odwołania i nie używasz funkcjonalnych zasad bezstanowych w kodzie. Przykład składni w tej kategorii:
'use strict'
const iLikeMutatingStuffDontI = { myNameIs: 'KIDDDDD!', [Symbol.for('amICool')]: true }
delete iLikeMutatingStuffDontI[Symbol.for('amICool')] // true
Object.defineProperty({ myNameIs: 'KIDDDDD!', 'amICool', { value: true, configurable: false })
delete iLikeMutatingStuffDontI['amICool'] // throws
Ta kategoria jest najstarszą, najprostszą i najczęściej wspieraną kategorią usuwania nieruchomości. Obsługuje Symbol
i indeksy tablic oprócz ciągów i działa w każdej wersji JavaScript z wyjątkiem pierwszej wersji. Jest to jednak mutacja, która narusza niektóre zasady programowania i ma wpływ na wydajność. Może także powodować nieprzechwycone wyjątki, gdy zostanie użyty w przypadku właściwości nieskonfigurowanych w trybie ścisłym .
Pominięcie właściwości ciągu opartego na reszcie
Ta kategoria jest przeznaczona do działania na instancjach zwykłych obiektów lub tablic w nowszych wersjach ECMAScript, gdy pożądane jest podejście niemutujące i nie trzeba uwzględniać kluczy symboli:
const foo = { name: 'KIDDDDD!', [Symbol.for('isCool')]: true }
const { name, ...coolio } = foo // coolio doesn't have "name"
const { isCool, ...coolio2 } = foo // coolio2 has everything from `foo` because `isCool` doesn't account for Symbols :(
Usuwanie właściwości obiektu mutującego, bezpieczne
Ta kategoria jest przeznaczona do operowania literałami obiektów lub instancjami obiektów, gdy chcesz zachować / kontynuować używanie oryginalnego odwołania, jednocześnie chroniąc przed wyjątkami zgłaszanymi przez nieskonfigurowalne właściwości:
'use strict'
const iLikeMutatingStuffDontI = { myNameIs: 'KIDDDDD!', [Symbol.for('amICool')]: true }
Reflect.deleteProperty(iLikeMutatingStuffDontI, Symbol.for('amICool')) // true
Object.defineProperty({ myNameIs: 'KIDDDDD!', 'amICool', { value: true, configurable: false })
Reflect.deleteProperty(iLikeMutatingStuffDontI, 'amICool') // false
Ponadto, podczas gdy mutowanie obiektów w miejscu nie jest bezstanowe, możesz użyć funkcjonalnej natury Reflect.deleteProperty
częściowej aplikacji i innych technik funkcjonalnych, które nie są możliwe w przypadku delete
instrukcji.
Pominięcie właściwości ciągu na podstawie składni
Ta kategoria jest przeznaczona do działania na instancjach zwykłych obiektów lub tablic w nowszych wersjach ECMAScript, gdy pożądane jest podejście niemutujące i nie trzeba uwzględniać kluczy symboli:
const foo = { name: 'KIDDDDD!', [Symbol.for('isCool')]: true }
const { name, ...coolio } = foo // coolio doesn't have "name"
const { isCool, ...coolio2 } = foo // coolio2 has everything from `foo` because `isCool` doesn't account for Symbols :(
Pominięcie właściwości na podstawie biblioteki
Ta kategoria ogólnie pozwala na większą elastyczność funkcjonalną, w tym rozliczanie symboli i pomijanie więcej niż jednej właściwości w jednym zestawieniu:
const o = require("lodash.omit")
const foo = { [Symbol.for('a')]: 'abc', b: 'b', c: 'c' }
const bar = o(foo, 'a') // "'a' undefined"
const baz = o(foo, [ Symbol.for('a'), 'b' ]) // Symbol supported, more than one prop at a time, "Symbol.for('a') undefined"