JS中的字符串比较对于逻辑运算符的应用

3
我想要实现用户定义的逻辑条件。由于用户定义基本上是字符串,我试图通过避免字符串比较来使代码更加高效。例如,一个简单的测试如a == 10将被表示为一个数组。
var userDef = ['a', '==', 10]

为了使逻辑评估更加高效,我想要创建一个类似于ffg的对象。
var binaryOperator = {'==': 0, '>': 1, '<': 2}

因此,当我遍历这个数组时,我可以做...

if(binaryOperator[userdef[1]] == 0)
{
    return (obj[userDef[0]] == userDef[2])
}

... 当然 obj.a = something。从表面上看,上面的代码避免了字符串比较。

但是实际上呢?引用 binaryOperator[userdef[1]] 真的很快吗,还是在某个地方也涉及到了字符串比较?

换句话说,在 thisObj.athisObj['a'] 之间存在性能差异吗?


这行代码有语法错误:(obj[userDef[0] == userDef[2]) - gurvinder372
是的,我已经更正了,就像你评论的那样,但还是谢谢。 - Randhir Rawatlal
为什么不写成 if( userdef[1] == '==' ) 或者 switch( userdef[i] ){ case "==" }... 呢? - gurvinder372
你怎么知道操作数是否是对象的访问器? - Nina Scholz
这Obj.a和thisObj['a']之间有性能差异吗? 1.方括号表示法允许使用不能与点表示法一起使用的字符。 2.当处理变量名时,方括号表示法非常有用。 3.当属性名称是动态确定的时,可以使用方括号。要使用点,必须属性名称 4.方括号允许包含特殊字符的属性。 - Neeraj Goswami
显示剩余4条评论
1个回答

2
你可以省略对运算符的检查并将函数作为值,例如:
var binaryOperator = {
        '==': function (a, b) { return a === b; },
        '<': function (a, b) { return a < b; },
        '>': function (a, b) { return a > b; }
    };

Javascript中的对象具有O(1)的访问权限。

进一步阅读:


我真的很喜欢这个 - 尽管它可能有相同的问题 - 使用binaryOperator.==是合法的,那么binaryOperator['==']也同样高效吗? - Randhir Rawatlal
这是因为对象具有O(1)的访问权限。 - Nina Scholz
嗯,你最后的评论开始回答了这个问题。如果你能把它写成一个答案,并且可能附上一些参考资料证明 obj['attribute'] 记法是 O(1),我会将其标记为已接受的。记住,我的基本担忧是使用字符串作为对象属性访问器可能涉及到字符串比较本身。 - Randhir Rawatlal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接