2013-04-24 4 views
2

так, в this post here люди обсуждают тот факт, чтоправильный сброс глобальной переменной в javascript?

A = [1,2,3]; 

, а затем делает

A = []; 

не сбросит массив, но создать новый.

Мой вопрос, если я использую глобальную переменную объекта

myglobals = { A : [] } 

Могу ли я безопасно сбросить массив с

myglobals.A = []; 

Правильно? Поскольку это ссылается на одно и то же свойство объекта, и поэтому я фактически не создаю новый массив, не так ли?

Update на вопрос в связи с замечаниями ниже

Поскольку существует общее мнение, что splice(0) является путь, и так как очень подобный вопрос есть ответ, объясняющий влияние на браузер, освобождая память, Мне интересно, если вообще безопасно и правильно устанавливать какой-либо определенный объект (будь то массив или функция или строка и т. Д.) До null, чтобы сбросить его значение значение при сохранении его ссылка?

+1

объект все еще может иметь свой прототип, и он должен! вот что такое javascript. объекты прототипов, пустые или нет! потому что даже «null» - это что-то, это ничего, поэтому '[]' это что-то, но 'var A = undefined' не определено, но A как объект некоторого прото/типа существует! –

+0

@ alex23, спасибо за ссылку на это сообщение. Кажется, что 'myglobals.A.splice (0)' на самом деле не самый лучший способ. Из принятого ответа там, я получаю, что он должен быть установлен в «null», чтобы позволить браузеру собирать память, не так ли? – tim

+0

@codelio, возможно, я не очень хорошо задаю свой вопрос, извините, если это так. Ваш ответ ниже звучит неправильно: если я устанавливаю 'A = undefined', то' typeof (A) 'возвращает' undefined', но я ожидаю получить 'object' – tim

ответ

5

Вы создаете новый массив. Если вы хотите, чтобы усечь массив, просто установите его длину до нуля:

var a = [1,2,3]; 
a.length = 0; 
// a is now [] 

В вашем примере со свойствами объекта, это точно так же. В JavaScript нет указателей, а только ссылочных значений. Таким образом, значение myglobals.A является ссылкой на массив. Когда вы назначаете ему новый массив, это значение становится новой ссылкой для другого массива.

+0

Чтобы очистить массив, вам нужно удалить все элементы на объекте (установка 'arr.length = 0' фактически не удалит ссылки из массива), то сжатый способ разумной очистки массива:' arr. сплайсинга (0) '. – zzzzBov

+1

@zzzzBov Вы уверены? Потому что 'var a = [1,2,3]; a.length = 0; а [1]; // undefined'. – bfavaretto

+0

'arr.splice (0)' влияет на текущую ссылку на массив (возможно, вы думали о 'arr.slice', которая похожа), но кажется, что вы правы в' a.length = 0', очищающем элементы массива , У меня создалось впечатление, что он просто замаскировал существование свойств экземпляра массива. – zzzzBov

2

Нет, это все еще создает новый массив. Важным фактором является назначение, а не область, к которой привязана переменная «А». Пока вы делаете что-то похожее на something = [], движок JavaScript собирается создать новый объект Array (часть []), затем назначить ссылку на него something.

+0

благодарит за краткое объяснение происходящего. – tim

2

Не очень ...

// make a global variable 
var a = [1,2,3]; 

// Assign it to something 
var someObj = { value: a }; 
someObj.value; // [1,2,3]; 

// set a new value for the global 
a = []; 
a; // [] 
someObj.value; // [1,2,3]; 

Это исходный код вы упоминаете. Вы можете изменить объект, на который указывает глобальная переменная, но вы не можете изменить другую ссылку на объект, который вы заменяете.

И та же проблема существует с вторым примером:

// make a global variable 
var globals = { a: [1,2,3] }; 

// Assign it to something 
var someObj = { value: globals.a }; 
someObj.value; // [1,2,3]; 

// set a new value for the global 
globals.a = []; 
globals.a; // [] 
someObj.value; // [1,2,3]; 

Вы должны ссылаться на объекте globals контейнера, если вы хотите, ссылки будут обновлены. Это другой объект, содержащий ссылку на контейнер, а затем вы можете изменить содержимое этого контейнера.

// make a global variable 
var globals = { a: [1,2,3] }; 

// assign a reference to the container in another object. 
var someObj = { globals: globals }; 
someObj.globals.a; // [1,2,3]; 

// set a new value for the global 
globals.a = []; 
globals.a; // [] 
someObj.globals.a; // []; 

Мысль, которая может стать немного громоздкой.


Вы также можете изменить ссылку на объект глобальным, а не заменять его.

var a = [1,2,3]; 
var b = a; // a and b now reference the same object. 

a.splice(0); // remove all items from this array, without replace the array object. 
a; // []; 
b; // []; 
// a and b now still point to the same array, which is now empty. 
+0

Я думаю, что это должно быть 'a.splice (0)' в конце. – zzzzBov

+0

@zzzzBov Derp ... спасибо! –

1
var A=[1,2,3]; 
A=undefined; 
console.log(A); //undefined 
+0

ну, это просто изменение массива до нуля, а не сброс его как переменной типа 'array'. Я предполагаю, что я мог бы сделать два утверждения: 'A = undefined; A = [];' но это определенно удаляет назначение A или просто добавляет новую ссылку? Как насчет 'A = null'? – tim

+0

и любое переопределение переменной будет работать. A.length = 0 не будет работать в любое время, зависит от типа A. Другими словами, из какого прототипа он сделан. но переопределение с низкоуровневыми типами все равно пустет все в нем, особенно при смене типов с ним, что «null» и «undefined» делают! –

+0

другими словами, как только переменная задана, она имеет область действия! где-то он принадлежит. но если это то, что он принадлежит, изменено или перезаписано, javascript free - это пространство с новой вещью. Это похоже на запись 'var A', что-то, но не ничего, оно не определено! –

1
var handle={}; 
handle.A=[1,2,3,4,5,{x:2,y:3}]; 
console.log(handle); 

what is given now

delete handle.A; 
console.log(handle); //A is gone! 

after deleting A from handle

почему-то удалить лучше? он действительно убивает A от handle, следующий может смутить вас при работе с более крупными объектами, если вы надеетесь, что .length говорит вам правду.

handle.A=[null]; 
handle.B=undefined; 
handle.C=null; 
handle.A.length=10; 
console.log(handle, handle.length, handle.A.length); 

не очень сэкономить при кодировании, так как я установить его =10 и сценарий мог предположить неправильно есть что-то петля через 10 элементов. так что handle.A=null поможет, но не изменит структуру вашего объекта. , но он также не может сломать ваш скрипт, потому что у вас есть что-то вроде var A, и вы можете предотвратить петли через не существующие с ним элементы. тот же работа с набором для undefined, как таковые ниже ..

so be carefull

+0

в таком типе вы действительно освобождаете память для A –

Смежные вопросы