- Оригинальный адрес:The Latest Features Added to JavaScript in ECMAScript 2020
- Оригинальный автор:Thomas Findlay
- Перевод с:Программа перевода самородков
- Постоянная ссылка на эту статью:GitHub.com/rare earth/gold-no…
- Переводчик:Gesj-yean
- Корректор:Chorer,CoolRice
Что нового в ECMAScript 2020
JavaScript — один из самых популярных языков программирования, и каждый год в него добавляются новые функции. В этой статье описываются новые функции, добавленные в ECMAScript 2020 (он же ES11).
До появления ECMAScript 2015 (он же ES6) JavaScript развивался очень медленно. Но с 2015 года каждый год добавляются новые функции. Обратите внимание, что не все функции поддерживаются современными браузерами, но благодаря компиляторам JavaScriptBabelсуществует, мы уже можем использовать новые функции. В этой статье будут представлены некоторые из последних функций ECMAScript 2020 (ES11).
Необязательная цепочка
Большинство разработчиков сталкивались с этой проблемой:
TypeError: Cannot read property ‘x’ of undefined
Эта ошибка означает, что мы обращаемся к свойству, которое не принадлежит объекту.
получить доступ к свойствам объекта
const flower = {
colors: {
red: true
}
}
console.log(flower.colors.red) // 正常运行
console.log(flower.species.lily) // 抛出错误:TypeError: Cannot read property 'lily' of undefined
В этом случае движок JavaScript выдаст такую ошибку. Но в некоторых случаях не имеет значения, существует ли значение, потому что мы знаем, что оно будет. Итак, дополнительная цепочка пригодится!
Мы можем использовать необязательный оператор цепочки, состоящий из вопросительного знака и точки, чтобы указать, что ошибка не должна возникать. Должен вернуться, если нет значенияundefined.
console.log(flower.species?.lily) // 输出 undefined
Необязательную цепочку также можно использовать при доступе к массивам или вызове функций.
массив доступа
let flowers = ['lily', 'daisy', 'rose']
console.log(flowers[1]) // 输出:daisy
flowers = null
console.log(flowers[1]) // 抛出错误:TypeError: Cannot read property '1' of null
console.log(flowers?.[1]) // 输出:undefined
Функции вызова
let plantFlowers = () => {
return 'orchids'
}
console.log(plantFlowers()) // 输出:orchids
plantFlowers = null
console.log(plantFlowers()) // 抛出错误:TypeError: plantFlowers is not a function
console.log(plantFlowers?.()) // 输出:undefined
Нулевое слияние
В настоящее время, чтобы предоставить резервное значение для переменной, логический оператор||
Все еще обязательно. Он подходит для многих ситуаций, но не может применяться в некоторых особых сценариях. Например, случай, когда начальное значение является логическим или числовым. Например, мы хотим присвоить переменной число.Когда начальное значение переменной не является числом, оно по умолчанию равно 7:
let number = 1
let myNumber = number || 7
ПеременнаяmyNumberравно 1, так как левая (number)Являетсянастоящийзначение 1. Однако, когда переменнаяnumberА если не 1, а 0?
let number = 0
let myNumber = number || 7
0 этоПодделказначение, так что даже 0 является числом. ПеременнаяmyNumberбудет присвоено значение 7 справа. Но результат не тот, что мы хотим. К счастью, оно состоит из двух вопросительных знаков:??
Оператор слияния может проверять переменнуюnumberЭто число без написания дополнительного кода.
let number = 0
let myNumber = number ?? 7
Значение в правой части оператора равно только значению в левой частиnullилиundefinedдопустимо, поэтому переменная в примереmyNumberТеперь значение равно 0.
Частные поля Частные поля
многие имеютclassesЯзык программирования позволяет определять классы как общедоступные, защищенные или частные свойства.PublicДоступ к свойствам можно получить извне класса или из подклассов,protectedСвойства могут быть доступны только подклассам,privateДоступ к свойствам возможен только из класса. JavaScript изES6Синтаксис класса начал поддерживаться, но приватные поля не были введены до сих пор. Чтобы определить частное свойство, ему должен предшествовать знак решетки:#
.
class Flower {
#leaf_color = "green";
constructor(name) {
this.name = name;
}
get_color() {
return this.#leaf_color;
}
}
const orchid = new Flower("orchid");
console.log(orchid.get_color()); // 输出:green
console.log(orchid.#leaf_color) // 报错:SyntaxError: Private field '#leaf_color' must be declared in an enclosing class
Если мы получим доступ к закрытым свойствам класса извне, он обязательно сообщит об ошибке.
Статические поля Статические поля
Если вы хотите использовать методы класса, вы должны сначала создать экземпляр класса следующим образом:
class Flower {
add_leaves() {
console.log("Adding leaves");
}
}
const rose = new Flower();
rose.add_leaves();
Flower.add_leaves() // 抛出错误:TypeError: Flower.add_leaves is not a function
Попытка доступа к неустановленномуFlowerМетод класса выдаст ошибку. Но из-заstaticполя, методы класса могут бытьstaticЗатем объявление ключевого слова вызывается извне.
class Flower {
constructor(type) {
this.type = type;
}
static create_flower(type) {
return new Flower(type);
}
}
const rose = Flower.create_flower("rose"); // 正常运行
Верхний уровень Ожидание Верхний уровень Ожидание
В настоящее время, если вы используетеawaitЧтобы получить результат функции обещания, используйтеawaitфункция должна использоватьasyncОпределения ключевых слов.
const func = async () => {
const response = await fetch(url)
}
Головная боль в том, что дождаться какого-то результата в глобальном масштабе в принципе невозможно. если не использоватьВыражение немедленно вызываемой функции (IIFE).
(async () => {
const response = await fetch(url)
})()
но представилТоп ОжидайтеПосле этого нет необходимости оборачивать код в асинхронную функцию, как показано ниже:
const response = await fetch(url)
Эта функция полезна для разрешения зависимостей модуля или когда требуется альтернативный источник, когда исходный источник недоступен.
let Vue
try {
Vue = await import('url_1_to_vue')
} catch {
Vue = await import('url_2_to_vue)
}
Метод Promise.allSettled
При ожидании нескольких промисов для возврата результатов мы можем использоватьPromise.all([promise_1, promise_2]). Но проблема в том, что если один из запросов не проходит, выдается ошибка. Однако иногда мы хотим, чтобы результаты других запросов возвращались нормально после сбоя запроса. Ввиду этой ситуацииES11представилPromise.allSettled.
promise_1 = Promise.resolve('hello')
promise_2 = new Promise((resolve, reject) => setTimeout(reject, 200, 'problem'))
Promise.allSettled([promise_1, promise_2])
.then(([promise_1_result, promise_2_result]) => {
console.log(promise_1_result) // 输出:{status: 'fulfilled', value: 'hello'}
console.log(promise_2_result) // 输出:{status: 'rejected', reason: 'problem'}
})
Успешное обещание вернет обещание, содержащееstatusа такжеvalue, невыполненное обещание вернет объект, содержащийstatusа такжеreasonОбъект.
Динамический импорт
ты можешь бытьwebpackДинамический импорт уже используется в привязках модулей . Но появилась встроенная поддержка этой функции:
// Alert.js
export default {
show() {
// 代码
}
}
// 使用 Alert.js 的文件
import('/components/Alert.js')
.then(Alert => {
Alert.show()
})
Учитывая, что многие приложения используют сборщики модулей, такие как webpack, для транспиляции и оптимизации кода, эта функция сейчас не очень полезна.
Mathall соответствует всем предметам
Если вы хотите найти все строки, соответствуют регулярному выражению и их местам, Chaptall очень полезно.
const regex = /\b(apple)+\b/;
const fruits = "pear, apple, banana, apple, orange, apple";
for (const match of fruits.match(regex)) {
console.log(match);
}
// 输出
//
// 'apple'
// 'apple'
Напротив,matchAllВозвращает дополнительную информацию, включая индекс, по которому было найдено совпадение.
for (const match of fruits.matchAll(regex)) {
console.log(match);
}
// 输出
//
// [
// 'apple',
// 'apple',
// index: 6,
// input: 'pear, apple, banana, apple, orange, apple',
// groups: undefined
// ],
// [
// 'apple',
// 'apple',
// index: 21,
// input: 'pear, apple, banana, apple, orange, apple',
// groups: undefined
// ],
// [
// 'apple',
// 'apple',
// index: 36,
// input: 'pear, apple, banana, apple, orange, apple',
// groups: undefined
// ]
globalЭтот глобальный объект
JavaScript может работать в разных средах, таких как браузеры или Node.js. Глобальные объекты, доступные в браузере, являются переменными.window, но в Node.js есть функция с именемglobalОбъект. Для того, чтобы использовать единый глобальный объект в разных средах, введеныglobalThis.
// 浏览器
window == globalThis // true
// node.js
global == globalThis // true
BigInt
Наибольшее число, которое можно точно выразить в JavaScript, равно 2^53 - 1. А BigInt можно использовать для создания больших чисел.
const theBiggerNumber = 9007199254740991n
const evenBiggerNumber = BigInt(9007199254740991)
В заключение
Я надеюсь, что эта статья была вам полезна, и я с нетерпением жду новых возможностей JavaScript так же, как и я. Если вы хотите узнать больше, вы можете увидеть комитет tc39Официальный репозиторий Github.
Если вы обнаружите ошибки в переводе или в других областях, требующих доработки, добро пожаловать наПрограмма перевода самородковВы также можете получить соответствующие бонусные баллы за доработку перевода и PR. начало статьиПостоянная ссылка на эту статьюЭто ссылка MarkDown этой статьи на GitHub.
Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из ИнтернетаНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,товар,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,