如果!0是真的那么“真实&&!0”如何回归真实而不是!0?

时间:2018-06-04 21:55:13

标签: javascript

根据我的理解,如果两个值都是真实的,它应该返回最后的真值,在这种情况下应该是!0。

2 个答案:

答案 0 :(得分:5)

我不是javascript开发人员,但这很简单。

  

int 0 等于 int 0

     

int 1 等于 int 1

     

int 0 == bool false 等于 true (这意味着JS威胁0为假,并将0强制转换为bool)

     

int 1 == bool true equals true (这意味着JS威胁1为真,并将1强制转换为bool)

     

bool!0 等于 true(!0变为true,因为true的反义为false,0在此处为0,因为!解释并将其强制转换为布尔值)

     

!1 等于 false

就我的javascript知识而言,一旦你使用!,它将成为一个布尔值,因为它试图将int转换为bool。

true && !0 == true因为!0是真的。

基本上它正在解析为 true && true == true因此返回布尔值true,而不是!0。

答案 1 :(得分:1)

虽然Droppy的答案是正确的,但它缺乏对遇到的行为的正确深入解释:

!{statement}只是not {statement}的人类可读形式。

!是逻辑NOT运算符,它会反转{statement}的{​​{3}}或truthiness

在这种情况下,

0不会转换为任何东西 - 它只是一个假值,因为!是一个运算符,它会返回反向falsy / truthy匹配的结果。来自falsiness

  

如果单个操作数可以转换为true,则返回false;否则,返回true。

您可以通过执行以下操作轻松获取语句错误/真实性的布尔结果:!!{statement}。对于您的示例,!!0提供false,同样!!1提供true

如果我们根据JS标准编写我们自己的逻辑IS和NOT函数,它看起来像:



function logicalIs(statement) {
  if(statement === undefined) return false;
  if(statement === null) return false;
  if(statement === false) return false;
  if(statement === "") return false;
  if(statement === '') return false;
  if(statement === 0) return false;
  if(typeof(statement) === 'number' && isNaN(statement)) return false;
  // document.all: Willful violation for IE legacy reasons
  if(statement === document.all) return false; 
  return true;
}

function logicalIsNot(statement) {
  if(statement === undefined) return true;
  if(statement === null) return true;
  if(statement === false) return true;
  if(statement === "") return true;
  if(statement === '') return true;
  if(statement === 0) return true;
  if(typeof(statement) === 'number' && isNaN(statement)) return true;
  // document.all: Willful violation for IE legacy reasons
  if(statement === document.all) return true;
  return false;
}

let truthy = [true, 1, 'a', "b", [], {}, function(){}];
let falsy = [false, 0, '', "", NaN, null, undefined, document.all];

console.log('logical truthy: ', JSON.stringify(truthy.map(logicalIs)));
console.log('logical falsy: ', JSON.stringify(falsy.map(logicalIs)));

console.log('logical not truthy:', JSON.stringify(truthy.map(logicalIsNot)));
console.log('logical not falsy:', JSON.stringify(falsy.map(logicalIsNot)));