测试全局构造函数|满足jslint

时间:2013-07-08 14:45:45

标签: javascript jslint qunit

/*global
    test: true,
    equal: true,
*/

(function () {
    "use strict";
    test("each() and internals", function () {
        var globals = [
                new Array(),
                new Object(),
                new String(),
                new Number(),
                new Function(),
                new Boolean(),
                new Date(),
                new RegExp()
            ],
            ...

我正在写一些QUnit测试,我想传递jslint。我想使用一组全局对象,因为它们与它们的文字表示明显不同。

Jslint除了最后的2之外不喜欢这些。我没有看到放松jslint的活力的选项。

是的,我希望我的功能测试能够传递jslint(而不是jshint)。是的我想使用Object Constructor而不是我的一些测试的文字。

测试失败

Use the array literal notation [].

                new Array(),

line 31 character 21
Use the object literal notation {} or Object.create(null).

                new Object(),

line 32 character 21
Do not use String as a constructor.

                new String(),

line 33 character 21
Do not use Number as a constructor.

                new Number(),

line 34 character 29
The Function constructor is eval.

                new Function(),

line 35 character 21
Do not use Boolean as a constructor.

                new Boolean(),

3 个答案:

答案 0 :(得分:2)

来自JSLint说明

http://www.jslint.com/lint.html

  

JSLint不希望看到包装器形成新的Number,new   String,new Boolean。

     

JSLint不希望看到新的Object。请改用{}。

     

JSLint不希望看到新的Array。请改用[]。

看起来似乎没有控制

的选项

答案 1 :(得分:1)

Jslint怀疑你真的想这样做,因为使用构造函数会使比较意外失败:

var s1 = new String('hi');
var s2 = new String('hi');

// but s1 == s2 is false now!  Not to mention 'hi' === s1!

更多细节:http://jslinterrors.com/do-not-use-a-as-a-constructor/

答案 2 :(得分:1)

此行为由以下switch statement in the JSLint source控制:

switch (c.string) {
case 'Object':
    token.warn('use_object');
    break;
case 'Array':
    if (next_token.id === '(') {
        // ...
        if (next_token.id !== ')') {
            // ...
        } else {
            token.warn('use_array');
        }
        // ...
    }
    token.warn('use_array');
    break;
case 'Number':
case 'String':
case 'Boolean':
case 'Math':
case 'JSON':
    c.warn('not_a_constructor');
    break;
case 'Function':
    if (!option.evil) {
        next_token.warn('function_eval');
    }
    break;
case 'Date':
case 'RegExp':
case 'this':
    break;
default:
    // ...
}

如您所见,除Function构造函数外,没有选项可以打开或关闭这些检查。可以通过将evil选项设置为true来关闭该警告。

在您的情况下,您可以安全地将ArrayObject构造函数的调用替换为其文字副本。对于其他警告,你别无选择,只能忽略它们。