когда следует использовать этот пример? - PullRequest
1 голос
/ 13 марта 2020

С учетом следующего кода:

if (!!a !== !!b) return false;

В каких случаях может потребоваться его реализация, а не использование свободного равенства:

if( a != b ) return false;

1 Ответ

1 голос
/ 13 марта 2020

Строго-неравенство (!==) булево-принудительных (!!) значений

Как показано в тестовых примерах ниже:

  • нативных объектов null и undefined не эквивалентны
  • другие объекты, тип которых принудительно вызывается с помощью toString или valueOf, зависят от их значения при проверке истинного состояния

Примечания:

  • !! не является необходимым, поскольку он применяется к обеим сторонам проверки условия, а само условие является проверкой неравенства; в этом случае ! необходимо преобразовать только в значение truey / falsey в true / false (соответственно); поэтому test3 и test4 являются другими эквивалентными примерами того, как это можно написать
  • , почему Svelte или другое приложение написали это так? Если это сделано намеренно, это может быть микрооптимизация, но для подтверждения этой гипотезы потребуется больше исследований.
  • Также важно сослаться на ( Что такое оператор !! (не не) в JavaScript? ), на которые @ VLAZ ссылается в комментариях. Также описывается влияние !! на ложные значения

Тестовые случаи

function test1(a,b){
  return !!a !== !!b
}

function test2(a,b){
  return a != b
}

function test3(a,b){
  return !a !== !b
}

function test4(a,b){
  return !(!a == !b)
}

console.log('test1(0,false):', test1(0, false) );
console.log('test2(0,false):', test2(0, false) );
console.log('test3(0,false):', test3(0, false) );
console.log('test4(0,false):', test4(0, false) );
separator()

console.log('test1(\'\',false):', test1('', false) );
console.log('test2(\'\',false):', test2('', false) );
console.log('test3(\'\',false):', test3('', false) );
console.log('test4(\'\',false):', test4('', false) );
separator()

console.log('test1(null,false):', test1(null,false) );
console.log('test2(null,false):', test2(null,false) );
console.log('test3(null,false):', test3(null,false) );
console.log('test4(null,false):', test4(null,false) );
separator()

console.log('test1(undefined,false):', test1(undefined,false) );
console.log('test2(undefined,false):', test2(undefined,false) );
console.log('test3(undefined,false):', test3(undefined,false) );
console.log('test4(undefined,false):', test4(undefined,false) );
separator()

console.log('test1([],false):', test1([],false) );
console.log('test2([],false):', test2([],false) );
console.log('test3([],false):', test3([],false) );
console.log('test4([],false):', test4([],false) );
separator()

console.log('test1([\'a\'],false):', test1(['a'],false) );
console.log('test2([\'a\'],false):', test2(['a'],false) );
console.log('test3([\'a\'],false):', test3(['a'],false) );
console.log('test4([\'a\'],false):', test4(['a'],false) );
separator()

console.log('test1([\'\'],false):', test1([''],false) );
console.log('test2([\'\'],false):', test2([''],false) );
console.log('test3([\'\'],false):', test3([''],false) );
console.log('test4([\'\'],false):', test4([''],false) );
separator()

console.log('test1([0],false):', test1([0],false) );
console.log('test2([0],false):', test2([0],false) );
console.log('test3([0],false):', test3([0],false) );
console.log('test4([0],false):', test4([0],false) );
separator()

console.log('test1([1],false):', test1([1],false) );
console.log('test2([1],false):', test2([1],false) );
console.log('test3([1],false):', test3([1],false) );
console.log('test4([1],false):', test4([1],false) );
separator()

console.log('test1({},false):', test1({},false) );
console.log('test2({},false):', test2({},false) );
console.log('test3({},false):', test3({},false) );
console.log('test4({},false):', test4({},false) );
separator()

console.log('test1({a:1},false):', test1({a:1},false) );
console.log('test2({a:1},false):', test2({a:1},false) );
console.log('test3({a:1},false):', test3({a:1},false) );
console.log('test4({a:1},false):', test4({a:1},false) );

function separator(){console.log('='.repeat(30))}
.as-console-wrapper { 
  height: 100vh !important;  
  max-height: 100vh !important; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...