Пример jasonhudgins не будет работать. Вы не можете выполнить запрос с stmt.execute()
и получить значение (или Cursor
) назад.
Вы можете только предварительно скомпилировать утверждения, которые либо не возвращают никакие строки вообще (например, вставка, или create table statement) или одну строку и столбец (и используйте simpleQueryForLong()
или simpleQueryForString()
).
Нет, это не ошибка в JavaScript.
Что вы делаете с a.c = a.b
, так это то, что вы создаете другую ссылку на тот же объект, а это означает, что и a.b
, и a.c
ссылаются на один и тот же подобъект {val: "rawr"}
.
Когда вы делаете delete a.b
, вы не удаляете подобъект, вы только удаляете свойство a.b
из a
. Это означает, что a.c
будет по-прежнему ссылаться на тот же объект.
Если вы также удалите свойство a.c
, то подобъект исчезнет.
Следует отметить две вещи: во-первых, как сказано в других ответах, ключевое слово delete удаляет свойство только для объекта, через который вы переходите к свойству.
Второе, на что следует обратить внимание, это то, что JavaScript никогда не передается по ссылке. Он всегда передается как значение, значения иногда являются ссылками.
Например:
var a = {
someObject: {}
};
var someObject = a.someObject;
someObject = 'Test';
console.log(a.someObject); // outputs {}
В языке, который передается по ссылке, это, вероятно, приведет к ошибке, поскольку часто подразумевает строгую типизацию переменных.
Нет, это не ошибка.
Команда delete
не удаляет объект, на который ссылается это свойство, она только удаляет свойство. Если на объект ссылаются откуда-то еще (другое свойство в этом случае), объект все еще жив.
Это то же самое, что если у вас есть две переменные, указывающие на один и тот же объект, и измените значение одной переменной:
var a = { val: true };
var b = a;
a = null;
console.log(b.val); // b still has a reference to the object
Это потому, что:
Оператор удаления удаляет свойство из объекта. MDN Удалить
Запись b
, которая соответствует Object {val: true}
, удалена из a
. Запись c
в a
по-прежнему относится к этому объекту. Если вы попытаетесь удалить c.val
или a.b.val
, вы все равно сможете увидеть эффект, каскадный с другим.
То, что вы пытаетесь сделать, то есть освобождение данных и ожидание их каскадного перемещения, не происходит в javascript. Если у вас есть опыт C ++, подумайте о том, чтобы считать все объекты javascript подсчитанными. Я могу удалить ссылку на него (т.е. запись, которая «указывает» на этот объект), но я не могу удалить сам объект. Это чистая прерогатива движка javascript.
... Я опоздал на вечеринку? Вот мое объяснение (также прочитайте другие ответы, это только для того, чтобы поддержать эти ответы визуальным представлением):
a
другим объектом (value:true
).
a
со свойством b
, ссылающимся на другой объект (value:true
).
a
свойства c
, ссылающегося на тот же объект (value:true
).
b
, таким образом a.b
больше не относится к подобъект (value:true
).
a
.
Таким образом, мы можем легко увидеть визуальным представлением, как сохранялся подобъект:)
С этой строкой вы думаете, что c указывает на b:
a.c = a.b;
, но на самом деле и c, и b указывают на объект {val: true}, поэтому, если вы удалите b, объект останется. Вы можете просто думать, что и c, и b являются просто «меткой», прикрепленной к объекту {val: true}