根据我的理解,如果两个值都是真实的,它应该返回最后的真值,在这种情况下应该是!0。
答案 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)));