Зачем использовать двойные восклицательные знаки в операторе if? - PullRequest
0 голосов
/ 08 сентября 2018

Недавно я прочитал некоторый код, который использует !! для преобразования переменной в логическое значение для оценки в операторе if. Это кажется мне несколько избыточным, так как переменная все равно будет оценена для ее логического значения. Есть ли какие-либо преимущества в производительности для улучшения поддержки браузера?

Пример кода:

var x = 0;
var atTop = x===window.scrollY;
if(!!atTop){
   alert("At the top of the page.");
}

Редактировать

Я также видел это для операндов, которые не относятся к булевым типам, но я всегда предполагал, что использование if в любом случае оценило бы логическое значение переменной, так как все значения в Javascript являются либо «истинными», либо «ложными» .

Пример кода:

var x = 1;//or any other value including null, undefined, some string, etc
if(!!x){//x is "truthy"
   //wouldn't using if(x) be the same???
   console.log("something...");
}

Ответы [ 4 ]

0 голосов
/ 08 сентября 2018

Все зависит от значения переменной atTop. Следите за обсуждением здесь .

В итоге, если значение atTop отличается от boolean, первое отрицание преобразует его в логическое значение (отрицается). Второе отрицание вернет логическое значение эквивалентному логическому исходному значению atTop.

Например, если atTop равно undefined, сначала ! превратит его в boolean true, затем второй ! превратит его в boolean false (что будет эквивалентно логическому значению undefined )

Однако в вашем коде значение atTop является результатом строгого равенства ===, что означает, что вы всегда получаете логическое значение в результате atTop. Таким образом, вам не нужно преобразовывать не логическое значение в логическое, поэтому !! не требуется.

0 голосов
/ 08 сентября 2018

Я бы сказал, что в основном это делается для удобства чтения кода. Я сомневаюсь, что это может повлиять на производительность или совместимость (кто-то может проверить это, пожалуйста)

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

Хотя в вашем случае это уже логическое значение, так что оно на 100% избыточно, но я бы догадался, что кто-то из приведенных выше рассуждений применяет чрезмерно, и / или видит его в другом месте и копирует этот шаблон, не понимая его полностью (кратко Время истории: в C # вы можете назвать защищенный термин именем переменной, добавив @, поэтому var @class = "hello";, младший разработчик только что принял все имена переменных, необходимые @ перед ними, и закодировал таким образом. Интересно, если бы кто-то предположил, что оператор if без сравнения должен иметь !! перед ним как оператор сравнения)

0 голосов
/ 08 сентября 2018

В выражении if нет никаких преимуществ (или объективных) во время выполнения.Оценка, выполненная оператором if, даст точно такой же результат, что и оценка, произведенная двойным восклицательным знаком.Разницы нет.

Двойные восклицательные знаки - полезное выражение для обеспечения логического значения, основанного на правдивости.Рассмотрим, к примеру:

var text = undefined;
console.log(text); // undefined
console.log(!!text); // false

// It would make sense here, because a boolean value is expected.
var isTextDefined = !!text;

// It would also affect serialization
JSON.stringify(text); // undefined (non-string)
JSON.stringify(!!text); // "false"

Я полагаю, что это привычка, которая была подхвачена из-за описанных выше случаев использования, поэтому при обращении к истинности переменной всегда конвертируется в логическое значение.Нам (людям и программистам) легче следовать правилу, когда оно всегда применяется.Вы либо будете постоянно использовать мигалки в своей машине, даже когда вокруг никого нет, или, скорее всего, вы время от времени (или, может быть, часто) забываете сигнализировать, когда это необходимо.

0 голосов
/ 08 сентября 2018

Краткий ответ : Нет, причин нет.

В вашем коде это уже тип boolean, нет необходимости преобразовывать его и преобразовывать обратно, вы всегда получите тот же результат. На самом деле, если у вас есть логическое значение (true или false), когда вы используете !! с любым из них, оно будет преобразовано обратно в исходное значение:

console.log(!!true); // Will be always "true"
console.log(typeof !!true); // It stills a "boolean" type
console.log(!!false); // Will be always "false"
console.log(typeof !!false); // It stills a "boolean" type

Ответ на отредактированный вопрос : Да, то же самое. Вот что на самом деле if(...) делает - пытается преобразовать любой тип в boolean.

Вот небольшой тест, вы можете поэкспериментировать с ним и добавить все, что вы хотите, в initialArr массив для тестирования, он ведет себя так же с if и !!:

const initialArr = [
  undefined,
  null,
  true,
  false,
  0,
  3,
  -1,
  +Infinity,
  -Infinity,
  Infinity,
  'any',
  '',
  function() { return 1 },
  {},
  { prop: 1 },
  [],
  [0],
  [0, 1]
];

function testIsTheSame(arr) {
  equolityCounter = 0;
  arr.forEach(item => {
    let ifStatement = false;
    let doubleNotStatement = !!item;
    if(item) {
      ifStatement = true;
    }

    if(ifStatement === doubleNotStatement && typeof ifStatement === typeof doubleNotStatement) {
      equolityCounter++;
    }
  });
  console.log(`Is the same: ${equolityCounter === arr.length}`);
}

testIsTheSame(initialArr);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...