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's much better

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

12 голосов | спросил rich97 18 J000000Monday11 2011, 16:02:39

4 ответа


0

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

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

Проще говоря, если вы передадите переменную в функцию, которая является массивом, ее изменение в функции повлияет на родительский элемент.

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

ответил Olipro 18 J000000Monday11 2011, 16:10:52
0

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

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

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

ответил Alnitak 18 J000000Monday11 2011, 16:16:01
0
  

Это было бы намного легче читать и намного легче печатать:

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

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

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

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

ответил Raynos 18 J000000Monday11 2011, 16:06:29
0

код coffeeScript

# 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

ответил Aliaksandr 14 FebruaryEurope/MoscowbWed, 14 Feb 2018 17:38:58 +0300000000pmWed, 14 Feb 2018 17:38:58 +030018 2018, 17:38:58

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132