Подтвердить что ты не робот

Почему 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. Мне было интересно, как я могу переписать это, чтобы быть более "стандартным".

EDIT: состояния 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 '|'.
4b9b3361

Ответ 1

Помещенный

/*jshint bitwise: false*/

в верхней части файла

Список доступных опций: http://jshint.com/docs/options/

Ответ 2

Согласно JSHint docs, это потому, что

"Побитовые операторы очень редки в программах JavaScript"

Как уже упоминалось, вы можете отключить параметр bitwise JSHint, чтобы отменить предупреждения.

Ответ 3

Вы застряли столько кода в одну строку (почему?), что вы не можете сказать, что именно указывает jshint. Я переформатировал код, и я вижу следующее:

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

Что там делает | 0? Это бесполезный нет-op. UPDATE: похоже, это способ int-ify float.

Jshint, похоже, не похож на другие вещи, но, по крайней мере, избавиться от этого. И распространите свой код, чтобы вы (и другие) могли его прочитать.

Ответ 4

О "Почему спорят против побитовых операторов". Мне нравится это от TSLint docs

Побитовые операторы часто опечатываются (...) Они также могут быть индикатором слишком умного кода, который уменьшает ремонтопригодность.

Ответ 5

это отлично работает для меня:

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