了解 .every() 和 .some() 中不同行为的原因

understanding the reason for different behavior in .every()and .some()

我喜欢在 javascript 和 运行 中使用 .every() 和 .some() 来改变它们的行为,我没有在 MDN 上看到关于原因的解释。根据 MDN,如果您 运行 .every() 在一个空数组上,结果为真,因为在数学中空集的所有元素都将匹配一个条件。但是 .some() 将 return false 当 运行 在一个空数组上时。

const myArray = [];
const ev = myArray.every( elem => {
  elem === 'this is foobared';
});
const so = myArray.some( elem => {
  elem === 'this is foobared';
});

//  ev is true
//  so is false

我是个脑洞不大的熊,但似乎如果空集的每个元素都匹配条件,那么一些元素就匹配条件,因为如果所有元素都匹配,.some() 将是真的。

const myArray = [1, 2, 3, 4];
const ev = myArray.every( elem => {
  return elem < 10;
});
const so = myArray.some( elem => {
  return elem < 10;
});

// ev is true
// so is true

这背后有什么逻辑吗?

感谢任何解释。

这样做的原因是它允许这些操作的关联属性正常工作。

这个 属性 需要以下等价物:

array1.every(condition) && array2.every(condition) == array1.concat(array2).every(condition);

array1.some(condition) || array2.some(condition) == array1.concat(array2).some(condition);

用一个空数组替换array2,你会看到定义[].every(condition)true[].some(condition)false将确保在边界情况下实现等价。

这类似于 true&& 运算符的标识值和 false|| 运算符的标识的方式。

一些(任何)与每个(全部):基本差异

你可以轻松记住 every 是 [And &&] 和
some 是 [Or ||]
让我向您展示一些对象数组示例。

可以阅读What is the difference between every() and some() methods

// Example
let users = [ {id:1, type: 'student'},  {id: 2, type: 'student'} ];
let isEveryStudent = users.every(user => user.type === 'student');
console.log('isEveryStudent', isEveryStudent);
// ```isEveryStudent``` is true because All users are student

users = [ {id:1, type: 'student'},  {id: 2, type: 'officer'} ];
isEveryStudent = users.every(user => user.type === 'student');
console.log('isEveryStudent', isEveryStudent);
// ```isEveryStudent``` is false because one of the user is officer

users = [ {id:1, type: 'student'},  {id: 2, type: 'officer'} ];
const isSomeOfficer = users.some(user => user.type === 'officer');
console.log('isSomeOfficer', isSomeOfficer);
// ```isSomeOfficer``` is true because one of the user is officer