JavaScript 等同于通过引用赋值?

2022-08-30 19:50:52

有没有办法通过在JavaScript中将局部变量指向object属性来减少冗长?

例如,在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中晋升为“高级新手”。


答案 1

在JavaScript中,所有内容都是按值传递的,但变量的类型将决定它是否是按值传递的引用;

  • 对象是引用
  • 基元(数字,字符串等)按传递。

简单来说,如果将变量传递给数组的函数,则在函数中修改该变量将影响父级。

但是,在数组中向它传递一个值则不会。当然,绝对没有什么能阻止你将基元包装在一个对象中,以确保它像“指针”一样工作。


答案 2

您可以分配一个新变量来引用属性键链中的任何深度,只要引用的条目不是基元类型即可。

这之所以有效,是因为裸对象变量实际上是对该变量的引用,因此新的(较短的)变量可以指向同一位置。

但是,基元数字和字符串值是按值传递的,因此您无法创建对这些值的新引用。