Переменные Javascript как указатели на объекты

У меня вопрос из любопытства. Поэтому я изучил, как JS обрабатывает присваивание переменных, и понял. Как работает назначение переменных в JavaScript?

Но тот же принцип, похоже, не проявляется в следующем коде, над которым я работаю:

var temp = playlist1[0];
playlist1[0] = playlist1[1];
playlist1[1] = temp;

Я знаю, что это стандартный способ замены элементов массива. Но если temp указывает на playlist1[0], а содержимое playlist1[0] изменено на playlist1[1], то почему я не получаю два значения playlist1[1] подряд?


person nemo    schedule 26.07.2013    source источник
comment
возможный дубликат Как работает назначение переменных в JavaScript?   -  person Evan Trimboli    schedule 26.07.2013
comment
Я проголосовал за это как за дубликат, потому что ответ на вопрос, который вы связали, является ответом на ваш вопрос.   -  person Evan Trimboli    schedule 26.07.2013
comment
@EvanTrimboli Я думаю, что вопрос справедлив, поскольку он требует дополнительных разъяснений по существующему вопросу. Другой вопрос старый и, вероятно, больше не контролируется.   -  person TGH    schedule 26.07.2013
comment
Старый или нет, ответ тот же.   -  person Evan Trimboli    schedule 26.07.2013
comment
ОП утверждает, что он задал этот вопрос, чтобы лучше понять тему. При первоначальной интерпретации (не исходящей из места «уже зная») связанный вопрос не дает четкого ответа на вопрос. После окончательной интерпретации (исходя из места «уже зная») ОП видит, как может помочь связанный вопрос; как справочный текст, а не учебный текст. Но OP утверждает, что этот вопрос повышает ценность связанного вопроса и углубляет обучение, чтобы избежать вероятного неправильного понимания переменной как концепции указателя объекта.   -  person nemo    schedule 26.07.2013


Ответы (4)


Не только переменные являются указателями на объекты. Все значения (не являющиеся примитивами) являются указателями на объекты. Итак, temp — это указатель на объект. playlist1 — это указатель объекта на объект массива, элементы которого являются указателями объектов. например playlist1[0] — указатель на объект, playlist1[1] — указатель на объект и т. д.

Но если temp указывает на playlist1[0]

Это не имеет смысла. temp — указатель объекта. Он указывает на объект. playlist1[0] не является объектом; это указатель объекта. temp = playlist1[0]; заставляет указатель объекта temp указывать на тот же объект, что и указатель объекта playlist1[0].

Если вы знаете C, это эквивалентно чему-то вроде этого:

Object *playlist1[10];

Object *temp = playlist1[0];
playlist1[0] = playlist1[1];
playlist1[1] = temp;
person newacct    schedule 26.07.2013
comment
Вывод OP: элементы массива не являются объектами, они тоже являются указателями на объекты. Это ответило на мой вопрос и углубило мое понимание механизмов. - person nemo; 26.07.2013

Это согласуется с ответом на указанный вопрос: вы просто меняете объект, на который указывает переменная, а не данные, на которые она указывала. Значение temp не зависит от того, что playlist1[1] указывает на playlist1[2]. Temp сохраняет исходное значение, на которое он указывал, когда на него указывали playlis1[1] и temp. Обновляется только плейлист1[1]

person TGH    schedule 26.07.2013

Потому что это все еще ссылки на элементы в массиве, а не на сами элементы. Итак, в строке:

playlist[1]=playlist[2]

Вы ничего не меняете в температуре. Сравните это с чем-то вроде (при условии, что элементы массива были объектами):

playlist[1].x=playlist[2].x

Фактически это присвоение значения объекту в массиве, и если temp указывает на playlist[1], то temp.x будет равно playlist[2].x.

person mckurt    schedule 26.07.2013

скажем, у нас есть obj={l1:{l2:[1,2]},}, и мы хотим обратиться к obj.l1.l2[1], используя массив уровней, например arr=["l1","l2",1], тогда:

Object.defineProperty(Object.prototype,'point',{
    value:function(arr){
        var rez=this;
        for(var s in arr){
            rez=rez[arr[s]];
            if(rez === undefined) return undefined;
        }
        return rez;
    }
});

Итак, после определения метода "точка" (который не перечислим, чтобы все испортить), мы можем использовать

obj.point(arr)

чтобы получить значение 2

person bortunac    schedule 11.09.2015