Есть ли способ, которым я могу быть более подробным в 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's much better
Я знаю, что я действительно должен это знать уже, но я просто продвигаюсь к «продвинутому новичку» в Javascript.
В Javascript все передается по значению, но тип переменной определяет, является ли это ссылкой, переданной по значению или нет;
Проще говоря, если вы передадите переменную функции, которая является массивом, изменение ее в функции повлияет на родителя.
Однако, передавая ему значение в массиве, это не будет. Естественно, абсолютно ничего не мешает вам обернуть примитив в объект, чтобы он работал как «указатель».
Было бы намного легче читать и намного проще вводить:
var subObj = is.much.easier.to.type.once; if (subObj.length) { subObj[newSubObjectKey] = anObject; }
Вы даже пробовали это? Потому что он работает.
Что касается актуального вопроса. У вас не может быть ссылок или указателей на значения. Все передается по значению в javascript (без ссылки).
Edit: Я забыл упомянуть, что некоторые значения являются ссылками. Вы все еще не можете получить указатель на эти ссылочные значения.
Вы можете назначить новую переменную для ссылки на любую глубину в цепочке ключей свойств, если упоминаемая запись не является примитивным типом .
Это работает, потому что голая переменная объекта на самом деле является ссылкой на эту переменную, поэтому ваша новая (более короткая) переменная может указывать на одно и то же место.
Однако примитивные числа и строковые значения передаются по значению , поэтому вы не можете создавать новые ссылки на них.