除了函数声明和函数表达式,JavaScript 还有一种非常简洁的定义函数的语法。这类函数叫做_箭头函数_。
下面是函数声明和箭头函数的一个对比。
function addUpTwoNumbers(num1, num2) {
return num1 + num2;
}
// function keyword removed and => added
const addUpTwoNumbers = (num1, num2) => {
return num1 + num2;
};
如果函数体里只包含一条 return 语句,就像上面的例子那样,那么 {} 和 return 关键字都可以省略。
如果只有一个形参,括号 () 也可以省略。
const addUpTwoNumbers = (num1, num2) => num1 + num2;
const square = num => num * num;
箭头函数常常用来在函数调用中直接定义简短的回调函数。
applyToSquare(number => number * number);
数组内置了一些方法,可以用来分析数组的内容。
这些方法大多接受一个返回 true 或 false 的函数作为实参。
这样的函数称为 predicate。
这些内置方法的用途是_代替 for 循环_或内置的 forEach 方法:
使用 for 循环进行分析的例子:
const numbers = [1, 'two', 3, 'four'];
for (var i = 0; i < numbers.length; i++) {
if (numbers[i] === 'two') {
return i;
}
}
// => 1
使用内置方法进行分析的例子:
const numbers = [1, 'two', 3, 'four'];
numbers.indexOf('two');
// => 1
下面列出了其他一些可用于分析数组的内置方法。 完整的数组方法列表请见 MDN。
includesincludes(value) 方法判断数组中是否包含某个值。
包含该值时返回 true,否则返回 false。
const numbers = [1, 'two', 3, 'four'];
numbers.includes(1);
// => true
numbers.includes('one');
// => false
everyevery(predicate) 方法接受一个函数,这个函数就是_一个 predicate_。
它会检查数组中的每个元素传入该 predicate 后是否都返回 true。
换句话说,这个方法测试的是:数组中的所有元素都通过了函数调用所传入的测试。
当每个元素都通过 predicate 测试时返回 true,否则返回 false。
const numbers = [1, 3, 5, 7, 9];
numbers.every((num) => num % 2 !== 0);
// => true
somesome(predicate) 方法与 every 方法相同,但只要数组中至少有一个元素通过了 predicate 测试,就返回 true。
const numbers = [1, 3, 5, 7, 9];
numbers.some((num) => num % 2 !== 0);
// => true
findfind(predicate) 方法返回数组中第一个通过 predicate 测试的元素的值。
some() 在通过测试时返回 true,而 find() 返回数组中实际的那个值。
如果数组里没有任何元素通过 predicate 测试,该方法返回 undefined。
const numbers = [1, 3, 5, 7, 9];
numbers.find((num) => num < 5);
// => 1
findIndexfindIndex(predicate) 与 find() 方法相同,但它返回通过 predicate 测试的元素的(第一个)下标,而不是 value。
如果数组里没有任何元素通过 predicate 测试,该方法返回 -1。
const numbers = [1, 3, 5, 7, 9];
numbers.findIndex((num) => num > 7);
// => 4
numbers.findIndex((num) => num > 9);
// => -1
准魔术师 Elyse 继续她的训练。她会拿到好几叠牌,用来完成她的魔术。 为了让事情简单一些,她只用 1 到 10 这些牌。
在这个练习中,使用内置方法来分析数组的内容。
Elyse 想知道某张牌在牌堆中的位置(下标)。
const card = 2;
getCardPosition([9, 7, 3, 2], card);
// => 3
Elyse 想判断某张牌是否在牌堆中,换句话说,牌堆中是否包含某个特定的number。
const card = 3;
doesStackIncludeCard([2, 3, 4, 5], card);
// => true
Elyse 想知道是否每张牌都是偶数,换句话说,牌堆中的每个number是否都是偶数。
isEachCardEven([2, 4, 6, 7]);
// => false
Elyse 想知道牌堆中是否有奇数。
doesStackIncludeOddCard([3, 2, 6, 4, 8]);
// => true
Elyse 想知道第一张奇数牌的值。
getFirstOddCard([4, 2, 8, 7, 9]);
// => 7
Elyse 想知道第一张偶数牌的位置。
getFirstEvenCardPosition([5, 2, 3, 1]);
// => 1