Jshint: Отказаться от использования "Запутанное использование"! ".

Созданный на 13 февр. 2012  ·  41Комментарии  ·  Источник: jshint/jshint

Эта проверка была добавлена ​​для проблемы № 211, но нет возможности отказаться от этого обнаружения. Как предлагал исходный плакат с этой проблемой, он должен быть включен по умолчанию, но с переопределением.

Самый полезный комментарий

!! это самый простой способ преобразовать «что угодно» в «bool». +1 за отказ

Все 41 Комментарий

Не могли бы вы привести нам действительный пример использования?

https://github.com/jshint/jshint/issues/211#issuecomment -3942380

Мне также любопытно обнюхивать IE6.

Закрытие этого тикета, так как мы не получили ни одного действительного примера использования. Не стесняйтесь снова открыть его позже.

Является

if( !!a === !!b ){  

допустимый образец (операнды с приведением типов к типу bool)?
Я считаю это более кратким, чем

if( (a && b) || (!a && !b) ) {

Да, это хорошо.

Образцы из выпуска № 211 все еще действительны, то есть «запутанные» или даже опасные.
Я не уверен, что отказ - лучшее решение или `!! x 'следует считать действительным?

if (! (mseq <= this.messages.length)) {выбросить новую ошибку ('недопустимый mseq:' + mseq); }

Это красиво выдаст ошибку, когда mseq не является числом, если оно больше, чем this.messages.length

Пришел сюда с вариантом использования, похожим на @axkibe. Перевернутый регистр не обнаружит сразу ошибки диапазона и недопустимые данные.

Это не кажется мне плохой практикой, учитывая, что полученный код удобочитаем и прямолинеен.

Убийственная особенность jshint - это отказ, в отличие от crockford-ed-in.

Для ясности в нашем модульном тесте я определил assert.greater et al так:

        greater: function(lhs, rhs) {
            if (!(lhs > rhs)) {
                fail(new AssertionError(repr(lhs) + ' not greater than ' + repr(rhs)));
            }
        },

        less: function(lhs, rhs) {
            if (!(lhs < rhs)) {
                fail(new AssertionError(repr(lhs) + ' not less than ' + repr(rhs)));
            }
        },

        greaterOrEqual: function(lhs, rhs) {
            if (!(lhs >= rhs)) {
                fail(new AssertionError(repr(lhs) + ' not greater than or equal to ' + repr(rhs)));
            }
        },

        lessOrEqual: function(lhs, rhs) {
            if (!(lhs <= rhs)) {
                fail(new AssertionError(repr(lhs) + ' not less than or equal to ' + repr(rhs)));
            }
        },

Я написал это так для ясности и был бы признателен за отказ от этого предупреждения.

+1 с моей стороны за отказ (мы пойманы на !!a == !!b ).

Кстати, это похоже на дубликат: https://github.com/jshint/jshint/issues/578

Это ошибка, а не предупреждение. По документам-комментариям закрывающего коммита предупреждения можно игнорировать, но не ошибки.

Итак, что мне делать вместо if (! (Event.which == ESCAPE_KEY)) {в соответствии с вашими лучшими практиками?

Зачем тебе это писать?

Что плохого в том, чтобы четко заявить о намерении программы?

if (event.which !== ESCAPE_KEY) {...}

Не мой код, не знаю о намерениях. Я нашел его в какой-то библиотеке, и из-за этого jshint не проверял его.

Почему вы используете код сторонней библиотеки? Разве это не работа автора?

Является ли! (A == b) некрасивым или нет, должен быть отказ, верно? Я думал, что философия jshint заключается в том, чтобы отказаться от каждого предупреждения.

Лично я обнаружил, что в случае утверждений тестовой среды проще написать условное выражение, соответствующее утверждению:

function assertEqual(x, y) {
    if (!(x == y)) { ... }

function assertNotEqual(x, y) {
    if (!(x != y)) { ... }

function assertGreater(x, y) {
    if (!(x > y)) { ... }

Как насчет этого примера?

if ( !((end - start) % 2) ) // do stuff

Я мог бы создать переменную для хранения этого значения, но зачем? Мне не кажется, что использование оператора NOT сбивает с толку, поэтому он не должен вызывать ошибку.

Зачем здесь нужно быть «умным»? Что плохого в том, чтобы просто написать то, что вы на самом деле имеете в виду? (a - b) % 2 === 0

Если кто-то захочет написать патч I, я с радостью рассмотрю его для включения, но до тех пор я не хочу читать другие комментарии в этой ветке. Меньше разговоров, больше дел. Мы можем обсуждать любой выпускаемый патч столько, сколько пожелают автор, участники и заинтересованные стороны.

У меня есть вариант использования. Я получаю значение из базы данных, которое должно быть логическим, но оно возвращается как '0' или '1' . Я выполняю преобразование с помощью !!+val , который преобразуется в число, а затем в логическое значение, но выдает это предупреждение jshint. Добавление скобок не отменяет предупреждения. Предупреждение не появляется с !!val но это неверно, потому что '0' отличие от 0 является правдой. Я просто отключил W018 для рассматриваемой линии.

+1 для отказа, !!x - допустимый вариант использования и общая идиома для преобразования в bool, как указали @mgoldWork и @ jakub-g

+1 за !!a === !!b

на самом деле !!x можно использовать где угодно для преобразования в bool ...

может ли он быть отмечен как допустимая конструкция в jshint (без необходимости отказа), @valueof?

+1 за отказ

Это здорово, когда первый результат Google для проблемы - это закрытый вопрос, не имеющий решения.

Согласно # 780, эту опцию можно отключить / включить с помощью совершенно не загадочных /*jshint -W018 */ и /*jshint +W018 */

+1 для более загадочного отказа.

@ cjc343 спасибо.

также должен быть способ отказаться от .jshintrc .

всякий раз, когда кто-то спрашивает, как от чего-то отказаться, люди всегда возвращаются со словами «но зачем вам это писать, это плохой плохой код». это никогда не будет правильным ответом на просьбу об отказе. если они просят об отказе, они не согласны с вами, что это на 100% всегда плохо, вот и все. jshint должен нам помогать, а не мешать. все должно быть отключено. абсолютно все.

Что такое поле .jshintrc позволяющее запутать использование ! ?

Например, следующее предупреждение дает мне:

function even(n) {
  return !(n % 2)
}

+1 за отказ

Не могли бы вы привести нам действительный пример использования?

console.assert(!!prototype === !!object, 'invalid state', prototype, object);

+1. Вот один из моих распространенных вариантов использования:

// Note: points is an array, each having latitude and longitude
var dataset = {};
points.forEach(function(point){
    if (!(dataset.latMin<point.lat)) dataset.latMin = point.lat;
});

Обратите внимание, что !(dataset.latMin<point.lat) не то же самое, что dataset.latMin>=point.lat если LHS не определен.

Обратите внимание, что! (Dataset.latMin= point.lat, если LHS не определен.

Разве это не сбивает с толку бедного человека, читающего код?

В любом случае, это было объединено в # 780, где отмечено, что вы можете использовать W018 чтобы отключить это предупреждение.

if (data === undefined || (!(data.length > 0))) 

считается запутанным. так это

if (data === undefined || !(data.length > 0)) 

Что делать?

Ты пробовал

-if (data === undefined || !(data.length > 0)) 
+if (data === undefined || data.length <= 0) 

... хотя такое имя свойства, как length заставляет меня подозревать, что data.length === 0 может хватить.

Это не эквивалентно, потому что для объекта, не являющегося массивом, без свойства длины ваши примеры дают false.
Теперь я понимаю, что есть также строки со свойством "length" по умолчанию, поэтому мне, возможно, придется сначала проверить тип -.-

Whether or not ** is ugly or not, there should be an opt-out, right?

да. Я не уверен, почему это обсуждается.

!! это самый простой способ преобразовать «что угодно» в «bool». +1 за отказ

Случай, с которым я постоянно сталкиваюсь, заключается в том, чтобы проверить, не является ли что-то положительным:
if (!(n > 0))
В противном случае нужно написать что-то вроде:
if (typeof n != 'number' || isNaN(n) || n <= 0)

Случай, с которым я постоянно сталкиваюсь, заключается в том, чтобы проверить, не является ли что-то положительным:
если (! (n> 0))
В противном случае нужно написать что-то вроде:
if (typeof n! = 'число' || isNaN (n) || n <= 0)

Именно поэтому я пришел сюда, задаваясь вопросом, почему jshint мешает мне писать код так, как я хочу.

!(n > 0) и typeof n != 'number' || isNaN(n) || n <= 0 - это не одно и то же:

var n = "1";
console.log(!(n > 0)); // false
console.log(typeof n != 'number' || isNaN(n) || n <= 0) // true

В любом случае, вы можете просто использовать -W018, чтобы отключить предупреждение

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

ghost picture ghost  ·  5Комментарии

TheSavior picture TheSavior  ·  3Комментарии

SidNM picture SidNM  ·  7Комментарии

voronianski picture voronianski  ·  8Комментарии

Guichaguri picture Guichaguri  ·  8Комментарии