通过文本别名引用Javascript变量

时间:2014-01-28 07:36:46

标签: javascript

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

var x = 2;
var y = convertToVariableRef("x");

调用上述功能后:  “yx的引用相同,而不仅仅是将x的值复制到y”。

6 个答案:

答案 0 :(得分:4)

如果你声明一个没有任何函数范围的对象,它是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]

答案 1 :(得分:3)

  

调用上面的函数后,y与x的引用相同,而不只是简单地将x的值复制到y中。

不,JavaScript在这个意义上没有对变量的引用。

最好使用对象和属性:

var obj = {x: 2};
var yobj = obj;
consoel.log(yobj.x); // 2

yobjobj都引用了上面内存中的同一个对象,该对象具有x属性。因此,通过引用修改x更新一个对象。


为什么我说“JavaScript没有引用上面那些 的变量:JavaScript的闭包接收一个隐藏的对象,称为变量绑定对象,它又指变量。所以在这个意义上,JavaScript引用了变量(间接地,通过隐藏对象)。但是你无法获得对该隐藏对象的引用,因此它对你所描述的内容没有任何帮助。

答案 2 :(得分:3)

不可能引用诸如整数的基本变量。如果真的想要它,你可以让一些听众通过像一些框架那样添加一些额外的复杂填充来监视你的价值变化(例如AngularJS)。

但实际上,将值包装到一个可引用的对象中会更简单,即:

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

然后使用x.valuey.value

答案 3 :(得分:3)

您可以直接创建一个Object反射并为其指定属性。

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

小提琴:http://jsfiddle.net/wE4Ft/

答案 4 :(得分:2)

对于对象和数组,两个变量可以指向同一个对象或数组,但对于像数字或布尔值这样的简单值,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   

答案 5 :(得分:2)

1)如果变量的值是基元(number,bool,string),则无法获得对它的引用。你只能复制它。

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(不是很惯用)
  • 如果当前范围是全局范围(通常不是,因为您不是 让一切都变得全球化,对吗?)