Подтвердить что ты не робот

Javascript эквивалент присваивания по ссылке?

Есть ли какой-либо способ, чтобы я мог быть более подробным в Javascript, указав локальную переменную на свойство объектов?

Например, в PHP я могу это сделать:

$obj->subobject->property = 'Foo';
$property =& $obj->subobject->property;
$property =  'Bar';
echo $obj->subobject->property;
// output 'Bar'

Это не очень хороший пример, но вы получаете идею.

Я хочу скопировать это поведение в Javascript. Мне часто приходится довольно глубоко проникать в объекты, и мне становится очень неприятно:

if (please.stop.making.me[somevar].type.so.much.length) {
    please.stop.making.me[somevar].type.so.much[newSubObjectKey] = anObject;
}

// perform more operations on the object down here

Было бы намного легче читать и намного проще печатать:

var subObj = is.much.easier.to.type.once;
if (subObj.length) {
     subObj[newSubObjectKey] = anObject;
}

// now that much better

Я знаю, что я действительно должен это знать уже, но я просто продвигаюсь к "продвинутому новичку" в Javascript.

4b9b3361

Ответ 1

В Javascript все передается по значению, но тип переменной определяет, будет ли эта ссылка передаваться по значению или нет;

  • Объекты - это ссылки
  • Примитивы (числа, строки и т.д.) передаются по значению.

В простых терминах, если вы передаете переменную функции, которую массив, модифицирующий ее в функции, повлияет на родителя.

Однако, передавая его, значение в массиве не будет. Естественно, абсолютно ничего не мешает вам обернуть примитив в объект, чтобы он работал как "указатель".

Ответ 2

Было бы намного легче читать и намного проще печатать:

var subObj = is.much.easier.to.type.once;
if (subObj.length) {
     subObj[newSubObjectKey] = anObject;
}

Вы даже пробовали это? Потому что он работает.

Что касается актуального вопроса. У вас не может быть ссылок или указателей на значения. Все передается по значению в javascript (без ссылки).

Изменить: Я забыл упомянуть, что некоторые значения являются ссылками. Вы все еще не можете получить указатель на эти ссылочные значения.

Ответ 3

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

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

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

Ответ 4

код в формате CSS

# result method
Object::r = (v) ->
    [email protected]
    st='global.'+v+'={'+'s'+'}'
    re=(eval st)
    str='global.'+v+'=re["s"]'
    eval(str)
    @


[1..10].r('a').
    map( (v) -> 'lorem_ipsum_'+v.toString() ).r('ar').
    join("__").r('s').
    split("__").reverse().r('arr')

console.log("\n")
console.log(a); console.log("\n")
console.log(ar); console.log("\n")
console.log(s); console.log("\n")
console.log(arr); console.log("\n")

screenShot