我不知道为什么以下代码返回false。
var pets = ['cat', 'dog', 'bat'];
console.log(pets.includes(('cat' && 'monkey') || 'bat' ));
由于“蝙蝠”位于宠物阵列中,我认为这返回了真。
知道为什么这不起作用吗?
答案 0 :(得分:2)
这是因为('cat' && 'monkey') || 'bat'
给出了monkey
。它给出monkey
的原因是因为'cat' && 'monkey'
和monkey
都被定义并且两个定义的值都使用cat
时monkey
表达式的求值为&&
,则采用第二个值,即monkey
。并且在评估'monkey' || 'bat'
时,它给出了第一个值monkey
,在这种情况下,这两个值也都被定义了,但是在||
表达式中,它给出了第一个定义的值,即monkey
在这种情况下。
这是个谜,
pets.includes(('cat' && 'monkey') || 'bat');
//becomes
pets.includes('monkey'); //which is false
var pets = ['cat', 'dog', 'bat'];
console.log(('cat' && 'monkey') || 'bat');
console.log(pets.includes(('cat' && 'monkey') || 'bat'));
答案 1 :(得分:0)
这是因为&&
和||
旨在比较布尔表达式。您实际要做的是:
console.log((pets.includes('cat') && pets.includes('monkey')) || pets.includes('bat'));
答案 2 :(得分:0)
要真正检查pets
是否包含其他两个值,您需要使用另一种方法,并使用Array#every
迭代该值,并使用Array#includes
检查回调中的单个值。
var pets = ['cat', 'dog', 'bat'];
console.log(['cat', 'monkey'].every(animal => pets.includes(animal))) // false
console.log(['cat', 'monkey'].every(animal => pets.includes(animal)) || 'bat'); // 'bat'