通过文本别名引用Javascript变量

通过文本别名引用Javascript变量,javascript,Javascript,是否可以通过文本别名引用JavaScript变量?例如: var x = 2; var y = convertToVariableRef("x"); 调用上述函数后: “y将是与x相同的引用,而不仅仅是将x的值复制到y” 调用上述函数后,y将是与x相同的引用,而不仅仅是将x的值复制到y中 不,JavaScript没有这种意义上的变量引用 最好使用对象和属性: var obj = {x: 2}; var yobj = obj; consoel.log(yobj.x); // 2 yobj和ob

是否可以通过文本别名引用JavaScript变量?例如:

var x = 2;
var y = convertToVariableRef("x");
调用上述函数后: “
y
将是与
x
相同的引用,而不仅仅是将
x
的值复制到
y

调用上述函数后,y将是与x相同的引用,而不仅仅是将x的值复制到y中

不,JavaScript没有这种意义上的变量引用

最好使用对象和属性:

var obj = {x: 2};
var yobj = obj;
consoel.log(yobj.x); // 2
yobj
obj
都引用上述内存中的同一对象,并且该对象具有
x
属性。因此,通过任何一个引用修改
x
,都会更新该对象



为什么我在上面说“JavaScript没有对变量的引用”(从这个意义上说):JavaScript的闭包接收对隐藏对象的隐式引用,称为变量绑定对象,该对象反过来引用变量。因此,从这个意义上说,JavaScript引用了变量(通过隐藏对象间接引用)。但是您无法获取对隐藏对象的引用,因此它对您描述的内容没有帮助。

对于对象和数组,两个变量可以指向同一个对象或数组,但是对于数字或布尔值等简单值,javascript中没有办法让两个变量指向同一个基本值

可以将基元值包装到对象中,并通过这种方式解决问题

var x = {val: 2};
var y = x;  // now both y and x point to the same object

x.val = 3;
console.log(x.val);   // 3
console.log(y.val);   // 3 (same value)
并且,对于属性名称,您还可以使用字符串名称访问属性,如中所示:

var x = {val: 2};
var y = x;  // now both y and x point to the same object

console.log(y["val"]);   // 2   
1) 如果变量的值是基元(数字、布尔值、字符串),则无法获取对它的引用。你只能复制它

2) 即使变量不是原语,而是附加到当前范围(即,使用var声明,如您的示例中所示),这也是不可能的(有两个例外)

因此,可以工作的情况是一个非原语,它是当前范围之外的其他对象的一部分。像这样:

 var obj = { a: [1,2,3], b: 42 };

 var copyOfA = obj.a;

 // do something to copyOfA
 copyOfA.splice(1);

 // now this has changed!
 console.log(obj.a);
这两个例外是:

  • 使用eval(不是很习惯用法)
  • 如果当前范围是全局范围(通常不是全局范围,因为您不是全局范围) 让一切都全球化,对吗?)

不可能引用原始变量,如整数。如果你真的想要它,你可以让一些监听器像一些框架(比如AngularJS)那样,通过添加一些额外的复杂填充来观察你的值的变化

但实际上,将您的值封装到可引用的对象中更简单,即:

var x = {value: 2};
var y = x;

只需使用
x.value
y.value
即可。

如果您声明了一个不在任何函数范围内的对象,它是window对象的属性,那么您可以像这样获取它的引用

function convertToVariableRef (ref) {
  return window[ref];
}

var x = 2;
var y = convertToVariableRef("x");
但它只复制基本体的值,而只引用非基本体

var x = [1];
var y = convertToVariableRef("x");
y[0] = 2;

// log: x -->  [2]
数组、对象等是非基本体

var x = [1];
var y = convertToVariableRef("x");
y[0] = 2;

// log: x -->  [2]

您可以继续创建对象反射并为其指定属性

var reflect = new Object();
reflect.x = 2;
var y = reflect["x"];

Fiddle:

在JavaScript中,有一个函数计算
x
,并将值赋给
y
在求值过程中是否可能出现重复
“y将与x相同的引用”
?这就是我没有发布答案的原因。@GrijeshChauhan:谢谢。在我完全清醒之前回答问题所得到的。我已经改正了。嗯,这取决于你怎么想。JavaScript中的所有变量都是引用(除了那些引用原语的变量)。@Jakob:variables不是引用;变量包含值,在对象引用的情况下,该值是对对象的引用。但这与引用变量是完全不同的。@T.J.Crowder:对,这样的措辞更好!不过,我认为没有人要求“引用变量”。问题是“y如何与x相同”,这正是每当你做
y=x
(只要右手边不是原语)时所发生的情况。这是迄今为止最简单、最雄辩的方法。它非常适合于需要引用jQuery提取的html中间接嵌入的变量的情况<代码>变量y=反映[“x”]复制值,而不是引用。请参阅@JustAPoring:您可以使用此黑客:。这不是一个好的解决方案,但这取决于你的使用情况。