Оператор спреда ES6 (оператор спреда)

Node.js внешний интерфейс GitHub

Оригинальная ссылка

В 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)
})