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

Sea*_*son 45 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); });
}
Run Code Online (Sandbox Code Playgroud)

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

// 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); 
        }
    );
}
Run Code Online (Sandbox Code Playgroud)

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 '|'.
Run Code Online (Sandbox Code Playgroud)

zer*_*kms 69

/*jshint bitwise: false*/
Run Code Online (Sandbox Code Playgroud)

在文件的顶部

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

  • 不回答_why_的问题. (55认同)
  • @Snekse:显然因为在JS中使用按位运算符很少见,并且很可能用户将`&&`与`&`混淆 (9认同)
  • 你也可以通过将它包装在你的语句中来本地禁用它:`/*jshint bitwise:false*/你的语句/*jshint按位:true*/` (2认同)

ecz*_*ajk 17

根据JSHint的文档,这是因为

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

正如其他人所提到的,您可以禁用bitwiseJSHint选项来压制警告.

  • 回答这个问题的唯一答案,应该被接受.但JSHint(和TSLint)标记按位操作的原因实际上是非常愚蠢的.对于按位运算符,存在适当但罕见的使用场景,对于这些场景,除了按位运算符之外,您永远不应该使用任何东西. (4认同)

Ned*_*der 6

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

var r = Math.random() * 16 | 0, 
Run Code Online (Sandbox Code Playgroud)

在那| 0做什么?这是一个不必要的无操作.更新:似乎是一种int-ify浮点数的方法.

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

  • 我只是使用此处提供的第二个解决方案:http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript在此解决方案中存在200+票的感知无操作.它真的没有做任何事情吗?编辑:是的,按位OR肯定会做点什么.http://stackoverflow.com/questions/7487977/using-bitwise-or-0-to-floor-a-number (2认同)
  • 哎呀,这可能是一种怪异的Java语言表达方式,将其截断为int。 (2认同)