使用eval和比较

时间:2011-07-21 21:13:43

标签: javascript

我正在尝试创建一个比较对象中键值的函数。我想使用'this'关键字来引用键值,但是值可能是原语而不是对象。为此,我使用eval来评估if语句中键的值。

所以我可以做这样很酷的事情......

    bar.find({ key: 'this - 2 === 5' });

    bar.find({ key2: 'this.length === 11' });

    // In order to do this I have a function similar to this

    // constructor function for my object
    function foo(arg){
        this.key = 5;
        this.key2 = 'hello world';
    };

    // method to find if matching key values exist
    foo.prototype.find = function(args){
        // variable to hold the contents of the anonymous function
        var compare;

        // create an anonymous function to shield the eval from executing
        // potentially harmful code, by overwriting the document and window.
        (function(window, document){                
            compare = function(comparison){
                if ( eval( comparison ) )
                    return true;
                else
                    return false;
            };              
        })();

        // Loop over the keys in args
        for( i in args ){
            if ( this[i] ) {
                // call the compare function bound to the scope of the
                // keys value
                return compare.call(this[i], args[i]);  
            }
            else {
                return false;
            };      
        };
    };

    // Create an new foo object

    bar = new foo;

    // test it, should return true

    bar.find({key: 'this - 2 === 3', key2: 'this.length === 11'});
    >> false // 5 - 2 === 3
    >> false // 'hello world'.length === 11

我遇到的问题不是代码不起作用。完全===运算符不起作用,但==运算符工作正常。

如果我这样做

    bar.find({key: 'this - 2 == 3', key2: 'this.length == 11'});
    >> true // 5 - 2 == 3
    >> true // 'hello world'.length == 11

这是eval正在做的事情,导致类型不匹配吗?

或者,如果有人有更好的选择来实现同样的目标。

2 个答案:

答案 0 :(得分:0)

第8版的Worksforme。我不知道eval会如何搞乱这些类型。

通常不需要使用eval,它很慢,也许比传递函数更简洁,但我仍然更喜欢函数,所以你可以将参数更改为bar.find({key: function () { return this - 2 === 3 }, key2: function () { return this.length === 11 })

答案 1 :(得分:0)

不要使用eval它会调用全局范围内的所有内容,因此this的值将不正确。

直接使用回调函数,因此您的代码看起来更像:

bar.find({
    key: function() { return this - 2 === 3; },
   key2: function() { return this.length === 11; }
});