Объект, скопированный во второе свойство по ссылке, сохраняется даже после удаления исходного свойства?

Пример jasonhudgins не будет работать. Вы не можете выполнить запрос с stmt.execute() и получить значение (или Cursor) назад.

Вы можете только предварительно скомпилировать утверждения, которые либо не возвращают никакие строки вообще (например, вставка, или create table statement) или одну строку и столбец (и используйте simpleQueryForLong() или simpleQueryForString()).

23
задан Noitidart 27 October 2014 в 16:40
поделиться

6 ответов

Нет, это не ошибка в JavaScript.

Что вы делаете с a.c = a.b, так это то, что вы создаете другую ссылку на тот же объект, а это означает, что и a.b, и a.c ссылаются на один и тот же подобъект {val: "rawr"}.

Когда вы делаете delete a.b, вы не удаляете подобъект, вы только удаляете свойство a.b из a. Это означает, что a.c будет по-прежнему ссылаться на тот же объект.

Если вы также удалите свойство a.c, то подобъект исчезнет.

32
ответ дан Frost 27 October 2014 в 16:40
поделиться

Следует отметить две вещи: во-первых, как сказано в других ответах, ключевое слово delete удаляет свойство только для объекта, через который вы переходите к свойству.

Второе, на что следует обратить внимание, это то, что JavaScript никогда не передается по ссылке. Он всегда передается как значение, значения иногда являются ссылками.

Например:

var a = {
   someObject: {}
};
var someObject = a.someObject;

someObject = 'Test';

console.log(a.someObject); // outputs {}

В языке, который передается по ссылке, это, вероятно, приведет к ошибке, поскольку часто подразумевает строгую типизацию переменных.

6
ответ дан axelduch 27 October 2014 в 16:40
поделиться

Нет, это не ошибка.

Команда delete не удаляет объект, на который ссылается это свойство, она только удаляет свойство. Если на объект ссылаются откуда-то еще (другое свойство в этом случае), объект все еще жив.

Это то же самое, что если у вас есть две переменные, указывающие на один и тот же объект, и измените значение одной переменной:

var a = { val: true };
var b = a;
a = null;
console.log(b.val); // b still has a reference to the object
4
ответ дан Guffa 27 October 2014 в 16:40
поделиться

Это потому, что:

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

Запись b, которая соответствует Object {val: true}, удалена из a. Запись c в a по-прежнему относится к этому объекту. Если вы попытаетесь удалить c.val или a.b.val, вы все равно сможете увидеть эффект, каскадный с другим.

То, что вы пытаетесь сделать, то есть освобождение данных и ожидание их каскадного перемещения, не происходит в javascript. Если у вас есть опыт C ++, подумайте о том, чтобы считать все объекты javascript подсчитанными. Я могу удалить ссылку на него (т.е. запись, которая «указывает» на этот объект), но я не могу удалить сам объект. Это чистая прерогатива движка javascript.

5
ответ дан Sharadh 27 October 2014 в 16:40
поделиться

... Я опоздал на вечеринку? Вот мое объяснение (также прочитайте другие ответы, это только для того, чтобы поддержать эти ответы визуальным представлением):

  1. Инициализация пустого объекта a другим объектом (value:true).

enter image description here

  1. Назначение пустого объекта a со свойством b, ссылающимся на другой объект (value:true).

enter image description here

  1. Присвоение объекту a свойства c , ссылающегося на тот же объект (value:true).

enter image description here

  1. Удаление клавиши b, таким образом a.b больше не относится к подобъект (value:true).

enter image description here

  1. Окончательное представление основного объекта a.

enter image description here

Таким образом, мы можем легко увидеть визуальным представлением, как сохранялся подобъект:)

55
ответ дан user3459110 27 October 2014 в 16:40
поделиться

С этой строкой вы думаете, что c указывает на b:

a.c = a.b;

, но на самом деле и c, и b указывают на объект {val: true}, поэтому, если вы удалите b, объект останется. Вы можете просто думать, что и c, и b являются просто «меткой», прикрепленной к объекту {val: true}

5
ответ дан yelliver 27 October 2014 в 16:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: