В ES6 у нас есть новый оператор - оператор распространения, который может в определенной степени уменьшить объем нашего кода, а иногда даже иметь полезный эффект.Давайте возьмем несколько общих примеров, а заодно используем примеры для понимания использование оператора спреда.
1. Используйте в приложении
Когда наша функция имеет несколько переменных (особенно когда мы не знаем количество переменных), это иногда делается путем сохранения переменных в массиве и передачиcall
для выполнения функции лучше использовать оператор спреда (в конце концов, используяcall
нужно указывать вручнуюthis
, иногда это не очень удобно и аккуратно)
// 一般
function a(x, y, z) { }
var args = [0, 1, 2];
a.apply(null, args);
// 展开运算符
a(...args);
Кроме того, вы можете
// 需要传入不定数量的参数,同时最后一个参数为需要指定的值
function b() {
console.log(arguments.length);
console.log(arguments[arguments.length -1]);
}
var args = [0, 1, 2];
b(...args, -2)
В целом, существует новый способ выполнения вызовов функций с несколькими аргументами, позволяющий избежать проблем с областью действия.
2. Использование в массивах
объединение массивов
var a = [1, 2];
var b = [0, ...a, 3]
Разделить массив
var [a, ...b] = [0, 1, 2];
console.log(b) // [1, 2]
копия массива
var a = [1, 2];
var b = [...a];
3. Использование в объектах
Объект здесь относится к чему-то вроде{a:1}
Такие объекты из-за массивов, функции также являются типом объектов.
let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };
console.log(z) // {a: 3, b: 4}
Это также полезно в параметрах функции
function test(...args) {
console.log(args);
}
test('wang', '23', 'man');
кто-то может сказатьarguments
Это хорошо само по себе, ноarguments
Это не сам массив, поэтому его нельзя напрямуюarguments
Выполнять операции с массивами.
Вне класса в Node есть много функций обратного вызова, которые начинаются сerror
Собственно, для первого возвращаемого значения многие интерфейсы разработаны таким образом. Тогда мы можем легко отделитьerror
и другие параметры
request.get('./demo', (e, ...data) => {
console.log(e);
console.log(data);
})
Но сейчасES6
Оператор распространения еще не поддерживается в объектах, это все ещеES7
, но мы можем использоватьbabel
обрабатывать.
Напоследок напишите пример, на гитхабе есть библиотекаhttps://github.com/sindresorhus/pify
Функция, используемая для изменения обратного вызова наpromise
форма
const fs = require('fs');
const pify = function(fn) {
return function(...args) {
return new Promise((resolve) => {
fn(...args, (...res) => {
resolve(res);
})
})
}
};
// fs.readFile
pify(fs.readFile)('./package.json', 'utf8').then(([err, data]) => {
console.log(data);
})
// ajax
pify(request)('http://demo.api.com').then(([err, data]) => {
console.log(data)
})