为什么JSHint反对按位运算符?我该如何表达这段代码?

时间:2012-07-23 00:12:58

标签: javascript jslint jshint

我正在使用这段JavaScript来生成UID:

(原:)

//If ID has not been defined then generate a new unique ID.
if(!id){
    id = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); });
}

(格式化,以便可以阅读:)

// If ID has not been defined then generate a new unique ID.
if (!id) {
    id = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(
        /[xy]/g, 
        function (c) { 
            var r = Math.random() * 16 | 0, 
                v = c == 'x' ? r : (r & 0x3 | 0x8); 
            return v.toString(16); 
        }
    );
}

JSHint不喜欢使用按位OR和AND运算符。我想知道如何将其重写为更加“标准友好”。

编辑:JSHint声明:

Line 8: id = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); });
Unexpected use of '|'.

Line 8: id = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); });
Expected '===' and instead saw '=='.

Line 8: id = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); });
Unexpected use of '&'.

Line 8: id = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); });
Unexpected use of '|'.

5 个答案:

答案 0 :(得分:69)

/*jshint bitwise: false*/

位于文件顶部

可用选项列表:http://jshint.com/docs/options/

答案 1 :(得分:17)

根据JSHint docs,这是因为

  

"在JavaScript程序中,按位运算符非常少见"

正如其他人所提到的,你可以禁用bitwise JSHint选项来压制警告。

答案 2 :(得分:6)

你把这么多代码塞进了一行(为什么??),你无法分辨出jshint指向你的是什么。我重新格式化了代码,我看到了:

var r = Math.random() * 16 | 0, 

| 0在那里做什么?这是一个不必要的无操作。更新:似乎是一种整合浮动的方法。

Jshint似乎不喜欢其他东西,但至少要摆脱这个。并传播你的代码,以便你(和其他人)可以阅读它。

答案 3 :(得分:2)

关于“为什么反对按位运算符”。我喜欢TSLint docs

  

按位运算符通常是拼写错误(...)   它们也可以成为过于聪明的代码的指标,降低了可维护性。

答案 4 :(得分:-1)

这对我来说很好:

return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,
    function(c: string) {
        var r = Math.floor(Math.random() * 16), 
            v = c === 'x' ? r : (r % 4 + 4);
        return v.toString(16);          
    }).toUpperCase();