Как использовать совместимость babel es6 для компиляции нашего кода js (es6)
совместимость | |
---|---|
стрелочная функция | служба поддержки |
Объявление класса и наследование | Частично поддерживается, IE8 не поддерживается |
Усовершенствованные литералы объектов | служба поддержки |
шаблон строки | служба поддержки |
разрушать | Да, но обратите внимание на то, как вы его используете |
значение параметра по умолчанию, неопределенный параметр, расширенный параметр | служба поддержки |
пусть и const | служба поддержки |
for of | ИЕ не поддерживает |
iterator, generator | не поддерживается |
Модуль модуля, Прокси, Символ | не поддерживается |
Карта, набор и WeakMap, WeakSet | не поддерживается |
Новые API для Promises, Math, Number, String, Object | не поддерживается |
export & import | служба поддержки |
генераторная функция | не поддерживается |
Массивная копия | служба поддержки |
Итак, давайте поговорим о том, как использовать этот babel для совместимости с нашим кодом es6 (конечно, предпосылка в том, что файл babeljs уже существует в проекте, вот как позволить babel скомпилировать наш файл js или jsx в webpack)
Предыдущий небольшой код:
module: {
loaders: [
//
{
test: /\.(jsx|js)$/,
loader: ['babel-loader'],
exclude: /node_modules/
}
]
}
1.var let const
На самом деле хорошо известно, что let на самом деле определяет переменную с собственным блоком кода.Так называемый блок кода на самом деле используется, когда вы используете let в {} для определения переменной, пусть существует только в {}, но это работает с функциями js Разница между доменами заключается в том, что переменные, определенные с помощью let, не поднимаются.
var a = 1;
function fn1(){
console.log(a);
a = 2;
}
console.log(a);//1
fn1(); // 2
var b = 2;
function fn2(){
console.log(b);
let b = 1;
}
console.log(b)//2
fn2(); //
Из этого примера мы видим, что значения переменных a и b печатаются отдельно.Значение, измененное с помощью let, теряет свое действие после функции {}, а не присваивание с помощью let, которое по-прежнему действует после {}.
Чтобы дать еще один полезный сценарий приложения, мы неизбежно будем использовать замыкания, когда у нас есть какие-то особые потребности. Если вы не понимаете замыкания, перейдите к междоменным замыканиям. Например, общая проблема плохой улицы, li печать в ul его указатель или содержание. В es5 делаем так:
var arr = [];
for(var i=0; i<5; i++){
arr.push((function (a){
return function (){
console.log(a);
}
})(i))
}
arr[1]() // 1
arr[2]() // 2
arr[3]() // 3
Недостаток замыкания в том, что оно будет занимать память, а не отпускать ее, поэтому напишем по-другому:
var arr = []; // let arr = [] 都可以
for(let i=0; i<5; i++){
arr.push(function (){
console.log(i)
})
}
arr[0]() // 0
arr[1]() // 1
arr[2]() // 2
Использование позволит идеальному решению этой проблемы.
Кроме того, const легко понять. Это способ объявления константы. Нетрудно понять концепцию наличия основы других языков. Опять же, я не буду повторяться.
2. Разрушающее назначение
let [a, b, c] = [1, 2, 3];
//等同于
let a = 1;
let b = 2;
let c = 3;
var {
StyleSheet,
Text,
View
} = React;
等同于
var StyleSheet = React.StyleSheet;
var Text = React.Text;
var View = React.View;
3. Стрелочные функции
Новый оператор стрелки в ES6 используется для упрощения написания функций.Левая часть оператора — это параметр, а правая — конкретная операция и возвращаемое значение.
var sum = (num1, num2) => { return num1 + num2; }
//等同于
var sum = function(num1, num2) {
return num1 + num2;
};
В то же время стрелочная функция также фиксирует указание this, чтобы оно всегда указывало на лексическую область видимости:
var obj = {
birth: 1990,
getAge: function () {
var b = this.birth; // 1990
var fn = () => new Date().getFullYear() - this.birth; // this指向obj对象
return fn();
}
};
obj.getAge(); // 25
4. Класс класс
ES6 предоставляет метод написания, который ближе к традиционным языкам, и вводит концепцию класса (класс) в качестве шаблона для объектов. С ключевым словом класса классы могут быть определены, похоже на большинство традиционных языков.
// определяем класс
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
toString() {
return '(' + this.x + ', ' + this.y + ')';
}
}
В том же наследовании используется ключевое слово extends
5. Струны
Добавлены функции обработки строк:
startsWith() //检查是否以指定字符串开头,返回布尔值
let str = 'javascript';
str.startsWith('java');
endsWith() //检查是否以指定字符串结尾,返回布尔值
let str = 'javascript'
str.endsWith('pt');
includes() //检查字符串是否包含指定字符串 ,返回布尔值
let str = 'javascript';
str.includes('j');
repeat() //指定字符串重复次数
let str = 'javascript';
str.repeat('3');
Литералы шаблона Строковый шаблон
Используя строковые литералы шаблонов, я могу использовать специальные символы непосредственно в строке без экранирования.
var text = "This string contains \"double quotes\" which are escaped.";
let text = `This string contains "double quotes" which don't need to be escaped anymore.`;
Строковые литералы шаблонов также поддерживают прямую вставку переменных, что может реализовать прямое соединение со строками и переменными.
var name = 'Tiger';
var age = 13;
console.log('My cat is named ' + name + ' and is ' + age + ' years old.');
更简单的版本:
const name = 'Tiger';
const age = 13;
console.log(`My cat is named ${name} and is ${age} years old.`);
В ES5 мы хотим генерировать многострочный текст следующим образом:
var text = (
'cat\n' +
'dog\n' +
'nickelodeon'
);
或者:
var text = [
'cat',
'dog',
'nickelodeon'
].join('\n');
Строковые литералы шаблонов Не будем обращать особого внимания на символы новой строки в многострочных строках, мы можем просто обернуть:
let text = ( `cat
dog
nickelodeon`
);
Строковые литералы шаблонов могут использовать внутри себя выражения, например:
let today = new Date();
let text = `The time and date is ${today.toLocaleString()};
6. Символ седьмого базового типа
Символы сильно отличаются от других основных типов.
Неизменный с момента создания. Вы не можете установить для него свойства (если вы попробуете в строгом режиме, вы получите ошибку типа). Его можно использовать как имя свойства. Это его струнная природа.
С другой стороны, каждый символ уникален. В отличие от других (даже если их описание такое же), вы можете легко создать новый. В этом его предметная природа.
Символы ES6 похожи на более традиционные символы в Lisp и Ruby, но не так тесно интегрированы в язык. В Лиспе все идентификаторы являются символами. В JS идентификаторы и большинство ключей свойств по-прежнему в первую очередь являются строками, а символы — просто дополнительным вариантом для разработчиков.
Предупреждение о символах: в отличие от других типов в JS, он не может быть автоматически преобразован в строку. Попытка объединить символы и строки приведет к ошибке типа.
(Указывает на то, что после прочтения документа вы все еще находитесь в круге и сначала решили отказаться от этой точки)
7.Promise
Объект обещания можно понимать как операцию, которую нужно выполнить (часто используемую для асинхронной операции), и можно организовать с помощью цепного вызова после использования объекта обещания, чтобы код был более интуитивным. А поскольку promise.all существует, он может упростить одновременную реализацию нескольких операций. Давайте кратко представим объект обещания.
Более интуитивно понятен непосредственно в коде:
function helloWorld (ready) {
return new Promise(function (resolve, reject) {
if (ready) {
resolve("Hello World!");
} else {
reject("Good bye!");
}
});
}
helloWorld(true).then(function (message) {
alert(message);
}, function (error) {
alert(error);
});
Метод reject изменяет состояние объекта Promise на сбой и передает сообщение об ошибке последующим операциям обработки ошибок.
Три состояния обещаний
Как упоминалось выше, разрешение и отклонение могут изменить состояние объекта обещания, так что у него есть государство?
Объекты промисов имеют три состояния:
- Выполнено можно понимать как успешное состояние
- Отклонено может быть понято как неудачное состояние
- Ожидание не является ни выполненным, ни отклоненным, его можно понимать как начальное состояние экземпляра объекта Promise при его создании.
Метод then в примере helloWorld определяет операцию, которую нужно выполнить, в соответствии с состоянием объекта Promise: первая функция (onFulfilled) выполняется при его разрешении, а вторая функция (onRejected) — при его отклонении.
тогда и лови
then
В примере helloWorld используется метод then(onFulfilld, onRejected) для выполнения задачи по печати «Hello World!», в случае нескольких задач метод then также можно выполнить чистым способом.function printHello (ready) { return new Promise(function (resolve, reject) { if (ready) { resolve("Hello"); } else { reject("Good bye!"); } }); }
В приведенном выше примере соответствующий контент выводится последовательно с помощью связанных вызовов. Причина, по которой затем может быть цепочка, заключается в том, что каждое выполнение метода всегда возвращает объект Promise. Кроме того, возвращаемое значение в функции then onFulfilled можно использовать в качестве параметра для последующих операций, поэтому приведенный выше пример также можно записать так:
printHello(true).then(function (message) {
return message;
}).then(function (message) {
return message + ' World';
}).then(function (message) {
return message + '!';
}).then(function (message) {
alert(message);
});
function printWorld () {
alert("World");
}
function printExclamation () {
alert("!");
}
printHello(true)
.then(function(message){
alert(message);
})
.then(printWorld)
.then(printExclamation);
Также печатает правильный контент.
catch
Метод catch — это простой способ записи функции onRejected в методе then(onFulfilled, onRejected), то есть его можно записать как then(fn).catch(fn), что эквивалентно then(fn) .тог(нуль, fn). Метод записи с использованием catch более понятен и ясен, чем обычный метод записи.
Promise.all и Promise.race
Promise.all может получать массив объектов Promise в качестве параметра, и метод будет возвращаться только тогда, когда все объекты Promise в массиве будут разрешены.
var p1 = new Promise(function (resolve) {
setTimeout(function () {
resolve("Hello");
}, 3000);
});
var p2 = new Promise(function (resolve) {
setTimeout(function () {
resolve("World");
}, 1000);
});
Promise.all([p1, p2]).then(function (result) {
console.log(result); // ["Hello", "World"]
});
В приведенном выше примере имитируется, что для передачи двух частей данных требуется разное время.Хотя p2 быстрее, чем p1, метод Promise.all вернет результаты в том порядке, в котором они находятся в массиве.
совместимость
Что касается браузера, некоторые основные браузеры уже могут использовать объекты Promise для разработки, и его также можно легко использовать в Node.js с babel.
Если вы хотите быть совместимым со старыми браузерами, рекомендуется искать некоторые сторонние решения, такие как $.Deferred от jQuery.