Каковы некоторые случаи, когда `delete` был очень полезен в JavaScript? - PullRequest
6 голосов
/ 25 августа 2011

У нас есть несколько вопросов, которые обсуждают удаление более абстрактным способом, но я ищу практические примеры, когда можно использовать delete, вместо того, чтобы что-то делать, например, установить для свойства значение null или undefined.

Оператор удаления удаляет свойство объекта.

В чем проблема, с которой столкнулись где-то, что delete было лучшим решением, а не чем-то другим?

Ответы [ 4 ]

4 голосов
/ 25 августа 2011

При использовании объекта в качестве хэш-карты вы можете перебирать свойства объекта, используя:

for (var key in obj) {
    // ...
}

Если бы некоторые свойства этих объектов были установлены на null, их ключи были бы включены туда. С помощью delete вы можете полностью удалить их ключи.

2 голосов
/ 25 августа 2011
Object.defineProperty(Object.prototype, "Incognito", {
  get: function() { return 42; },
  set: function() { },
  configurable: true
});

console.log(({}).Incognito); // 42
({}).Incognito = null;
console.log(({}).Incognito); // 42

// I DO NOT WANT INCOGNITO
delete Object.prototype.Incognito
console.log(({}).Incognito); // undefined

Любое свойство с пустым установщиком (потому что кто-то подумал, , что - хорошая идея) необходимо удалить, если вы хотите от него избавиться.

var hash = {
  "FALSE": undefined,
  "TRUE": null
}

console.log("TRUE" in hash); // true
console.log("FALSE" in hash); // true
delete hash.FALSE;
console.log("FALSE" in hash); // false

Оператор in возвращает true для любого свойства, которое существует независимо от его значения. Если вы хотите, чтобы он возвратил false, вам нужно delete свойство.

В обоих этих случаях установка null или undefined ничего не делает (потому что у него либо есть установщик, который ничего не делает, либо так работает оператор in)

1 голос
/ 25 августа 2011

Если установить для свойства объекта значение null или undefined, оно все равно останется перечислимым - если вы собираетесь выполнить for..in над объектом на любом этапе, и наличие свойства существенно, это это когда вы хотите delete вместо.

Например, если у вас есть один конструктор, который принимает аргументы в качестве объекта, который наследуется от другого конструктора, который делает то же самое, и присутствие свойства существенно при вызове родительского конструктора (скажем, в примере ниже, что ParentWidgets использовал его аргументы с for..in для генерации атрибутов HTML) вы можете использовать delete для удаления свойств, которые не имеют отношения к родителю:

function ChildWidget(kwargs) {
  kwargs = extend({
    childSpecific1: null, childSpecific2: 42
  }, kwargs || {})
  this.childSpecific1 = kwargs.childSpecific1
  this.childSpecific2 = kwargs.childSpecific2
  delete kwargs.childSpecific1
  delete kwargs.childSpecific2
  ParentWidget.call(this, kwargs)
}
inherits(ChildWidget, ParentWidget)
0 голосов
/ 06 июня 2013

Оператор delete полезен в методе сброса или очистки для удаления литеральных данных объекта, связанных с формами:

delete formmap["forms"]

Это также полезно для удаления объектов, связанных с состоянием:

/* lights... */
if (node["alpha"+i].active)
  {
  // camera, action
  node["beta"+i] = chi;
  }
else
  {
  /* cut! */
  delete node["beta"+i];
  node["omega"].state = false;
  }

Кроме того, он полезен как сокращение для встраивания необязательных свойств объекта:

var foo = {"bar": [], "drink": [], "tab": [] }

// happy hour
this.bar && (foo["bar"]).push(this.bar) || delete foo.bar;
// open a tab
this.drink && (foo["drink"]).push(this.drink) || delete foo.drink;
// cheers
this.tab && (foo["tab"]).push(this.tab) || delete foo.tab;

Наконец, он полезен как способ различения типов, используя доступные для записи права доступа к свойствам экземпляра конкретного типа в качестве лакмусовой бумажки:

// Function
!!foo.prototype === true && delete foo.length === false && delete foo[-1] === true

// Object, Number, Infinity, or Boolean (probably Object)
!!foo.prototype === false && delete foo.length === true && delete foo[-1] === true

// Array
!!foo.prototype === false && delete foo.length === false && delete foo[-1] === true

// String
!!foo.prototype === false && delete foo.length === false && delete foo[-1] === false

// RegExp
delete foo.source === false

Ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...