为什么JSHint反对按位运算符? 我应该如何expression这个代码?

我正在使用这一点的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 '|'. 

 /*jshint bitwise: false*/ 

在你的文件的顶部

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

根据JSHint文件 ,这是因为

“按位运算符在JavaScript程序中非常罕见”

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

你已经把这么多的代码塞进一行(为什么??),你不能告诉什么jshint指出你。 我已经重新格式化了代码,我看到这个:

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

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

Jshint似乎不喜欢其他的东西,但至less摆脱这一点。 并且把你的代码传播出去,以便你(和其他人)可以读取它。

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

按位运算符通常是拼写错误(…)它们也可以是过度巧妙的代码的一种指示,这降低了可维护性。

这对我来说很好:

 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();