【问题标题】:Javascript - How can I find the name of a variable instead of the value it holdsJavascript - 如何找到变量的名称而不是它所持有的值
【发布时间】:2017-03-12 00:56:30
【问题描述】:

我有这个函数来设置画布上立方体的移动(随机),everyVar 是将要使用的变量,a,b,c,d+,-,*,/ 的函数(对不起,如果它混淆了)。有没有办法找到变量的名称而不是它所持有的值?我有“user.s = a(b(c(d(r, 2), e), w), q);”,我需要一种方法将其放入重复函数中,以便变量保持不变,但信息会更新,但如果我将它放在其他地方,它将有不同的变量。我不能只设置另一个变量,如myVariable = q,因为它会保存数字而不是变量本身(例如,我需要它说 user.y 而不是 300)。请让你的答案尽可能简单,因为我是一个初学者,你可能知道。

function setMovement(user){
    var everyVar = [user.x, user.y, user.direction, user.distance]

    var q = everyVar[Math.floor(Math.random()*everyVar.length)];
    var w = everyVar[Math.floor(Math.random()*everyVar.length)];
    var e = everyVar[Math.floor(Math.random()*everyVar.length)];
    var r = everyVar[Math.floor(Math.random()*everyVar.length)];

    user.s = a(b(c(d(r, 2), e), w), q);

    a = operators[Math.floor(Math.random()*operators.length)]
    b = operators[Math.floor(Math.random()*operators.length)]
    c = operators[Math.floor(Math.random()*operators.length)]
    d = operators[Math.floor(Math.random()*operators.length)]
}

【问题讨论】:

  • 希望这会有所帮助:stackoverflow.com/questions/22548885/…
  • 我必须承认,标题中的问题和描述似乎有点脱节。标题问题询问有关获取变量名称的问题 - James 发布了一个很好的链接,展示了如何解决该部分。但是描述似乎你想在 user.s 上放置一个函数,以便在函数外部调用转换,并指向传递给 setMovement 函数的值。如果是这种情况,您可以将 user.s 分配为一个函数,而不是将函数存储在用户对象上的调用,然后随意调用它。

标签: javascript


【解决方案1】:

这里有一些你可以使用的代码:

// Define the operators as functions
var operators = [
    function add(x, y) { return x + y },
    function sub(x, y) { return x - y },
    function mul(x, y) { return x * y },
    function div(x, y) { return x / y }
];

// Don't reference the values, but the property names
var everyVar = ['x', 'y', 'direction', 'distance'];

function setMovement(user){
    var q = everyVar[Math.floor(Math.random()*everyVar.length)];
    var w = everyVar[Math.floor(Math.random()*everyVar.length)];
    var e = everyVar[Math.floor(Math.random()*everyVar.length)];
    var r = everyVar[Math.floor(Math.random()*everyVar.length)];

    var a = operators[Math.floor(Math.random()*operators.length)]
    var b = operators[Math.floor(Math.random()*operators.length)]
    var c = operators[Math.floor(Math.random()*operators.length)]
    var d = operators[Math.floor(Math.random()*operators.length)]

    // Make s a function, so the expression is evaluated with the
    // current values of the user object properties:
    user.s = function () {
        return a(b(c(d(user[r], 2), user[e]), user[w]), user[q]);
    };
    // For debugging, you can use this extra property to see
    // which expression the "random" function evaluates:    
    user.s.description = `${a.name}(${b.name}(${c.name}(${d.name}` +
                         `(user.${r}, 2), user.${e}), user.${w}), user.${q})`;
}

// same data
var user = {
    x: 20,
    y: 10,
    direction: 1,
    distance: 5
}
// Define "random" function user.s
setMovement(user);

console.log( 'user.s() evaluates this expression:\n', user.s.description );

console.log( 'result of user.s():', user.s() );

// Change x and y and display result then:
user.x -= 5; 
user.y += 10;
console.log( 'result of user.s():', user.s() );

注意:除法时要小心:当第二个参数为 0 时,会出现运行时错误。

【讨论】:

  • 是的,这就是我试图用我的评论来解决的问题,如果你将这个答案与我的结合起来,并在除法函数中占 0 除法,你会得到你想要的。
  • @Espen,我不想使用Object.keys,因为user 对象可能拥有(或获取)与位置或移动无关的其他信息,例如用户名.此外,由 OP 决定如何处理除以 0 .. 我刚刚提到它作为警告。也许除法不是一个很好的候选函数,或者除以零应该被某个常数值代替,或者也许值永远不会被认为是零,......当它们是时,应该引发异常。这一切都取决于期望,这并不是问题中提出的真正问题。
  • 那么我会将带有移动属性名称的数组移动到设置移动函数的范围内,而不是关闭它来保护它。
【解决方案2】:

我现在正在尝试修改您的代码。我相信您正在寻找的是 Object.keys()

function setMovement(user){
    var everyVar = Object.keys(user);

    var q = everyVar[Math.floor(Math.random()*everyVar.length)];
    var w = everyVar[Math.floor(Math.random()*everyVar.length)];
    var e = everyVar[Math.floor(Math.random()*everyVar.length)];
    var r = everyVar[Math.floor(Math.random()*everyVar.length)];

    user.s = a(b(c(d(r, 2), e), w), q);

    a = operators[Math.floor(Math.random()*operators.length)]
    b = operators[Math.floor(Math.random()*operators.length)]
    c = operators[Math.floor(Math.random()*operators.length)]
    d = operators[Math.floor(Math.random()*operators.length)]
}

现在您将用户对象的所有属性作为数组中的字符串获取,您可以使用常规数组索引语法将它们用于赋值:

var user = { x:10, y:20,direction:1,distance:10};
var everyVar = Object.keys(user);
var x = user[everyVar[1]];

将 10 赋给变量 x

【讨论】:

    猜你喜欢
    • 2014-04-28
    • 2010-12-31
    • 1970-01-01
    • 2015-08-08
    • 2021-04-06
    • 2019-12-23
    • 2022-11-16
    • 2017-09-23
    • 1970-01-01
    相关资源
    最近更新 更多