Строго-неравенство (!==
) булево-принудительных (!!
) значений
Как показано в тестовых примерах ниже:
- нативных объектов
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;
}