为什么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();