我需要一种方法来像这样简单地比较 3 个值:
'aaa'=='aaa'=='aaa'
false
但如您所见,它不起作用。为什么?
使用 2 个值,它确实明显有效:
'aaa'=='aaa'
true
比较前两个值的计算结果为true
,然后将该true
值与计算结果为false
的"aaa"
进行比较。
为了正确,您可以编写:
const a = 'aaa';
const b = 'aaa';
const c = 'aaa';
console.log(a === b && b === c); //true
如果你把这些字符串存储在变量中,你可以这样做
let a = 'aaa', b = 'aaa', c = 'aaa'
console.log(a === b && b === c) // true
表达式'aaa'=='aaa'=='aaa'
的计算结果为('aaa'=='aaa')=='aaa'
。
括号中的子表达式的计算结果为true
并且它变得true=='aaa'
,这是false
,因为当比较不同类型的两个值时,JavaScript 首先将其中一个或两个转换为通用类型。它将布尔true
转换为数字1
,将字符串'aaa'
转换为显然不相等的数字0
。
你需要的是
console.log('aaa'=='aaa' && 'aaa'=='aaa')
您可以将所有值放在一个 Array 中,然后使用Array.prototype.every()
函数来测试是否所有值都满足您传递给它的回调中定义的条件:
let a = 'aaa', b = 'aaa', c = 'aaa'
let arr = [a, b, c]
let arr2 = [1, 2, 1]
console.log(arr.every(i => [arr[0]].includes(i)))
console.log(arr2.every(i => [arr2[0]].includes(i)))
此外,您可能会从给定序列中获取唯一值,如果您获得单个元素是因为所有元素都相等:
const same = xs => new Set (xs).size === 1
const x = 'aaa'
const y = 'aaa'
const z = 'aaa'
const areSame = same ([ x, y, z ])
console.log(areSame)
const x_ = 'aaa'
const y_ = 'bbb'
const z_ = 'aaa'
const areSame_ = same ([ x_, y_, z_ ])
console.log (areSame_)
有可变参数
const same = (...xs) => new Set (xs).size === 1
const x = 'aaa'
const y = 'aaa'
const z = 'aaa'
const areSame = same (x, y, z)
console.log(areSame)
const x_ = 'aaa'
const y_ = 'bbb'
const z_ = 'aaa'
const areSame_ = same (x_, y_, z_)
console.log (areSame_)