Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript:字符串化实际变量名_Javascript - Fatal编程技术网

JavaScript:字符串化实际变量名

JavaScript:字符串化实际变量名,javascript,Javascript,我目前正在运行一系列函数,其中第一个参数是在别处定义的变量,第二个参数是碰巧与变量名相同的字符串: assignString(Hello, 'Hello') assignString(World, 'World') assignString(Foo, 'Foo') assignString(Bar, 'Bar') ... 理想情况下,我想将其简化为: ['Hello', 'World', 'Foo', 'Bar'].forEach(() => { assignString... })

我目前正在运行一系列函数,其中第一个参数是在别处定义的变量,第二个参数是碰巧与变量名相同的字符串:

assignString(Hello, 'Hello')
assignString(World, 'World')
assignString(Foo, 'Foo')
assignString(Bar, 'Bar')
...
理想情况下,我想将其简化为:

['Hello', 'World', 'Foo', 'Bar'].forEach(() => { assignString... })

or

[Hello, World, Foo, Bar].forEach(() => { assignString... })
var exampleStringValue = 'HELLO';
window[exampleStringValue] = exampleStringValue;
console.log(window.HELLO);

// or, since window is the global context in the browser
console.log(HELLO)

这实际上是可能的吗?

您可以使用数据创建一个对象,迭代键,并将键值对传递给assignString函数

var data = {
    Hello: Hello,
    World: World,
    Foo: Foo,
    Bar: Bar
}

Object.keys(data).forEach(key => assignString(data[key], key));

我认为基于字符串值动态创建变量的唯一方法是执行以下操作:

['Hello', 'World', 'Foo', 'Bar'].forEach(() => { assignString... })

or

[Hello, World, Foo, Bar].forEach(() => { assignString... })
var exampleStringValue = 'HELLO';
window[exampleStringValue] = exampleStringValue;
console.log(window.HELLO);

// or, since window is the global context in the browser
console.log(HELLO)
老实说,我不能说我能想出一个好的实践用例,但我不知道你的用例,所以这里没有判断:


我还想指出,我发现这个小库对于创建键与键名具有相同值的对象非常有用:。我发现它在React社区中被大量使用。

使用新的ES6映射对象,我们可以在结构中创建名称/值对,然后将其转换为数组,因此forEach可以工作:

const vars = { Hello, World, Foo, Bar };
Object.keys(vars).forEach(key => assignString(vars[key], key));
  // Variables that assignString will need:
  var Hello = "var1", World = "var2", Foo = "var3", Bar = "var4";

  // Map object that contains name of variables and strings that match variable name
  var m = new Map([[Hello, "Hello"],[World,"World"],[Foo, "Foo"], [Bar, "Bar"]]);

  // Turn Map into Array so forEach will work:
  var a = Array.from(m);

  // Call forEach which calls assingString and passes key name
  // (variable name) and string value
  a.forEach((value) =>  { assignString(value[0], value[1]); });

请参阅此提琴:

因为变量名和字符串是等效的,所以无需将其传入两次。我宁愿传入变量的范围。您可以这样做,使其在您所在的任何范围内工作:

function assignString(scope, val){
    scope[val] = val;
}

assignString(window, "Hello");

console.logHello==>Hello

如果您发布assignString的代码并解释为什么需要这样做,这会很有帮助。此代码的执行将以未捕获的引用错误结束:赋值中的左侧无效…如果没有看到assignString,很难知道如何/是否这样做。@Pointy why你认为呢?好吧,OP在函数如何工作的含义上是不一致的。@Pointy你能给我一个赋值字符串函数的例子吗?根据OP问题,我真的不知道OP在说什么;它可以做上千种可能的事情。我不知道这些标识符是局部变量还是全局变量。这就是我的观点:你的答案可能是正确的,但它甚至可能不是很接近。@ Juhana,请考虑删除你的评论和投票,如果是你投下了票,因为我已经重新调整了我的解决方案,以匹配的情况。