了解 .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
我喜欢在 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