автор:JowayYoung
склад:Github,CodePen
Блог:Официальный сайт,Наггетс,думаю нет,Знай почти
Нет публики:Интерфейс IQ
Специальное заявление: Нелегко быть оригинальным, и перепечатка или плагиат не допускаются без разрешения.Если вам нужно перепечатать, вы можете связаться с автором для получения разрешения.
предисловие
Читаю книгу Учителя Жуань Ифэн в третий раз«Введение в стандарты ES6»Так вот, я не был внимателен, когда читал это раньше, и во многих местах сразу видно десять строк. Недавно прочитал его слово в слово, и нашел много моментов знаний, которых раньше не замечал.В целях облегчения памяти и предпросмотра全部ES6特性
, так напишите эту статью.
以下提到的《ES6标准入门》统一使用《ES6》这个名称来代替,而最新的ES6版本也是截止到当前的ES2020
Знания этой статьи полностью являются ссылками или выдержками."ЭС6"Некоторые предложения в тексте экранированы с одинаковым значением, чтобы облегчить понимание и запоминание, и в то же время точки знаний классифицированы и разделены. Для того, чтобы каждый мог сконцентрироваться на запоминании этих особенностей, в полном тексте нет глупостей и отступлений.Все модули написаны в виде примечаний.Если вы не очень привыкли читать, то рекомендуется сравнить"ЭС6"содержание, чтобы учиться.
Заметки, собранные в этой статье, составляют суть книги, охватывающую всюES6体系
Все возможности , очень удобно всем заново разбираться全部ES6特性
. полчаса чтенияES6
Есть всеобъемлющее понимание, мышление есть копияES6特性小字典
, вы можете обратиться к нему в любое время после сбора. Даже если вы не можете дочитать до конца, дочитайте эту статью до конца, там есть большое пасхальное яйцо, хи-хи!
исправить
ES6даECMA
дляJavaScript
Сформулирована 6-я стандартная версия, соответствующую историю можно просмотреть в этой главе.Введение в ES6-ECMAScript6.
В конце концов комитет по стандартам решил, что стандарт будет официально выпускаться в июне каждого года как официальная версия года и будет изменяться на основе этой версии в последующее время, до тех пор, пока проект в июне следующего года, естественно, не будет стать новогодней версией. , поэтому нет необходимости в номере предыдущей версии, достаточно отметки года.ECMAscript 2015
в2015年6月
Выпустите первую версию ES6. И так далее,ECMAscript 2016
это вторая версия ES6,ECMAscript 2017
это третья версия ES6.ES6Это и историческое существительное, и общая ссылка, означающая5.1版本
послеJavaScript下一代标准
, который в настоящее время охватываетES2015
,ES2016
,ES2017
,ES2018
,ES2019
,ES2020
.
Итак, некоторые статьи, упомянутыеES7
(по сутиES2016
),ES8
(по сутиES2017
),ES9
(по сутиES2018
),ES10
(по сутиES2019
),ES11
(по сутиES2020
), которые по сути являются нестандартными понятиями. От ES1 до ES6 на формулировку каждого стандарта ушло несколько лет или даже более десяти лет.Там понадобился всего один год, чтобы перейти от ES6 к ES7, а от ES7 к ES8.Согласно этому определению, ES20 будет не скоро . . . В правильных концепциях ES6 в настоящее время охватываетES2015,ES2016,ES2017,ES2018,ES2019,ES2020.
Кроме того, содержание обновления ES6 в основном разделено на следующие пункты.
- выражение: объявление, присваивание деструктурирования
- встроенные объекты: Расширение строки, числовое расширение, расширение объекта, расширение массива, расширение функции, обычное расширение, символ, набор, карта, прокси, отражение
- Заявления и операции: класс, модуль, итератор
- Асинхронное программирование: обещание, генератор, асинхронный
ES2015
утверждение
- константная команда: объявить константы
- пусть команда: объявить переменную
эффект
- объем
- глобальная область
-
объем функции:
function() {}
-
область действия блока:
{}
- Объем
-
var命令
В глобальном выполнении кода -
const命令
а такжеlet命令
Может выполняться только в блоках кода
-
- назначение использования
-
const命令
Константе должно быть присвоено значение сразу после ее объявления -
let命令
Переменной можно присвоить значение сразу после ее объявления или при ее использовании.
-
- Способ объявления:
var
,const
,let
,function
,class
,import
основная трудность
- Дублирование деклараций не допускается.
- Если он не определен, он сообщит об ошибке:
const命令
а такжеlet命令
Нет переменного продвижения - Временная мертвая зона: используется в кодовых блоках.
const命令
а такжеlet命令
Переменная недоступна, пока переменная не объявлена
присваивание деструктуризации
-
Деструктуризация строки:
const [a, b, c, d, e] = "hello"
-
Численная деконструкция:
const { toString: s } = 123
-
Булева деструктуризация:
const { toString: b } = true
-
деструктуризация объекта
- форма:
const { x, y } = { x: 1, y: 2 }
- По умолчанию:
const { x, y = 2 } = { x: 1 }
- Переименовать:
const { x, y: z } = { x: 1, y: 2 }
- форма:
-
деструктуризация массива
- Правило: структуры данных имеют
Iterator接口
Деструктурирующее присваивание, которое может принимать массив - форма:
const [x, y] = [1, 2]
- По умолчанию:
const [x, y = 2] = [1]
- Правило: структуры данных имеют
-
деструктуризация параметра функции
- Деструктуризация массива:
function Func([x = 0, y = 1]) {}
- Деструктуризация объекта:
function Func({ x = 0, y = 1 } = {}) {}
- Деструктуризация массива:
Сценарии применения
- Поменять местами значения переменных:
[x, y] = [y, x]
- Функция возврата с несколькими значениями:
const [x, y, z] = Func()
- Определите параметры функции:
Func([1, 2])
- Извлеките данные JSON:
const { name, version } = packageJson
- Определите значения параметров функции по умолчанию:
function Func({ x = 1, y = 2 } = {}) {}
- Пройдите структуру карты:
for (let [k, v] of Map) {}
- Модули ввода определяют свойства и методы:
const { readFile, writeFile } = require("fs")
основная трудность
- Сопоставление шаблонов: если шаблоны по обе стороны от знака равенства одинаковы, переменной слева будет присвоено соответствующее значение.
- Правило присваивания деструктуризации: если значение справа от знака равенства не является объектом или массивом, сначала преобразуйте его в объект
- Деконструкция значений по умолчанию для выполнения условия: значение свойства ограничено
undefined
- Деконструкция следует за режимом сопоставления
- Значение переменной при неудачной деструктуризации равно
undefined
-
undefined
а такжеnull
Не может быть обращено к объекту, поэтому не может быть уничтожено
расширение строки
-
Обозначение Юникода:
大括号包含
Представляет символы Юникода (\u{0xXX}
или\u{0XXX}
) -
обход строки:доступный
for-of
перебирать строку - шаблон строки: Расширенная строка, которая может быть однострочной, многострочной и вставляемой переменной.
- Шаблон этикетки: специальный вызов аргументов функции
- String.raw(): возвращает результат замены всех переменных строки и экранирования косых черт.
- String.fromCodePoint(): символ, соответствующий кодовой точке возврата
-
codePointAt(): возвращает кодовую точку, соответствующую символу (
String.fromCodePoint()
обратная операция) -
normalize(): объединить различные методы представления символов в одну и ту же форму, вернуть
新字符串
(нормализация Юникода) -
repeat(): повторить строку n раз, вернуться
新字符串
- matchAll(): возвращает все совпадения регулярного выражения в строке
- includes(): существует ли указанная строка
- startsWith(): есть ли указанная строка в заголовке строки
- endsWith(): есть ли указанная строка в конце строки
основная трудность
- Вышеупомянутые методы расширения могут использоваться
4个字节储存
изUnicode字符
начальство
Числовое расширение
-
двоичная запись:
0b或0B开头
представляет собой двоичный (0bXX
или0BXX
) -
восьмеричная запись:
0o或0O开头
представляет собой двоичный (0oXX
или0OXX
) - Number.EPSILON: числовая минимальная точность
-
Number.MIN_SAFE_INTEGER: минимальное безопасное значение (
-2^53
) -
Number.MAX_SAFE_INTEGER: максимальное безопасное значение (
2^53
) - Number.parseInt(): возвращает целую часть преобразованного значения.
- Number.parseFloat(): возвращает часть преобразованного значения с плавающей запятой.
- Number.isFinite(): Это конечное значение
- Number.isNaN(): Это NaN
- Number.isInteger(): является ли это целым числом
- Number.isSafeInteger(): Находится ли он в числовом безопасном диапазоне?
- Math.trunc(): возвращает целую часть значения
-
Math.sign(): возвращает числовой тип (
正数1
,负数-1
,零0
) - Math.cbrt(): возвращает кубический корень числового значения
- Math.clz32(): возвращает 32-битную целочисленную форму значения без знака.
- Math.imul(): возвращает произведение двух чисел.
- Math.fround(): возвращает 32-битную форму значения с плавающей запятой одинарной точности.
- Math.hypot(): возвращает квадратный корень из суммы квадратов всех чисел.
-
Math.expm1():вернуть
e^n - 1
-
Math.log1p():вернуть
1 + n
Натуральный логарифм (Math.log(1 + n)
) - Math.log10(): возвращает логарифм числа n по основанию 10.
- Math.log2(): возвращает логарифм числа n по основанию 2.
- Math.sinh(): возвращает гиперболический синус числа n
- Math.cosh(): возвращает гиперболический косинус n
- Math.tanh(): возвращает гиперболический тангенс n
- Math.asinh(): возвращает аркгиперболический синус числа n
- Math.acosh(): возвращает аркгиперболический косинус числа n
- Math.atanh(): возвращает гиперболический арктангенс числа n.
расширение объекта
-
краткое обозначение: напрямую писать переменные и функции как свойства и методы объектов (
{ prop, method() {} }
) -
выражение имени свойства: используется при определении литерала объекта
[]
определить ключ ([prop]
, нельзя использовать одновременно с указанным выше) -
атрибут имени метода: Вернуться к функции метода
- Функция значения (геттер) и функция значения (сеттер):
get/set 函数名
(Объект описания свойства находится вget
а такжеset
начальство) - Функция, возвращаемая привязкой:
bound 函数名
- Экземпляр функции, возвращаемый конструктором Function:
anonymous
- Функция значения (геттер) и функция значения (сеттер):
-
Перечисление свойств и обход: описание объекта
enumerable
-
супер ключевое слово: указывает на объект-прототип текущего объекта (может использоваться только в сокращенном методе объекта
method() {}
) - Object.is(): Сравните, равны ли два значения
- Object.assign(): объединить объекты (поверхностное копирование), вернуть исходный объект
- Object.getPrototypeOf(): возвращает объект-прототип объекта.
- Object.setPrototypeOf(): установить прототип объекта объекта
- __proto__: возвращает или задает объект-прототип объекта.
обход свойств
- описывать:
自身
,可继承
,可枚举
,非枚举
,Symbol
- траверс
-
for-in
: перебирать объекты自身可继承可枚举
Атрибуты -
Object.keys()
: возвращаемый объект自身可枚举
Массив ключей свойств -
Object.getOwnPropertyNames()
: возвращаемый объект自身非Symbol
Массив ключей свойств -
Object.getOwnPropertySymbols()
: возвращаемый объект自身Symbol
Массив ключей свойств -
Reflect.ownKeys()
: возвращаемый объект自身全部
Массив ключей свойств
-
- правило
- Сначала переберите все числовые ключи и отсортируйте их в порядке возрастания.
- Затем перебираем все строковые ключи и сортируем их в порядке возрастания по времени соединения.
- Наконец, пройдитесь по всем символьным клавишам и отсортируйте их в порядке возрастания по времени присоединения.
расширение массива
-
оператор спреда(...): преобразует массив в последовательность аргументов, разделенных запятыми (
[...arr]
, эквивалентноrest/spread参数
обратная операция) -
Array.from(): преобразование имеет
Iterator接口
Структура данных представляет собой реальный массив, возвращающий новый массив- Массивоподобные объекты:
包含length的对象
,Arguments对象
,NodeList对象
- Проходимые объекты:
String
,Set结构
,Map结构
,Generator函数
- Массивоподобные объекты:
- Array.of(): Преобразует набор значений в истинный массив, возвращая новый массив
- copyWithin(): скопировать элементы из указанного расположения в другое место, вернуть исходный массив
- find(): возвращает первого подходящего члена
- findIndex(): возвращает значение индекса первого квалифицированного члена.
- fill(): заполнить весь массив в соответствии с указанным значением и вернуть исходный массив
- keys(): возвращает объект, индекс которого является итератором
- values(): возвращает объект, значением свойства которого является итератор.
- entries(): возвращает объект со значением индекса и значением свойства в качестве итератора.
-
пространство массива: ES6 явно преобразует пустые места массива в
undefined
(Правила обращения с вакансиями различаются, рекомендуется их избегать)
Расширенное приложение
- Клонируйте массив:
const arr = [...arr1]
- Объединить массивы:
const arr = [...arr1, ...arr2]
- Объединить массивы:
arr.push(...arr1)
- Вместо применения:
Math.max.apply(null, [x, y])
=>Math.max(...[x, y])
- Преобразование строки в массив:
[..."hello"]
- Преобразуйте массивоподобный объект в массив:
[...Arguments, ...NodeList]
- Преобразуйте итерируемый объект в массив:
[...String, ...Set, ...Map, ...Generator]
- В сочетании с назначением деструктуризации массива:
const [x, ...rest/spread] = [1, 2, 3]
- Рассчитать длину символа Unicode:
Array.from("hello").length
=>[..."hello"].length
основная трудность
- использовать
keys()
,values()
,entries()
Возвращаемый объект итератора, доступныйfor-of
автоматически проходить илиnext()
Ручной обход
расширение функции
-
значение параметра по умолчанию: Укажите значения по умолчанию для параметров функции
- форма:
function Func(x = 1, y = 2) {}
- Назначение параметра: ленивая оценка (оценивается после вызова функции)
- Позиция аргумента: хвостовой аргумент
- Объем параметра: объем функции
- Метод объявления: объявление по умолчанию, использовать нельзя
const
илиlet
объявить снова - длина: возвращает количество параметров без указанного значения по умолчанию
- В сочетании с деструктурирующим назначением по умолчанию:
function Func({ x = 1, y = 2 } = {}) {}
- заявление
- Указание параметра не должно быть опущено, иначе будет выброшена ошибка:
function Func(x = throwMissing()) {}
- Установите значение параметра по умолчанию на
undefined
, что указывает на то, что этот параметр можно опустить:Func(undefined, 1)
- Указание параметра не должно быть опущено, иначе будет выброшена ошибка:
- форма:
-
Параметры отдыха / распространения (...): возвращает дополнительные параметры функции
- Форма: существует в виде массива, после которого не может быть других параметров
- Функция: заменить
Arguments对象
- длина: возвращает количество параметров без указанного значения по умолчанию, но не включая
rest/spread参数
-
строгий режим: запускать JS в строгих условиях
- Приложение: Пока параметры функции используют значения по умолчанию, деструктурирующие присваивания и операторы расширения, функция не может быть явно установлена в строгий режим.
-
атрибут имени: возвращает имя функции функции
- Назначьте анонимную функцию переменной:
空字符串
(ES5),变量名
(ES6) - Назначьте именованную функцию переменной:
函数名
(ЭС5 и ЭС6) - Функция, возвращаемая привязкой:
bound 函数名
(ЭС5 и ЭС6) - Экземпляр функции, возвращаемый конструктором Function:
anonymous
(ЭС5 и ЭС6)
- Назначьте анонимную функцию переменной:
-
Функция стрелки (=>): сокращение функции
- Нет параметров:
() => {}
- Один параметр:
x => {}
- Ряд параметров:
(x, y) => {}
- Параметры деструктуризации:
({x, y}) => {}
- Вложенное использование: механизм конвейера развертывания
- это указывает на иммобилизацию
- не из-за внутренней привязки
this
механизм, но совсем не свойthis
, в результате чего внутреннееthis
Внешний код кодthis
- потому что без
this
, поэтому не может использоваться в качестве конструктора
- не из-за внутренней привязки
- Нет параметров:
-
оптимизация хвостового вызова: сохранить только кадр вызова внутренней функции
- хвостовой вызов
- Определение: последним шагом функции является вызов другой функции.
- форма:
function f(x) { return g(x); }
- хвостовая рекурсия
- Определение: Хвост функции вызывает сам себя
- Функция: пока используется хвостовая рекурсия, переполнения стека не произойдет, что относительно экономит память.
- Реализация: переписать все используемые внутренние переменные в параметры функции и использовать значения параметров по умолчанию.
- хвостовой вызов
Ошибки функции стрелки
- внутри функции
this
да定义时所在的对象
вместо使用时所在的对象
- допустимый
this
Указывая на иммобилизацию, эта функция очень полезна для инкапсуляции функций обратного вызова. - не рассматривать как
构造函数
, поэтому функции стрелок использовать нельзяnew命令
- недоступен
yield命令
, поэтому стрелочные функции нельзя использовать в качествеGenerator函数
- недоступен
Arguments对象
, этот объект не существует в теле функции (доступноrest/spread参数
заменять) - При возврате объекта вы должны заключать объект в круглые скобки.
Регулярное расширение
-
Изменить входные параметры конструктора RegExp: разрешить первому параметру быть
正则对象
, параметр хвоста正则修饰符
(Возвращенное регулярное выражение игнорирует модификаторы исходного регулярного выражения) -
Регулярные изменения вызовов методов: Строковый объект
match()
,replace()
,search()
,split()
Внутренний звонок на звонокRegExp
соответствующий экземпляруRegExp.prototype[Symbol.方法]
-
у модификатор: модификатор режима Unicode, правильно обрабатывает больше, чем
\uFFFF
изUnicode字符
-
点字符
(.) Unicode表示法
量词
预定义模式
i修饰符
转义
-
-
у модификатор: модификатор клея, обеспечение того, чтобы совпадения должны начать глобально на первой оставшейся позиции (с
g修饰符
Агрегация похожа) -
unicode: установить ли
u修饰符
-
sticky: установить ли
y修饰符
- flags: возвращает модификатор регулярного выражения.
основная трудность
-
y修饰符
Неявный флаг соответствия заголовка^
- Просто
y修饰符
правильноmatch()
Может быть возвращено только первое совпадение, которое должно совпадать сg修饰符
объединены, чтобы вернуть все совпадения
Symbol
- Определение: уникальное значение
- утверждение:
const set = Symbol(str)
- Входной параметр: строка (необязательно)
- метод
-
Symbol(): Создайте описание с параметрами
Symbol值
(не зарегистрирован в глобальной среде) -
Symbol.for(): создать описание с параметрами
Symbol值
, если есть этот параметр, он вернет исходныйSymbol值
(Сначала ищите, а потом создавайте, регистрируйтесь в глобальной среде) -
Symbol.keyFor(): возвращает зарегистрированный
Symbol值
описание (возвращает толькоSymbol.for()
изkey
) -
Object.getOwnPropertySymbols(): возвращает все свойства объекта, которые используются в качестве имен свойств.
Symbol值
массив
-
Symbol(): Создайте описание с параметрами
- встроенный
-
Symbol.hasInstance: указывает на внутренний метод, когда другие объекты используют
instanceof运算符
Этот метод вызывается при оценке того, является ли этот объект экземпляром -
Symbol.isConcatSpreadable: указывает на логическое значение, определяющее объект для
Array.prototype.concat()
можно расширить - Symbol.species: указывает на конструктор, который вызовет указанный конструктор, когда объект экземпляра использует свой собственный конструктор.
-
Symbol.match: указывает на функцию, когда объект экземпляра
String.prototype.match()
будет переопределен при вызовеmatch()
поведение -
Symbol.replace: указывает на функцию, когда объект экземпляра
String.prototype.replace()
будет переопределен при вызовеreplace()
поведение -
Symbol.search: указывает на функцию, когда объект экземпляра
String.prototype.search()
будет переопределен при вызовеsearch()
поведение -
Symbol.split: указывает на функцию, когда объект экземпляра
String.prototype.split()
будет переопределен при вызовеsplit()
поведение -
Symbol.iterator: указывает на метод итератора по умолчанию, когда объект экземпляра выполняется
for-of
Указанный путешественник по умолчанию называется - Symbol.toPrimitive: указывает на функцию, возвращает значение исходного типа, соответствующее этому объекту, когда объект экземпляра преобразуется в значение исходного типа.
-
Symbol.toStringTag: указывает на функцию, когда объект экземпляра
Object.prototype.toString()
При вызове его возвращаемое значение появится вtoString()
Возвращаемая строка представляет тип объекта -
Symbol.unscopables: Укажите на объект, укажите, чтобы использовать
with
какие свойства будут использоваться приwith环境
исключать
-
Symbol.hasInstance: указывает на внутренний метод, когда другие объекты используют
тип данных
- Undefined
- Null
- String
- Number
- Boolean
-
Object(Включать
Array
,Function
,Date
,RegExp
,Error
) - Symbol
Сценарии применения
- Уникальное имя атрибута объекта: имя атрибута относится к типу Symbol, поэтому оно уникально, что гарантирует, что оно не будет конфликтовать с другими именами атрибутов.
- Устранить волшебные строки: определенная строка или значение, которое появляется несколько раз в коде и образует сильную муфту с кодом
- Обход имен свойств: не может пройти
for-in
,for-of
,Object.keys()
,Object.getOwnPropertyNames()
,JSON.stringify()
Возврат, только черезObject.getOwnPropertySymbols
вернуть - Включает шаблон модулей Singleton: вызов класса возвращает один и тот же экземпляр в любое время (
window
а такжеglobal
),использоватьSymbol.for()
для имитации глобальногоSingleton模式
основная трудность
-
Symbol()
создает значение примитивного типа, которое не является объектом, поэтомуSymbol()
нельзя использовать передnew命令
-
Symbol()
Параметр указывает, что текущийSymbol值
описание тех же параметровSymbol()
возвращаемое значение не равно -
Symbol值
не может работать с другими типами значений -
Symbol值
доступныйString()
илиtoString()
явное преобразование в строку -
Symbol值
При использовании в качестве имени свойства объекта свойство является общедоступным, но не частным. -
Symbol值
В качестве имени свойства объекта можно использовать только оператор квадратных скобок ([]
) для чтения нельзя использовать оператор точки (.
) читать -
Symbol值
При использовании в качестве имени свойства объекта оно не будет проходиться обычными методами.Эту функцию можно использовать для определения объекта.非私有但又只用于内部的方法
Set
Set
- Определение: Структура данных, подобная массиву, в которой значения членов уникальны и неповторяющиеся.
- утверждение:
const set = new Set(arr)
- Входные параметры: есть
Iterator接口
структура данных - Атрибуты
- constructor: Конструктор, возвращает Set
- size: возвращает общее количество членов экземпляра
- метод
- add(): добавить значение, вернуть экземпляр
- delete(): Удалить значение, вернуть логический
- has(): проверить значение, вернуть логическое значение
- clear(): очистить всех членов
- keys(): возвращает объект, значением свойства которого является итератор.
- values(): возвращает объект, значением свойства которого является итератор.
- entries(): возвращает объект со значением свойства и значением свойства итератора.
- forEach(): цикл по каждому элементу с использованием функции обратного вызова
Сценарии применения
- Дедуплицировать строки:
[...new Set(str)].join("")
- Дедуплицированный массив:
[...new Set(arr)]
илиArray.from(new Set(arr))
- массив коллекции
- утверждение:
const a = new Set(arr1)
,const b = new Set(arr2)
- Союз:
new Set([...a, ...b])
- Пересечение:
new Set([...a].filter(v => b.has(v)))
- Разница:
new Set([...a].filter(v => !b.has(v)))
- утверждение:
- коллекция карт
- утверждение:
let set = new Set(arr)
- Отображение:
set = new Set([...set].map(v => v * 2))
илиset = new Set(Array.from(set, v => v * 2))
- утверждение:
основная трудность
- Порядок обхода: порядок размещения
- Ключа нет, есть только значение, ключ и значение можно считать равными
- добавить несколько
NaN
когда есть только одинNaN
- При добавлении одного и того же объекта он будет рассматриваться как другой объект.
- При добавлении значения (
5 !== "5"
) -
keys()
а такжеvalues()
вести себя точно так же,entries()
Возвращенный итератор содержит как ключ, так и значение, и два значения равны
WeakSet
- Определение: Подобно структуре Set, значение члена может быть только объектом.
- утверждение:
const set = new WeakSet(arr)
- Входные параметры: есть
Iterator接口
структура данных - Атрибуты
- constructor: Конструктор, возвращает WeakSet
- метод
- add(): добавить значение, вернуть экземпляр
- delete(): удалить значение, вернуть логическое значение
- has(): проверить значение, вернуть логическое значение
Сценарии применения
- Хранить узлы DOM: этот элемент автоматически освобождается при удалении узлов DOM, поэтому не нужно беспокоиться об утечке памяти при удалении этих узлов из документа.
- Временно хранить набор объектов или хранить информацию, привязанную к объектам: пока эти объекты исчезают извне,
WeakSet结构
ссылки в
основная трудность
- члены
弱引用
, механизм сборки мусора не учитываетWeakSet结构
ссылка на этого члена - Член не подходит для ссылки, он исчезает в любой момент, поэтому ES6 оговаривает
WeakSet结构不可遍历
- Когда другие объекты больше не относятся к участнику, механизм сборки мусора автоматически вернет память, занимаемой этим участником, независимо от того, будет ли член еще в
WeakSet结构
середина
Map
Map
- Определение: объектная структура данных, в которой ключи-члены являются значениями любого типа.
- утверждение:
const set = new Map(arr)
- Входные параметры: есть
Iterator接口
и каждый член представляет собой структуру данных двухэлементного массива - Атрибуты
- constructor: Конструктор, возвращает карту
- size: возвращает общее количество членов экземпляра
- метод
- get(): возвращает пару ключ-значение
- set(): добавить пары ключ-значение, вернуть экземпляр
- delete(): удалить пару ключ-значение, вернуть логическое значение
- has(): проверить пару ключ-значение, вернуть логическое значение
- clear(): очистить всех членов
- keys(): возвращает объект с ключами в качестве итераторов
- values(): возвращает объект, значением которого является итератор
- entries(): возвращает объект с ключами и значениями в качестве итераторов
- forEach(): цикл по каждому элементу с использованием функции обратного вызова
основная трудность
- Порядок обхода: порядок размещения
- Назначьте несколько назначений одной и той же клавише, более позднее значение перезапишет предыдущее значение.
- Ссылка на тот же объект считается ключом
- Два экземпляра одного и того же значения рассматриваются как два ключа
- Ключ привязан к адресу памяти, если адрес памяти отличается, он считается двумя ключами.
- добавить несколько к
NaN
В качестве ключа будет толькоNaN
значение как ключ -
Object结构
поставка字符串—值
соответствует,Map结构
поставка值—值
соответствующий
WeakMap
- Определение: Подобно структуре карты, ключи-члены могут быть только объектами.
- утверждение:
const set = new WeakMap(arr)
- Входные параметры: есть
Iterator接口
и каждый член представляет собой структуру данных двухэлементного массива - Атрибуты
- constructor: Построить функцию, вернуться в WeakMap
- метод
- get(): возвращает пару ключ-значение
- set(): добавить пары ключ-значение, вернуть экземпляр
- delete(): удалить пару ключ-значение, вернуть логическое значение
- has(): проверить пару ключ-значение, вернуть логическое значение
Сценарии применения
- Хранить узлы DOM: этот ключ автоматически высвобождается при удалении узлов DOM, поэтому не нужно беспокоиться об утечке памяти при удалении этих узлов из документа.
- Развертывание частных свойств: внутренние свойства являются слабыми ссылками на экземпляры и исчезают при удалении экземпляра, не вызывая утечек памяти.
основная трудность
- ключи-члены
弱引用
, механизм сборки мусора не учитываетWeakMap结构
ссылка на этот ключ члена - Ключ-член не подходит для ссылки, он исчезает в любой момент, поэтому ES6 оговаривает
WeakMap结构不可遍历
- Когда другие объекты больше не ссылаются на ключ члена, механизм сборки мусора автоматически освободит память, занятую этим членом, независимо от того, существует ли этот член еще в памяти.
WeakMap结构
середина - Как только член больше не нужен, член автоматически исчезнет, нет необходимости вручную удалять ссылку
- слабые ссылки
只是键而不是值
, значение по-прежнему является обычной ссылкой - Даже если ключ элемента разыменован извне, внутреннее значение элемента сохраняется.
Proxy
- Определение: изменить поведение некоторых операций по умолчанию.
- утверждение:
const proxy = new Proxy(target, handler)
- Вход
- target: перехваченный целевой объект
- handler: настроить поведение перехвата
- метод
-
Proxy.revocable(): возвращает отменяемый экземпляр прокси (возвращает
{ proxy, revoke }
, отменить прокси через revoke())
-
Proxy.revocable(): возвращает отменяемый экземпляр прокси (возвращает
- метод перехвата
- get(): Перехватывать чтение свойства объекта
- set(): Перехватывать настройки свойств объекта, возвращать логическое значение
-
has(): Проверка атрибута объекта перехвата
k in obj
, который возвращает логическое значение -
deleteProperty(): Перехватить удаление свойства объекта
delete obj[k]
, который возвращает логическое значение -
defineProperty(): определение свойства объекта перехвата
Object.defineProperty()
,Object.defineProperties()
, который возвращает логическое значение -
ownKeys(): Перехват обхода свойства объекта
for-in
,Object.keys()
,Object.getOwnPropertyNames()
,Object.getOwnPropertySymbols()
, который возвращает массив -
getOwnPropertyDescriptor(): Прочитано описание свойства объекта перехвата
Object.getOwnPropertyDescriptor()
, который возвращает объект -
getPrototypeOf(): Прочитанный прототип объекта перехвата
instanceof
,Object.getPrototypeOf()
,Object.prototype.__proto__
,Object.prototype.isPrototypeOf()
,Reflect.getPrototypeOf()
, который возвращает объект -
setPrototypeOf(): Перехватывать настройки прототипа объекта
Object.setPrototypeOf()
, который возвращает логическое значение -
isExtensible(): Можно ли расширить объект перехвата для чтения
Object.isExtensible()
, который возвращает логическое значение -
preventExtensions(): Перехватывать объект, не расширяемый параметр
Object.preventExtensions()
, который возвращает логическое значение -
apply(): перехватывать экземпляр Proxy как вызов функции
proxy()
,proxy.apply()
,proxy.call()
-
construct(): Перехватывать экземпляр Proxy как вызов конструктора.
new proxy()
Сценарии применения
-
Proxy.revocable()
: Прямой доступ к объекту не разрешен, доступ к нему должен осуществляться через прокси, и как только доступ заканчивается, право прокси аннулируется, и дальнейший доступ не разрешается. -
get()
: Чтение неизвестных свойств для сообщения об ошибках, чтение значения отрицательных индексов массива, инкапсуляция цепных операций и создание вложенных узлов DOM. -
set()
: привязка данных (принцип реализации привязки данных Vue), убедитесь, что настройки значений свойств соответствуют требованиям, и предотвратите чтение и запись внутренних свойств извне. -
has()
: скрыть внутренние свойства от обнаружения, исключить объекты, не соответствующие условиям свойства -
deleteProperty()
: защищает внутренние свойства от удаления -
defineProperty()
: предотвратить внешнее определение свойств -
ownKeys()
: защищает внутренние свойства от обхода
основная трудность
- делать
Proxy
работает, должно быть实例
действие, не для目标对象
действовать - Когда перехват не установлен, это эквивалентно
直接通向原对象
- свойства определяются как
不可读写/扩展/配置/枚举
При использовании метода перехвата будет сообщено об ошибке - целевой объект под прокси, внутренний
this
направлениеProxy代理
Reflect
- определение: держать
Object方法
поведение по умолчанию - метод
- get(): возвращает свойства объекта
- set(): Установить свойства объекта, вернуть логическое значение
- has(): проверить свойства объекта, вернуть логическое значение
- deleteProperty(): удалить свойство объекта, вернуть логическое значение
- defineProperty(): определить свойства объекта, вернуть логическое значение
-
ownKeys(): перебирает свойства объекта, возвращая массив (
Object.getOwnPropertyNames()
+Object.getOwnPropertySymbols()
) - getOwnPropertyDescriptor(): описание свойства возвращаемого объекта, возвращаемый объект
- getPrototypeOf(): возвращает прототип объекта, возвращает объект
- setPrototypeOf(): установить прототип объекта, вернуть логическое значение
- isExtensible(): Возвращает, является ли объект расширяемым, возвращает логическое значение
- preventExtensions(): заданный объект не является расширяемым, возвращает логическое значение
- apply(): выполнить указанную функцию после привязки этого
- construct(): вызвать конструктор для создания экземпляра
цель дизайна
- Буду
Object
принадлежать语言内部的方法
помещатьReflect
начальство - Измените некоторые ошибки метода объекта, чтобы они возвращались
false
- Позволять
Object操作
стали函数行为
-
Proxy
а такжеReflect
дополняют друг друга
Способ утилизации
-
Object.defineProperty()
=>Reflect.defineProperty()
-
Object.getOwnPropertyDescriptor()
=>Reflect.getOwnPropertyDescriptor()
основная трудность
-
Proxy方法
а такжеReflect方法
корреспонденция один на один -
Proxy
а такжеReflect
Комбинированное использование, первое отвечает за拦截赋值操作
, последний отвечает за完成赋值操作
Привязка данных: шаблон наблюдателя
const observerQueue = new Set();
const observe = fn => observerQueue.add(fn);
const observable = obj => new Proxy(obj, {
set(tgt, key, val, receiver) {
const result = Reflect.set(tgt, key, val, receiver);
observerQueue.forEach(v => v());
return result;
}
});
const person = observable({ age: 25, name: "Yajun" });
const print = () => console.log(`${person.name} is ${person.age} years old`);
observe(print);
person.name = "Joway";
Class
- Определение: абстракция для класса вещей с общими характеристиками (синтаксический сахар конструктора)
- Принцип: сам класс указывает на конструктор, и все методы определены в
prototype
, его можно рассматривать как другой способ написания конструктора (Class === Class.prototype.constructor
) - Методы и ключевые слова
-
constructor():Конструктор,
new命令
Автоматически вызывается при создании экземпляров - extends: наследовать от родительского класса
-
super: новый родительский класс
this
- static: определение методов статических свойств.
- get: функция значения, перехватывает поведение значения свойства
- set: Функция сохранения значения, которая перехватывает поведение сохранения значения свойств.
-
constructor():Конструктор,
- Атрибуты
-
__proto__:
构造函数的继承
(всегда указывайте на父类
) -
__proto__.__proto__: прототип прототипа подкласса, то есть прототип родительского класса (всегда указывает на родительский класс
__proto__
) -
prototype.__proto__:
属性方法的继承
(всегда ссылайтесь на родительский классprototype
)
-
__proto__:
- Статические свойства: назначьте свойства после завершения класса определения, это свойство
不会被实例继承
, который можно вызвать только через класс - статический метод: использовать
static
Это определено, метод不会被实例继承
, можно вызвать только через класс (в методеthis
к классу, а не к экземпляру) - наследовать
- вещество
- Суть ES5: сначала создайте экземпляры подкласса
this
, а затем добавьте метод свойства родительского класса вthis
начальство(Parent.apply(this)
) - Суть ES6: сначала добавьте метод свойств экземпляра родительского класса
this
вверх (позвонитьsuper()
), а затем используйте конструктор подкласса для измененияthis
- Суть ES5: сначала создайте экземпляры подкласса
- super
- Вызывается как функция: может вызываться только в конструкторе
super()
,внутреннийthis
указывает на унаследованное当前子类
(super()
Может использоваться только в конструкторе после вызоваthis
) - Вызывается как объект: в
普通方法
Центральная точка父类的原型对象
,существует静态方法
Центральная точка父类
- Вызывается как функция: может вызываться только в конструкторе
- Отображение определения: использование
constructor() { super(); }
Определить родительский класс наследования, без правил написания显示定义
- Подкласс наследует родительский класс: когда подкласс использует метод свойства родительского класса, он должен вызываться в конструкторе
super()
, иначе вы не получите родительский классthis
- Метод статического свойства родительского класса может быть унаследован дочерним классом.
- После того, как подкласс наследует родительский класс, его можно
super
Вызов метода статического свойства родительского класса на
- вещество
- Экземпляр: класс эквивалентен
实例的原型
, все методы свойств, определенные в классе, будут унаследованы экземпляром- Явное указание метода свойства: use
this
присвоить себе (используяClass.hasOwnProperty()
обнаруживаемый) - Неявное присвоение методов свойств: напрямую объявлено и определено в прототипе объекта (с использованием
Class.__proto__.hasOwnProperty()
обнаруживаемый)
- Явное указание метода свойства: use
- выражение
- Выражение класса:
const Class = class {}
- Атрибут имени: возврат сразу за которым следует
class
после имени класса - Выражение свойства:
[prop]
- Метод генератора:
* mothod() {}
- Асинхронный метод:
async mothod() {}
- Выражение класса:
- это указывает на: будет сообщено об ошибке при деструктурировании свойства или метода экземпляра
- Привязать это:
this.mothod = this.mothod.bind(this)
- Функция стрелки:
this.mothod = () => this.mothod()
- Привязать это:
- местоположение определения свойства
- определить в конструкторе и использовать
this
направление - определено в
类最顶层
- определить в конструкторе и использовать
- new.target: определить, как вызывается конструктор
родной конструктор
- String()
- Number()
- Boolean()
- Array()
- Object()
- Function()
- Date()
- RegExp()
- Error()
основная трудность
- Вызов метода для экземпляра по сути является вызовом метода для прототипа.
-
Object.assign()
Удобно добавлять в класс сразу несколько методов (Object.assign(Class.prototype, { ... })
) - Все методы, определенные внутри класса, не являются перечислимыми (
non-enumerable
) - Конструктор по умолчанию возвращает объект экземпляра (
this
), вы можете указать, чтобы вернуть другой объект - Функция значения и функция значения задаются в атрибуте
Descriptor对象
начальство - Класс не имеет подъема переменных
- использовать
new.target === Class
Напишите класс, который нельзя использовать независимо и который должен быть унаследован, прежде чем его можно будет использовать. - После того, как подкласс наследует родительский класс,
this
указывает на экземпляр подкласса черезsuper
Присвойте значение атрибуту, и назначенный атрибут станет атрибутом экземпляра подкласса. - использовать
super
, вы должны явно указать, использовать ли как функцию или как объект -
extends
Не только наследуемые классы, но и нативные конструкторы
метод частной собственности
const name = Symbol("name");
const print = Symbol("print");
class Person {
constructor(age) {
this[name] = "Bruce";
this.age = age;
}
[print]() {
console.log(`${this[name]} is ${this.age} years old`);
}
}
Наследовать примеси
function CopyProperties(target, source) {
for (const key of Reflect.ownKeys(source)) {
if (key !== "constructor" && key !== "prototype" && key !== "name") {
const desc = Object.getOwnPropertyDescriptor(source, key);
Object.defineProperty(target, key, desc);
}
}
}
function MixClass(...mixins) {
class Mix {
constructor() {
for (const mixin of mixins) {
CopyProperties(this, new mixin());
}
}
}
for (const mixin of mixins) {
CopyProperties(Mix, mixin);
CopyProperties(Mix.prototype, mixin.prototype);
}
return Mix;
}
class Student extends MixClass(Person, Kid) {}
Module
- Заказ
-
export: указывает внешний интерфейс модуля.
-
Экспорт по умолчанию:
export default Person
(Можно указать любое имя модуля при импорте, не зная внутреннего реального имени) -
отдельный экспорт:
export const name = "Bruce"
-
экспорт по требованию:
export { age, name, sex }
(рекомендовать) -
переименовать экспорт:
export { name as newName }
-
Экспорт по умолчанию:
-
import: импортировать внутренние функции модуля
-
Импорт по умолчанию:
import Person from "person"
-
Общий импорт:
import * as Person from "person"
-
Импорт по запросу:
import { age, name, sex } from "person"
-
переименовать импорт:
import { name as newName } from "person"
-
самостоятельный импорт:
import "person"
-
составной импорт:
import Person, { name } from "person"
-
Импорт по умолчанию:
-
составной режим:
export命令
а такжеimport命令
Объединенная и записанная в одну строку, переменная фактически не импортируется в текущий модуль, что эквивалентно внешнему интерфейсу переадресации, так что текущий модуль не может напрямую использовать свои импортированные переменные.-
Импорт и экспорт по умолчанию:
export { default } from "person"
-
Общий импорт и экспорт:
export * from "person"
-
Импорт и экспорт по запросу:
export { age, name, sex } from "person"
-
переименовать импорт экспорт:
export { name as newName } from "person"
-
Измените имя на импорт и экспорт по умолчанию:
export { name as default } from "person"
-
Импорт и экспорт переименования по умолчанию:
export { default as name } from "person"
-
Импорт и экспорт по умолчанию:
-
export: указывает внешний интерфейс модуля.
- наследовать:
默认导出
а также改名导出
Используется в комбинации, чтобы сделать модули наследуемыми - Идея дизайна: постараться быть как можно более статичным, чтобы зависимости модулей, а также входные и выходные переменные можно было определить во время компиляции.
- Строгий режим: модули ES6 автоматически переходят в строгий режим (независимо от того, добавлен заголовок модуля или нет).
use strict
)
Схема модуля
- CommonJS: для сервера (динамические зависимости)
- AMD: для браузеров (динамические зависимости)
- CMD: для браузеров (динамические зависимости)
- UMD: для браузеров и серверов (динамические зависимости)
- ESM: для браузеров и серверов (статические зависимости)
Способ загрузки
-
Загрузить время выполнения
- Определение: общий модуль загрузки генерирует объект, а затем получает необходимые свойства и методы от объекта для загрузки (нагрузка все)
- Воздействие. Этот объект можно получить только во время выполнения, что приводит к невозможности выполнения статической оптимизации во время компиляции.
-
загружать во время компиляции
- Определение: Получить требуемые свойства и методы непосредственно из модуля для загрузки (загрузка по требованию)
- Воздействие: загрузка модуля завершается во время компиляции, что более эффективно, чем другие решения, но на сам модуль нельзя ссылаться (сам по себе не объект), который может расширить расширенный синтаксис JS (Макросы и проверка типов)
реализация нагрузки
-
традиционная загрузка:пройти через
<script>
Загружать скрипты синхронно или асинхронно- Синхронная загрузка:
<script src=""></script>
- Отложить загрузки асинхронно:
<script src="" defer></script>
(последовательно загружаются, а затем выполняются после рендеринга) - Асинхронная асинхронная загрузка:
<script src="" async></script>
(Загрузка не по порядку, выполнить после загрузки)
- Синхронная загрузка:
-
загрузка модуля:
<script type="module" src=""></script>
(По умолчанию установлено значение «Отложить асинхронную загрузку»).
Разница между CommonJS и ESM
-
CommonJS
выход值的拷贝
,ESM
выход值的引用
-
CommonJS
После вывода значения изменения в модуле не влияют на это значение. -
ESM
Это динамическая ссылка и не кэширует значение. Переменная в модуле привязана к модулю, в котором она находится. При фактическом выполнении сценария она будет использоваться для получения значения в загруженном модуле в соответствии с этим чтением -только ссылка.
-
-
CommonJS
загружается во время выполнения,ESM
загружается во время компиляции-
CommonJS
Загруженные модули являются объектами (т.е.module.exports
), объект будет сгенерирован только после завершения работы скрипта. -
ESM
Загруженный модуль не является объектом, его внешний интерфейс — это просто статическое определение, которое будет сгенерировано на этапе статического анализа кода.
-
Загрузка узла
- задний план:
CommonJS
а такжеESM
Текущее решение, несовместимое друг с другом, состоит в том, чтобы разделить их и использовать собственную схему загрузки. - Отличие: Требования
ESM
использовать.mjs
суффикс имени файла-
require()
не могу загрузить.mjs文件
,Толькоimport命令
загрузить.mjs文件
-
.mjs文件
нельзя использовать вrequire()
, необходимо использоватьimport命令
загрузить файл
-
- водить машину:
node --experimental-modules file.mjs
- Ограничение: узлы
import命令
В настоящее время поддерживает только загрузку локальных модулей (file:协议
), не поддерживает загрузку удаленных модулей - приоритет загрузки
- В файле сценария отсутствует имя суффикса: попробуйте загрузить четыре файла имен суффиксов по очереди (
.mjs
,.js
,.json
,node
) - Выше не существует: попробуйте загрузить
package.json
изmain字段
указанный скрипт - Выше не существует: попробуйте последовательно загрузить имя как
index
Четыре файла расширения (.mjs
,.js
,.json
,node
) - Вышеупомянутое не существует: ошибка
- В файле сценария отсутствует имя суффикса: попробуйте загрузить четыре файла имен суффиксов по очереди (
- Внутренняя переменная, которой не существует:
arguments
,exports
,module
,require
,this
,__dirname
,__filename
- CommonJS загружает ESM
- нельзя использовать
require()
, использовать толькоimport()
- нельзя использовать
- ESM загружает CommonJS
- автоматически
module.exports
Конвертировано вexport default
-
CommonJS
Механизм кэширования вывода находится вESM
Все еще действует в режиме загрузки - использовать
import命令
нагрузкаCommonJS模块
, не разрешается использовать按需导入
, должен быть использован默认导入
или整体导入
- автоматически
циклическая загрузка
- определение:
脚本A
зависимости выполнения脚本B
,а также脚本A
реализация зависит от脚本B
- Принцип загрузки
- CommonJS:
require()
При первой загрузке скрипта будет выполнен весь скрипт, объект будет сгенерирован в памяти и кэширован, а скрипт будет получен непосредственно из кэша при второй загрузке скрипта. - ЕСМ:
import命令
Загруженная переменная не кэшируется, а становится ссылкой на загруженный модуль
- CommonJS:
- циклическая загрузка
- CommonJS: вывод только той части, которая была выполнена, часть, которая не была выполнена, не будет выводиться.
- ESM: разработчик должен гарантировать, что значение может быть получено, когда будет получено реальное значение (переменная может быть записана в виде функции, а функция имеет эффект продвижения)
основная трудность
- В модулях ES6 верхний уровень
this
направлениеundefined
, не следует использовать в коде верхнего уровняthis
- Модуль — это независимый файл, и все переменные внутри файла не могут быть получены извне.
-
export命令
Выходной интерфейс и соответствующее ему значение动态绑定关系
, то есть значение в реальном времени внутри модуля можно получить через этот интерфейс -
import命令
Имя переменной в фигурных скобках должно совпадать с именем внешнего интерфейса импортируемого модуля. -
import命令
Входная переменная доступна только для чтения (по сути это входной интерфейс), и переписывать интерфейс в скрипте, загружающем модуль, нельзя -
import命令
Команда имеет эффект подъема и будет поднята на голову всего модуля, сначала выполняется - повторить одно и то же предложение
import语句
, который будет выполнен только один раз -
export default
команду можно использовать только один раз -
export default命令
Экспортированный монолитный модуль при выполненииimport命令
не могу следовать大括号
-
export default命令
Суть в том, чтобы вывести файл с именемdefault
переменная, за которой не может следовать变量声明语句
-
export default命令
Суть в том, чтобы присвоить именованномуdefault
переменная, вы можете написать значение сразу после нее -
export default命令
а такжеexport {}命令
могут существовать одновременно, что соответствует复合导入
-
export命令
а такжеimport命令
Он может появиться в любом месте модуля, если он находится на верхнем уровне модуля, а не на уровне блока. -
import()
После того, как модуль будет успешно загружен, модуль будет использоваться как объект какthen()
параметры, вы можете использовать对象解构赋值
чтобы получить выходной интерфейс - При динамической загрузке нескольких модулей одновременно вы можете использовать
Promise.all()
а такжеimport()
в сочетании для достижения -
import()
и объединитьasync/await
написать код для синхронных операций
Шаблон Singleton: кросс-модульные константы
// 常量跨文件共享
// person.js
const NAME = "Bruce";
const AGE = 25;
const SEX = "male";
export { AGE, NAME, SEX };
// file1.js
import { AGE } from "person";
console.log(AGE);
// file2.js
import { AGE, NAME, SEX } from "person";
console.log(AGE, NAME, SEX);
Импорт по умолчанию заменяет общий импорт
import Person from "person";
console.log(Person.AGE);
import * as Person from "person";
console.log(Person.default.AGE);
Iterator
- Определение: Обеспечьте унифицированный механизм доступа к множеству различных структур данных.
- Принцип: создайте указатель на первый элемент и используйте его по порядку.
next()
указывает на следующий элемент, непосредственно на конечную позицию (структуру данных нужно только развернутьIterator接口
для завершения операции обхода) - эффект
- Обеспечить единый и удобный интерфейс доступа к различным структурам данных
- Позволяет расположить элементы структуры данных в определенном порядке
- ES6 создает новые команды обхода
for-of
,Iterator接口
В основном дляfor-of
Потребление
- форма:
for-of
(автоматически находит интерфейс Iterator) - структура данных
- собирать:
Array
,Object
,Set
,Map
- Нативные структуры данных с интерфейсами:
String
,Array
,Set
,Map
,TypedArray
,Arguments
,NodeList
- собирать:
- Развертывание: по умолчанию он развернут в
Symbol.iterator
(Наличие этого свойства считается可遍历的iterable
) - объект итератора
-
next(): Следующая операция, возврат
{ done, value }
(должен быть развернут) -
return():
for-of
Звонок на ранний выход, возврат{ done: true }
-
throw(): не использовать, сотрудничать
Generator函数
использовать
-
next(): Следующая операция, возврат
Цикл ForOf
- определение: звонок
Iterator接口
дает объект итератора (for-of
структура данных внутреннего вызоваSymbol.iterator()
) - Перебрать строку:
for-in
Получать索引
,for-of
Получать值
(распознает 32-битные символы UTF-16) - Перебрать массив:
for-in
Получать索引
,for-of
Получать值
- Итерация по объектам:
for-in
Получать键
,for-of
Нужно развернуть самостоятельно - Пройдите через набор:
for-of
Получать值
=>for (const v of set)
- Пройтись по карте:
for-of
Получать键值对
=>for (const [k, v] of map)
- Перебрать массив классов:
包含length的对象
,Arguments对象
,NodeList对象
(безIterator接口的类数组
доступныйArray.from()
преобразование) - Расчет генерирует структуру данных:
Array
,Set
,Map
- keys(): возвращает объект обхода, обходя все ключи
- values(): возвращает объект итератора, перебирая все значения
- entries(): Возвращает объект обхода, просматривая все пары ключ-значение.
- а также
for-in
разница- имеют то же самое
for-in
тот же лаконичный синтаксис, но безfor-in
эти недостатки, - отличный от
forEach()
, который можно комбинировать сbreak
,continue
а такжеreturn
С использованием - Предоставляет унифицированный рабочий интерфейс для обхода всех структур данных.
- имеют то же самое
Сценарии применения
- переписать с
Iterator接口
структура данныхSymbol.iterator
- Присвоение деструктуризации: структурирование набора
- оператор распространения: будет развернут
Iterator接口
структура данных в массив - урожай*:
yield*
Вслед за проходимой структурой данных будет вызываться интерфейс обходчика - Функции, которые принимают массивы в качестве аргументов:
for-of
,Array.from()
,new Set()
,new WeakSet()
,new Map()
,new WeakMap()
,Promise.all()
,Promise.race()
Promise
- Определение: объект, содержащий результат асинхронной операции.
- условие
-
в ходе выполнения:
pending
-
удалось:
resolved
-
не удалось:
rejected
-
в ходе выполнения:
- Функции
- На состояние объекта не влияет внешний мир
- Однажды состояние изменилось, оно больше не изменится, и этот результат можно получить в любой момент.
- утверждение:
new Promise((resolve, reject) => {})
- женьшень
-
resolve: изменить состояние с
未完成
стали成功
, вызываемый при успешном выполнении асинхронной операции и передающий результат асинхронной операции в качестве параметра -
reject: изменить состояние с
未完成
стали失败
, вызывается при сбое асинхронной операции, передавая ошибку асинхронной операции в качестве параметра
-
resolve: изменить состояние с
- метод
-
then(): указать отдельно
resolved状态
а такжеrejected状态
функция обратного вызова-
первый параметр: Статус становится
resolved
когда звонят -
второй параметр: Статус становится
rejected
при вызове (необязательно)
-
первый параметр: Статус становится
- catch(): укажите функцию обратного вызова при возникновении ошибки
-
Promise.all(): Обернуть несколько экземпляров в новый экземпляр и вернуть массив результатов после того, как все состояния экземпляра были изменены (все изменения, а затем возврат).
- Входные параметры: есть
Iterator接口
структура данных - Успех: изменения состояния только всех экземпляров
fulfilled
, конечное состояние станетfulfilled
- Ошибка: одно из состояний экземпляра изменилось на
rejected
, конечное состояние становитсяrejected
- Входные параметры: есть
-
Promise.race(): обернуть несколько экземпляров в новый экземпляр и вернуть результат после того, как все состояния экземпляра будут изменены в первую очередь (сначала изменить и сначала вернуть)
- Входные параметры: есть
Iterator接口
структура данных - Успех или неудача: какой экземпляр первым изменяет состояние и возвращает состояние какого экземпляра
- Входные параметры: есть
-
Promise.resolve(): преобразовать объект в объект Promise (эквивалентно
new Promise(resolve => resolve())
)- Экземпляр обещания: возвращает входной параметр без изменений
-
Доступный объект: преобразовать этот объект в объект Promise и вернуть (Thenable содержит
then()
объект, выполнитьthen()
Эквивалентно выполнению этого объектаthen()
) -
Объекты без then(): Превратите этот объект в объект Promise и верните его, статус
resolved
-
без параметров: возвращает объект Promise со статусом
resolved
-
Promise.reject(): преобразовать объект в состояние
rejected
Объект обещания (эквивалентноnew Promise((resolve, reject) => reject())
)
-
then(): указать отдельно
Сценарии применения
- загрузить изображение
- AJAX для обещания объекта
основная трудность
- Только результат асинхронной операции может определить, в каком состоянии находится текущее состояние, и никакая другая операция не может изменить это состояние.
- Есть только две возможности изменения состояния: из
pending
сталиresolved
,отpending
сталиrejected
- После нового
Promise对象
будет выполнено немедленно и не может быть отменено на полпути - Если функция обратного вызова не установлена, внутренняя ошибка не будет отражена во внешнем
- когда в
pending
, невозможно узнать, на какой стадии он в настоящее время прогрессирует - Состояние экземпляра становится
resolved
илиrejected
, это вызоветthen()
Привязка функции обратного вызова -
resolve()
а такжеreject()
Выполнение всегда позже, чем синхронная задача текущего цикла -
then()
Возвращает новый экземпляр, после которого можно вызвать другойthen()
-
then()
Если во время работы выдается ошибка, она будетcatch()
захватывать -
reject()
эквивалентно выдаче ошибки - Состояние экземпляра изменилось на
resolved
Когда ошибка выдается снова, она недействительна и не будет обнаружена, что эквивалентно тому, чтобы не выбрасывать - Ошибки состояния экземпляра имеют
冒泡
природе, будут передаваться в обратном направлении до тех пор, пока не будут обнаружены, ошибки всегда будут возвращены следующимcatch()
захватывать - Уходите
then()
определено вrejected
Функция обратного вызова состояния (не использует второй параметр) - Рекомендуется использовать
catch()
поймать ошибки, не использоватьthen()
захват второго параметра - не использовал
catch()
Отловите ошибку, ошибка создания экземпляра не будет передана внешнему коду, т.е.不会有任何反应
- Экземпляр, определенный как параметр
catch()
, однаждыrejected
не срабатываетPromise.all()
изcatch()
-
Promise.reject()
Параметры останутся нетронутыми, т.к.rejected
Причина становится параметром последующего метода
Generator
- Определение: решение для асинхронного программирования, которое инкапсулирует несколько внутренних состояний.
- Форма: звоните
Generator函数
(Эта функция не выполняется) Возвращает объект-указатель, указывающий на внутреннее состояние (не результат операции) - утверждение:
function* Func() {}
- метод
-
next(): переместить указатель в следующее состояние, вернуться
{ done, value }
(Присоединение к встрече расценивается как предыдущаяyield命令表达式
Возвращаемое значение) -
return(): возвращает указанное значение и завершает обход
Generator函数
,вернуть{ done: true, value: 入参 }
-
throw():существует
Generator函数
Generator函数
new Errow()
-
next(): переместить указатель в следующее состояние, вернуться
-
return
-
yield命令
value
-
next()
yield命令
-
yield命令
Generator函数
return语句
value
-
Generator函数
return语句
value
undefined
-
-
Generator函数
Generator函数
Iterator接口
-
for-of
next()
-
const obj = { method: function*() {} }
const obj = { * method() {} }
-
上下文环境
yield命令
当前状态
next()
上下文环境
-
next()
throw()
return()
yield命令
-
-
next()
yield命令
值
-
return()
yield命令
return语句
-
throw()
yield命令
throw语句
-
next()
-
Generator函数
Symbol.iterator
Iterator接口
-
next()
函数头部
上次停下的位置
yield命令
return语句
-
yield命令
暂缓执行函数
next()
-
yield命令
next()
это действие для возобновления -
yield命令
используемый в другом выражении, должен быть помещен в圆括号
внутри -
yield命令
Используется как параметр функции или помещается в правую часть выражения присваивания без добавления圆括号
-
yield命令
Само по себе возвращаемого значения нет, его можно рассматривать как возвратundefined
-
yield命令表达式
для ленивой оценки и т. д.next()
Оценить до этого момента - После вызова функции генерируется объект обходчика, и
Symbol.iterator
это сам объект - На разных этапах выполнения функции,
next()
Внедрять разные значения снаружи внутрь, тем самым корректируя поведение функции - первый
next()
Используется для запуска объекта обходчика, параметры могут быть переданы позже - хочу позвонить в первый раз
next()
Когда вы можете ввести значение, вы можете обернуть другой слой вне функции - однажды
next()
возвращаемый объектdone
дляtrue
,for-of
Обход прервется без возвращаемого объекта - Внутреннее развертывание функции
try-finally
и выполняетtry
,Такreturn()
приведет к немедленному входуfinally
, выполнятьfinally
Тогда вся функция закончится - Внутри функции нет развертывания
try-catch
,throw()
Выброшенные ошибки будут внешнимиtry-catch
захватывать -
throw()
Возникновение ошибки должно быть перехвачено внутри, при условии, что она должна быть至少执行过一次next()
-
throw()
После захвата следующий будет казненyield命令
- Функция еще не начала выполняться, в это время
throw()
Ошибка может быть выброшена только вне функции
Первый метод next() может передать значение
function Wrapper(func) {
return function(...args) {
const generator = func(...args);
generator.next();
return generator;
}
}
const print = Wrapper(function*() {
console.log(`First Input: ${yield}`);
return "done";
});
print().next("hello");
ES2016
Числовое расширение
-
Экспоненциальный оператор (**): Числовое возведение в степень (эквивалентно
Math.pow()
)
расширение массива
- includes(): существует ли указанный элемент
ES2017
утверждение
-
Общая память и атомарные операции: глобальным объектом
SharedArrayBuffer
а такжеAtomics
реализация, хранящая данные в общем пространстве памяти, которое можно найти вJS主线程
а такжеweb-worker线程
делится между
расширение строки
- padStart(): заполнить указанную строку до начала строки и вернуть новую строку
- padEnd(): заполнить указанную строку до конца строки и вернуть новую строку
расширение объекта
- Object.getOwnPropertyDescriptors(): Возвращает объект описания всех его собственных свойств (не унаследованных свойств) объекта.
- Object.values(): возвращает массив значений
- Object.entries(): возвращает массив ключей и значений
расширение функции
- запятая в конце параметра функции: разрешить запятую в конце последнего параметра функции
Async
- Определение: сделать асинхронные функции написанными в виде синхронных функций (синтаксический сахар функции генератора)
- Принцип:
Generator函数
и автоматический исполнительspawn
завернутый в функцию - Формат: будет
Generator函数
из*
заменитьasync
,Будуyield
заменитьawait
- утверждение
- Именованная функция:
async function Func() {}
- Выражение функции:
const func = async function() {}
- Функция стрелки:
const func = async() => {}
- Методы объекта:
const obj = { async func() {} }
- метод класса:
class Cla { async Func() {} }
- Именованная функция:
- команда await: дождитесь изменения состояния текущего объекта Promise
- Обычная ситуация: если за объектом Promise следует результат, будет возвращен результат, в противном случае будет возвращено соответствующее значение.
- с последующим
Thenable对象
: приравнивает его к объекту Promise и возвращает его результат
- Обработка ошибок: будет
await命令Promise对象
помещатьtry-catch
Средний (множественный)
Async улучшает генератор
- Встроенный привод
- лучшая семантика
- более широкая применимость
- Возвращаемое значение является объектом Promise.
Сценарии применения
- Последовательное выполнение асинхронных операций
основная трудность
-
Async函数
вернутьPromise对象
, быть пригодным для использованияthen()
Добавить функцию обратного вызова - внутренний
return返回值
будет продолжениемthen()
исходящий - Внутреннее выбрасывание ошибки приводит к тому, что возвращаемый объект Promise становится
rejected状态
,стеганое одеялоcatch()
получено - Возвращенный объект Promise должен ждать, пока все внутренние
await命令Promise对象
Изменение состояния произойдет только после выполнения, если оно не встретитreturn语句
или抛出错误
- любой
await命令Promise对象
сталиrejected状态
,весьAsync函数
выполнение будет прервано - Есть надежда, что последующие асинхронные операции не будут прерваны, даже если предыдущая завершится ошибкой.
- Буду
await命令Promise对象
помещатьtry-catch
середина -
await命令Promise对象
Сcatch()
- Буду
-
await命令Promise对象
может статьrejected状态
, лучше поставитьtry-catch
середина - несколько
await命令Promise对象
Если нет вторичных отношений, лучше позволить им срабатывать одновременно. -
await命令
можно использовать только вAsync函数
, иначе будет сообщено об ошибке - использование массива
forEach()
воплощать в жизньasync/await
не получится, можно использоватьfor-of
а такжеPromise.all()
заменять - Стек выполнения может быть сохранен, а контекст функции следует
Async函数
существует для выполнения и исчезает, когда выполнение завершено
ES2018
расширение строки
-
Ослабить ограничения на экранирование строк в шаблонах тегов.: Возврат при обнаружении недопустимого escape-последовательности строки
undefined
, и изraw
Исходную строку можно получить на
расширение объекта
-
оператор спреда(...): преобразование объекта в последовательность параметров, разделенных запятыми (
{ ...obj }
, эквивалентноrest/spread参数
обратная операция)
Расширенное приложение
- Клонировать объект:
const obj = { __proto__: Object.getPrototypeOf(obj1), ...obj1 }
- Объединить объекты:
const obj = { ...obj1, ...obj2 }
- Преобразование строки в объект:
{ ..."hello" }
- Преобразование массива в объект:
{ ...[1, 2] }
- Совместите с заданием по разборке объекта:
const { x, ...rest/spread } = { x: 1, y: 2, z: 3 }
(Невозможно скопировать свойства, унаследованные от объекта-прототипа) - Измените существующие свойства части объекта:
const obj = { x: 1, ...{ x: 2 } }
Регулярное расширение
-
модификатор s:dotAll модификатор режима сделать
.
соответствует любому одиночному символу (dotAll模式
) -
dotAll: установить ли
s修饰符
-
ретроспективное утверждение:
x
только вy
матч после -
ретроспективное отрицательное утверждение:
x
только отсутствуетy
матч после -
Экранирование свойства Unicode: совпадение совпадений
Unicode某种属性
все персонажи- Прямое сопоставление:
\p{PropRule}
- Обратное совпадение:
\P{PropRule}
- лимит:
\p{...}
а также\P{...}
только правильноUnicode字符
Эффективен, нужно добавлять при использованииu修饰符
- Прямое сопоставление:
-
именованный групповой матч: укажите имя для каждого набора совпадений (
?<GroupName>
)- форма:
str.exec().groups.GroupName
- Замена присваивания деструктурирования
- утверждение:
const time = "2017-09-11"
,const regexp = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/u
- соответствовать:
time.replace(regexp, "$<day>/$<month>/$<year>")
- утверждение:
- форма:
Promise
- finally(): укажите функцию обратного вызова, которая будет выполняться независимо от последнего состояния.
Async
-
Асинхронный итератор (для ожидания): цикл ожидания каждого
Promise对象
сталиresolved状态
прежде чем перейти к следующему шагу
ES2019
расширение строки
-
Введите U+2028 и U+2029 напрямую: Строка может быть введена напрямую
行分隔符
а также段分隔符
- JSON.stringify() Модернизация: может вернуть строку, не соответствующую стандарту UTF-8.
- trimStart(): удалить пробелы в начале строки и вернуть новую строку.
- trimEnd(): удалить конечные пробелы из строки и вернуть новую строку
расширение объекта
-
Object.fromEntries(): возвращает объект, состоящий из ключей и значений (
Object.entries()
обратная операция)
расширение массива
-
стабильность sort(): элементы с одинаковым ключом сортировки имеют одинаковый порядок до и после сортировки, по умолчанию
稳定
- flat(): сгладить массив, вернуть новый массив
- flatMap(): сопоставить и сгладить массив, вернуть новый массив (можно расширить только один слой массива)
расширение функции
- Преобразование toString(): вернуть исходный код функции (в соответствии с кодировкой)
-
Параметр catch() может быть опущен.:
catch()
Параметры могут быть опущены
Symbol
-
description:вернуть
Symbol值
описание
ES2020
утверждение
-
globalThis: как объект верхнего уровня, указывающий на глобальную среду
this
- Браузер: объект верхнего уровня
window
- Узел: объект верхнего уровня
global
- WebWorker: объект верхнего уровня
self
- Над тремя: общий объект верхнего уровня
globalThis
- Браузер: объект верхнего уровня
Числовое расширение
-
BigInt: целое число из любого количества цифр (новый тип данных, используйте
n
конец)- BigInt(): конвертировать обычные числовые значения в типы BigInt
- BigInt.asUintN(): преобразовать BigInt в 0 или 2nСоответствующее значение между -1
- BigInt.asIntN(): преобразовать BigInt в -2n-1до 2n-1-1
-
BigInt.parseInt(): примерно
Number.parseInt()
, преобразует строку в тип BigInt указанного основания
основная трудность
- BigInt также может быть представлен различными основаниями, при этом необходимо добавлять суффиксы.
- BigInt и обычное целое — это два вида значений, они не равны
- Оператор typeof возвращает данные типа BigInt.
bigint
расширение объекта
-
оператор цепочки (?.): Есть ли свойство объекта (без возврата
undefined
и не продолжайте дальше)- Свойства объекта:
obj?.prop
,obj?.[expr]
- вызов функции:
func?.(...args)
- Свойства объекта:
-
Нулевой оператор (??): является ли значение
undefined
илиnull
, если да, используйте значение по умолчанию
Регулярное расширение
- matchAll(): возвращает все подходящие обходчики
Module
-
import(): динамический импорт (возврат
Promise
)- задний план:
import命令
Он статически анализируется движком JS и выполняется перед другими операторами в модуле и не может быть заменен.require()
Функция динамического нагружения предлагается ввестиimport()
заменитьrequire()
- Местоположение: Доступно в любом месте
- разница:
require()
дасинхронная загрузка,import()
даАсинхронная загрузка - Сценарий: загрузка по требованию, условная загрузка, динамический путь к модулю.
- задний план:
Iterator
- порядок обхода for-in: Различные движки договорились о том, как перебирать свойства, стандартизируя поведение.
Promise
-
Promise.allSettled(): обернуть несколько экземпляров в новый экземпляр и вернуть массив состояний после того, как все состояния экземпляров были изменены (все изменения, а затем возврат).
- Входные параметры: есть
Iterator接口
структура данных - Успех: Участник содержит
status
а такжеvalue
,status
дляfulfilled
,value
для возвращаемого значения - Ошибка: участник содержит
status
а такжеreason
,status
дляrejected
,value
по неправильной причине
- Входные параметры: есть
предложение ЕС
утверждение
-
сделать выражение: инкапсулирует операции с областью действия блока, возвращая значение последнего выполненного выражения внутри (
do{}
) -
бросить выражение: Использовать напрямую
throw new Error()
, без()
или{}
включать - !#Заказ: Указать исполнителя скрипта (прописано в первой строке файла)
Числовое расширение
-
Числовой разделитель (_):использовать
_
как разделитель тысяч (для повышения удобочитаемости числовых значений) - Math.signbit(): Возвращает, установлен ли числовой знак
расширение функции
-
выполнение функциональной части: функция повторного использования (
?
представляет собой заполнитель для одного параметра,...
Указывает несколько заполнителей параметров) -
Оператор канала (|>): передать значение выражения слева в функцию справа для оценки (
f(x)
=>x |> f
) -
оператор привязки (::): привязка функции (слева — объект, справа — функция, вместо
bind
,apply
,call
передача)- связывать:
bar.bind(foo)
=>foo::bar
- применять:
bar.apply(foo, arguments)
=>foo::bar(...arguments)
- связывать:
Realm
- определение: обеспечивать
沙箱功能
, что позволяет изолированному коду предотвратить получение глобального объекта изолированным кодом. - утверждение:
new Realm().global
Class
-
статические свойства:использовать
static
определить свойство, свойство不会被实例继承
, который можно вызвать только через класс -
частная собственность:использовать
#
Определите свойство, к которому можно получить доступ только внутри класса -
частный метод:использовать
#
Определите метод, к которому можно получить доступ только внутри класса -
декоратор:использовать
@
Аннотировать или изменять классы и методы классов
Module
- import.meta: вернуть метаинформацию скрипта
Promise
-
Promise.any(): Обернуть несколько экземпляров в новый экземпляр и вернуть массив результатов после того, как все состояния экземпляра были изменены (все изменения, а затем возврат).
- Входные параметры: есть
Iterator接口
структура данных - Успех: один из статусов экземпляра становится
fulfilled
, конечное состояние становитсяfulfilled
- Ошибка: только состояние всех экземпляров изменилось на
rejected
, конечное состояние станетrejected
- Входные параметры: есть
-
Promise.try(): не хотите различать синхронные и асинхронные функции, оберните функцию как экземпляр, используйте
then()
Чтобы указать следующий процесс, используйтеcatch()
поймать ошибки
Async
-
Топ Ожидайте: позволяет независимое использование на верхнем уровне модуля
await命令
(заниматьawait
Решить проблему асинхронной загрузки модулей)
Суммировать
Наконец, я вышлю вам полную карту функций ES6, не забудьте дать ее мне.поставить лайкО, это своего рода поддержка для меня. Поскольку изображение слишком большое для загрузки, пожалуйста, обратите вниманиеIQ前端
или отсканировать文章底部二维码
, фоновый ответES6
, получите карту памяти в высоком разрешении со всеми функциями ES6, которая поможет вам легко запомнитьВсе функции ES6.
Эпилог
❤️Подписаться + Нравится + Избранное + Комментарий + Переслать ❤️, оригинальность это не просто, поощряйте автора к созданию более качественных статей
Обратите внимание на публичный аккаунтIQ前端
, внешний общедоступный аккаунт, ориентированный на навыки разработки CSS / JS, вас ждут другие галантереи переднего плана
- Ответить после подписки
资料
Бесплатная коллекция учебных материалов - Ответить после подписки
进群
Втяните вас в группу технического обмена - Добро пожаловать, чтобы следовать
IQ前端
,БолееНавыки разработки на CSS/JSНажимайте только на публичный аккаунт