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 твърди, че е задал този въпрос, за да подобри разбирането си по темата. При първоначално тълкуване (което не идва от мястото на „вече знае“) свързаният въпрос не отговаря ясно на въпроса. При окончателно тълкуване (идващо от мястото на „вече знам“) тогава ОП вижда как свързаният въпрос може да помогне; като справочен текст, а не учебен текст. Но 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

Това е в съответствие с отговора в посочения въпрос: Вие просто променяте към кой обект сочи променливата - не данните, към които е сочела. Това означава, че температурата не се влияе от преместването, за да има 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