Примечание. Цифры (xx) перед каждым вопросом представляют частоту вопроса. Эта основа JS основана на вопросах и соответствующих ответах, справочных ссылках и т. д., которые были отсортированы в начале 30+ статьи. Содержание статьи организовано лицом, получившим Оферту.
(2) Вопрос: 0,1 + 0,2 === 0,3? Почему?
JavaScript использует тип Number для представления чисел (целых чисел или чисел с плавающей запятой) в соответствии со стандартом IEEE 754, представляя число (1 + 11 + 52) с 64 битами.
- 1 бит знака, 0 для положительных чисел, 1 для отрицательных чисел s
- 11 бит экспоненты (e)
- 52 мантисса, дробная часть (т.е. значащие цифры)
Наибольшее безопасное число: Number.MAX_SAFE_INTEGER = Math.pow(2, 53) - 1, преобразование в целое число составляет 16 бит, поэтому 0,1 === 0,1, потому что два равны после удаления значимого бита через toPrecision(16 ).
Когда добавляются два числа, они сначала преобразуются в двоичные. Когда 0,1 и 0,2 преобразуются в двоичные, мантисса будет бесконечно зацикливаться, а затем выполнять операцию порядка. Движок JS обрежет двоичный код, поэтому точность будет потеряна. .
Итак, подведем итог:Потеря точности может произойти в базовых преобразованиях и скалярных операциях.
Ссылка на ссылку
(4) Вопрос: Тип данных JS
Основные типы: число, логическое значение, строка, нуль, неопределенный, символ (новое в ES6), BigInt (ES2020). Типы ссылок: объект, подтипы объектов (массив, функция)
Ссылка на ссылку
В: Как представляются целые числа JS?
- Представленное типом Number, согласно стандарту IEEE754, число представляется 64-битным (1 + 11 + 52), наибольшее безопасное число — Math.pow(2, 53) — 1, для 16-битного десятичного числа. (бит знака + бит экспоненты + дробная мантисса)
Q: Насколько большой номер () места для хранения? Если фон отправил несколько более максимального количества себя
Math.pow(2, 53) , 53 — допустимое число, произойдет усечение, и оно равно наибольшему числу, которое может поддерживать JS.
(4) Напишите код: реализуйте функции, которые могут глубоко клонировать базовые типы.
Мелкий клон:
function shallowClone(obj) {
let cloneObj = {};
for (let i in obj) {
cloneObj[i] = obj[i];
}
return cloneObj;
}
Глубокий клон:
- Рассмотрим базовый тип
- тип ссылки
- RegExp, Date, Function не безопасны для JSON
- потеряет конструктор, все конструкторы указывают на объект
- ломать циклические ссылки
function deepCopy(obj) {
if (typeof obj === 'object') {
var result = obj.constructor === Array ? [] : {};
for (var i in obj) {
result[i] = typeof obj[i] === 'object' ? deepCopy(obj[i]) : obj[i];
}
} else {
var result = obj;
}
return result;
}
Вопрос: Трансляция событий
Поток событий – это порядок, в котором элементы веб-страницы получают события. Поток событий, указанный параметром "Событие уровня DOM2", включает три этапа: этап захвата событий, этап в целевом объекте и этап всплывающего окна событий. Захват события, которое происходит первым, дает возможность перехватить событие. Затем фактическая цель принимает событие. Последняя фаза — это фаза всплытия во времени, когда на события можно реагировать. Хотя в фазе захвата указано, что реагировать на события запрещено, на самом деле она будет выполнена, поэтому есть два шанса получить целевой объект.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>事件冒泡</title>
</head>
<body>
<div>
<p id="parEle">我是父元素 <span id="sonEle">我是子元素</span></p>
</div>
</body>
</html>
<script type="text/javascript">
var sonEle = document.getElementById('sonEle');
var parEle = document.getElementById('parEle');
parEle.addEventListener('click', function () {
alert('父级 冒泡');
}, false);
parEle.addEventListener('click', function () {
alert('父级 捕获');
}, true);
sonEle.addEventListener('click', function () {
alert('子级冒泡');
}, false);
sonEle.addEventListener('click', function () {
alert('子级捕获');
}, true);
</script>
Когда элемент-контейнер и вложенный элемент捕获阶段
опять таки冒泡阶段
При вызове обработчика события:События идут в порядке потока событий DOM.Выполнить обработчик события:
- родительский захват
- захват детей
- клокочущий подуровень
- родитель пузырится
И когда событие находится в целевой фазе, порядок вызова события определяется событием привязки.порядок написания, в соответствии с приведенным выше примером сначала вызывается обработчик событий этапа всплытия, а затем вызывается обработчик событий этапа захвата. Предупреждайте по очереди «пузырьковое подмножество» и «захват подмножества».
IE-совместимый
- attchEvent('on' + type, handler)
- detachEvent('on' + type, handler)
Ссылка на ссылку
В: Как реализуются события?
В соответствии с моделью «публикация-подписка» код, связанный с событием, будет считываться при загрузке браузера, но выполняться он будет только при срабатывании определенного события.
Например, нажатие кнопки — это событие (Event), а сегмент кода, отвечающий за обработку события, обычно называется обработчиком события (Event Handler), что является действием «запуска отображения диалогового окна».
На веб-стороне мы обычно видим события DOM:
- Для событий уровня DOM0 привязывайте on-event напрямую к html элементу, например onclick, при отмене, dom.onclick = null, может быть только один обработчик для одного и того же события, и последний перезапишет первый.
- События уровня DOM2, регистрация событий через addEventListener, удаление событий через removeEventListener, событие может иметь несколько обработчиков событий, выполняться последовательно, захватывать события и всплывать события
- События уровня DOM3, добавление типов событий, таких как события пользовательского интерфейса, события фокуса, события мыши.
Ссылка на ссылку
Q: что происходит с новой функцией
Построить вызов:
- создать совершенно новый объект
- Этот объект будет связан с помощью [[Prototype]], связывая [[Prototype]] этого нового объекта с объектом, на который указывает конструктор .prototype.
- Этот новый объект будет привязан к this вызова функции
- Если функция не возвращает другой объект, то вызов функции в новом выражении автоматически возвращает новый объект
Q: новый конструктор, если функция возвращаетreturn {}
,return null
,return 1
,return true
Что просходит?
Если функция возвращает объект, то вызов новой функции возвращает возвращенный объект этой функции, в противном случае он возвращает новый объект, созданный новой функцией.
просить:symbol
какая польза
Может использоваться для представления уникальной переменной для предотвращения конфликтов имен. Но интервьюер спросил, есть ли еще? Я не придумал никакого другого применения, поэтому просто ответил, что не знаю, вы также можете использоватьsymbol
не будет использоваться обычными методами (за исключениемObject.getOwnPropertySymbols
снаружи) обход, поэтому может использоваться для моделирования частных переменных.
В основном используется для обеспечения интерфейса обхода, организованногоsymbol.iterator
предметы можно использовать толькоfor···of
Циклы могут единообразно обрабатывать структуры данных. После вызова возвращается объект traverser, который содержит метод next.После использования метода next есть два возвращаемых значения value и done, которые соответственно указывают значение текущей позиции выполнения функции и был ли выполнен обход завершено.
Symbol.for() может обращаться к символам глобально
(3) В: Что такое закрытие?
Замыкание — это функция, которая имеет доступ к переменной в области видимости другой функции.
Весь процесс выполнения кода JavaScript делится на два этапа: этап компиляции кода и этап выполнения кода. Фаза компиляции завершается компилятором, переводящим код в исполняемый код, и на этом этапе будут определены правила области действия. Этап выполнения выполняется движком, основная задача — выполнить исполняемый код, и на этом этапе создается контекст выполнения.
Что такое масштаб?
В ES5 есть только два типа областей: глобальная область и область действия. В JavaScript мы определяем область действия как набор правил, которые управляют тем, как движок ищет переменные (имена переменных или функций) по имени идентификатора в текущей области видимости и вложенных подобластях.
Что такое цепочка областей видимости?
Прежде всего, нам нужно понять цепочку объема. При доступе к переменной, когда компилятор выполняет этот код, он сначала будет искать идентификатор в текущем объеме. Если он не найден, он перейдет на родительскую область Найди это. Родительская область не найден и продолжает искать до глобального масштаба, а цепочка объема области состоит из серии переменных объектов текущего объема и верхнего объема, что гарантирует, что в настоящее время выполненная область действия соответствует доступу права. Заказанный доступ к переменным и функциям.
Суть закрытия
В текущей среде есть ссылка на родительскую область.
что такое закрытие
Замыкание — это специальный объект, состоящий из двух частей: контекста выполнения (кодовое имя A) и функции (кодовое имя B), созданной в этом контексте выполнения.Когда B выполняется, если осуществляется доступ к значению объекта-переменной в A, то замыкание будет создано, и имя функции этого контекста выполнения A используется для ссылки на замыкание в Chrome.
Как генерировать замыкания в целом
- функция возврата
- Функции передаются как параметры
Сценарии применения замыканий
- карри бинд
- модуль
Справочная статья
Q: Что такое NaN и что выводит typeof?
Not a Number, что означает не число, typeof NaN === 'number'
(2) Вопрос: неявное преобразование JS, преобразование отображения
Как правило, при преобразовании небазового типа сначала вызывается valueOf.Если valueOf не может вернуть значение базового типа, вызывается toString.
строки и числа
- Оператор "+", если это строка, то преобразовать ее в строку, а затем выполнить конкатенацию строк
- Оператор "-", преобразование в числа, вычитание (-a, a * 1 a/1) может выполнять неявное преобразование типов
[] + {} 和 {} + []
логическое значение для числа
- 1 + true = 2
- 1 + false = 1
Преобразование в логию
- второй за
- while
- if
- Тернарное выражение
- || (логическое ИЛИ) && (логическое И) левый операнд
символ
- не может быть преобразован в число
- Может быть преобразовано в логическое значение (оба значения верны)
- Можно преобразовать в строку «Символ (Cool)»
Свободное равенство и строгое равенство
Свободное равенство допускает приведение типов, а строгое равенство — нет.
Строки и числа
преобразовать в число, а затем сравнить
Другие типы и логические типы
- Сначала преобразуйте логический тип в число, затем продолжите сравнение.
объект и не объект
- Выполните ToPrimitive(object) объекта и продолжите сравнение
список ложных значений
- undefined
- null
- false
- +0, -0, NaN
- ""
(2) В: Что вы знаете об этом, привязывать, звонить и применять?
Все они являются методами функций
call: Array.prototype.call(this, args1, args2])
apply: Array.prototype.apply(this, [args1, args2])
: использовался для расширения вызовов массива до ES6,foo.appy(null, [])
, после ES6 используйте оператор ...
- Новые привязки > Явные привязки > Неявные привязки > Привязки по умолчанию
- Если вам нужно использовать каррирование привязки и применить деструктуризацию массива для привязки к нулю, используйте Object.create(null) для создания объекта DMZ, если это возможно.
Четыре правила:
- Привязка по умолчанию, никаких других модификаций (bind, apply, call), определенная в нестрогом режиме, указывает на глобальный объект, в строгом режиме определение указывает на undefined
function foo() {
console.log(this.a);
}
var a = 2;
foo();
- Неявная привязка: независимо от того, находится ли объект контекста в месте вызова, принадлежит ли он объекту или содержится в нем, правило неявной привязки свяжет это в вызове функции с этим объектом контекста. При этом в вызывающей позиции работает только верхний или последний уровень цепочки свойств объекта
function foo() {
console.log(this.a);
}
var obj = {
a: 2,
foo: foo,
}
obj.foo(); // 2
- Явные привязки: Явные привязки к this путем запуска вызова и применения к функции.
function foo() {
console.log(this.a);
}
var obj = {
a: 2
};
foo.call(obj);
Показать привязку Hard Binding
function foo(something) {
console.log(this.a, something);
return this.a + something;
}
function bind(fn, obj) {
return function() {
return fn.apply(obj, arguments);
};
}
var obj = {
a: 2
}
var bar = bind(foo, obj);
Новая привязка, новый вызов функции создает совершенно новый объект и привязывает этот объект к this вызова функции.
- При привязке new, если это новая функция с жесткой привязкой, жестко привязанная this будет заменена вновь созданным объектом.
function foo(a) {
this.a = a;
}
var bar = new foo(2);
console.log(bar.a)
(4) В: рукописное связывание, применение, вызов
// call
Function.prototype.call = function (context, ...args) {
context = context || window;
const fnSymbol = Symbol("fn");
context[fnSymbol] = this;
context[fnSymbol](...args);
delete context[fnSymbol];
}
// apply
Function.prototype.apply = function (context, argsArr) {
context = context || window;
const fnSymbol = Symbol("fn");
context[fnSymbol] = this;
context[fnSymbol](...argsArr);
delete context[fnSymbol];
}
// bind
Function.prototype.bind = function (context, ...args) {
context = context || window;
const fnSymbol = Symbol("fn");
context[fnSymbol] = this;
return function (..._args) {
args = args.concat(_args);
context[fnSymbol](...args);
delete context[fnSymbol];
}
}
(3) Спросите:setTimeout(fn, 0)
Как долго выполнять, Цикл событий
setTimeout помещается в очередь по порядку, а затем ждет, пока стек вызовов функций опустеет, прежде чем начать выполнение, и порядок, в котором эти операции попадают в очередь, определяется установленным временем задержки
Рукописный вопрос: принцип обещания
class MyPromise {
constructor(fn) {
this.callbacks = [];
this.state = "PENDING";
this.value = null;
fn(this._resolve.bind(this), this._reject.bind(this));
}
then(onFulfilled, onRejected) {
return new MyPromise((resolve, reject) =>
this._handle({
onFulfilled: onFulfilled || null,
onRejected: onRejected || null,
resolve,
reject,
})
);
}
catch(onRejected) {
return this.then(null, onRejected);
}
_handle(callback) {
if (this.state === "PENDING") {
this.callbacks.push(callback);
return;
}
let cb =
this.state === "FULFILLED" ? callback.onFulfilled : callback.onRejected;
if (!cb) {
cb = this.state === "FULFILLED" ? callback.resolve : callback.reject;
cb(this.value);
return;
}
let ret;
try {
ret = cb(this.value);
cb = this.state === "FULFILLED" ? callback.resolve : callback.reject;
} catch (error) {
ret = error;
cb = callback.reject;
} finally {
cb(ret);
}
}
_resolve(value) {
if (value && (typeof value === "object" || typeof value === "function")) {
let then = value.then;
if (typeof then === "function") {
then.call(value, this._resolve.bind(this), this._reject.bind(this));
return;
}
}
this.state === "FULFILLED";
this.value = value;
this.callbacks.forEach((fn) => this._handle(fn));
}
_reject(error) {
this.state === "REJECTED";
this.value = error;
this.callbacks.forEach((fn) => this._handle(fn));
}
}
const p1 = new Promise(function (resolve, reject) {
setTimeout(() => reject(new Error("fail")), 3000);
});
const p2 = new Promise(function (resolve, reject) {
setTimeout(() => resolve(p1), 1000);
});
p2.then((result) => console.log(result)).catch((error) => console.log(error));
В: проблема с загрузкой js-скрипта, асинхронность, проблема с отсрочкой
- Если вы полагаетесь на другие скрипты и результаты DOM, используйте defer
- Используйте асинхронность, если у вас нет сильных зависимостей от DOM и других скриптов.
использованная литература
Вопрос: Как узнать, является ли объект пустым объектом?
Object.keys(obj).length === 0
Рукописный вопрос: онлайн-программирование, getUrlParams(url,key); очень простая задача получения параметра URL, но необходимо учитывать граничные условия, несколько возвращаемых значений и т.д.
В: внешний файл js загружается первым или сначала выполняется onload, почему?
onload выполняется после завершения загрузки
Q: Как добавить мониторинг событий, два типа
onclick и addEventListener
Q: Механизм распространения событий (поток событий)
Пузырь и поймать
(4) В: Расскажите мне о цепочке прототипов и наследовании цепочки прототипов.
- Все обычные цепочки [[Prototype]] в конечном итоге указывают на встроенный Object.prototype, который содержит множество функций, общих для JavaScript.
- Почему можно создать «класс» со специальным свойством: все функции по умолчанию имеют общее и неперечислимое свойство, называемое прототипом, которое указывает на другой объект, который часто называют прототипом функции.
function Person(name) {
this.name = name;
}
Person.prototype.constructor = Person
-
Когда вызывается новый конструктор, [[Prototype]] нового созданного объекта будет связан с объектом, на который указывает Person.prototype, этот механизм называется наследованием цепочки прототипов.
-
Методы определяются в прототипе, а свойства определяются в конструкторе.
-
Прежде всего, поговорим о связи между JS-прототипом и экземпляром: у каждого конструктора (конструктора) есть объект-прототип (прототип), этот объект-прототип содержит свойство-указатель, указывающее на функцию-конструктор, и экземпляр, сгенерированный вызовом функции-конструктора через новый. Этот экземпляр содержит указатель на объект-прототип, который связан с объектом-прототипом через [[Prototype]]
-
Тогда поговорим о поиске по атрибуту в JS: когда мы пытаемся сослаться на атрибут объекта-экземпляра, мы ищем таким образом, сначала выясняем, есть ли этот атрибут на объекте-экземпляре, если нет, то конструируем экземпляр Найдите объект, на который указывает прототип конструктора
-
Что такое цепочка прототипов: Этот вид поиска выглядит как цепочка и связан через атрибут [[Prototype]], поэтому он называется цепочкой прототипов.
-
Что такое наследование цепочки прототипов, аналогичное наследованию классов: когда есть два конструктора A и B, объект-прототип конструктора A связан с объектом-прототипом другого конструктора B через его атрибут [[Prototype]], этот процесс называется прототипическое наследование.
Более правильное объяснение стандартного ответа
Что такое цепочка прототипов?
Когда объект ищет свойство, если оно не найдено в себе, он будет искать собственный прототип, если прототип не найден, он будет продолжать поиск прототипа прототипа, пока не найдет прототип Объекта. .prototype На данный момент прототип равен null , Find Stop. Эта восходящая цепочка поиска по цепочке прототипов называется цепочкой прототипов.
Что такое прототипическое наследование?
Объект может использовать свойства или методы другого объекта, что называется наследованием. В частности, установив прототип этого объекта в другой объект, в соответствии с правилами цепочки прототипов, если ищется атрибут объекта, а он не существует, будет искаться другой объект, который эквивалентен объекту, который может использовать другой свойства и методы объекта.
Ссылка на ссылку
В: Расскажите мне о своем понимании JS
Это динамический язык, основанный на прототипе, и основными уникальными особенностями являются прототип и цепочка прототипов.
JS строго разделен на: стандартную часть языка (ECMAScript) + часть среды хоста.
Секция языковых стандартов
ES6 был выпущен в 2015 году, и было введено много новых функций, позволяющих писать масштабные проекты.Стандарт носит кодовое название с 2015 года и обновляется каждый год.
Раздел хост-среды
- В среде хостинга браузера, включая DOM + BOM и т. д.
- В Node среда хостинга включает в себя некоторые файлы, базы данных, сети, взаимодействие с операционной системой и т. д.
В: Какие функции может вызывать массив?
- push
- pop
- splice
- slice
- shift
- unshift
- sort
- find
- findIndex
- Методы функционального программирования, такие как map/filter/reduce
- В цепочке прототипов также есть несколько методов: toString/valueOf
Q: Как определить тип массива
Array.isArray
В: Являются ли аргументы функции массивом? Знаете ли вы, как преобразовать массив, подобный массиву, в массив?
Он похож на массив, относится к категории утиного типа, выглядит как массив,
- ... оператор
- Array.from
- Array.prototype.slice.apply(arguments)
В: Вы использовали TypeScript? Что оно делает?
Добавьте поддержку типов в JS и обеспечьте поддержку последней версии синтаксиса ES, которая удобна для командной работы и отладки, а также для разработки крупномасштабных проектов.
В: Вы использовали PWA? Каков принцип использования serviceWorker?
渐进式网络应用(PWA)
Это концепция, предложенная Google в конце 2015 года. В основном веб-приложение, но с внешним видом原生app
аналогичный. служба поддержкиPWA
на веб-сайте могут предоставляться такие функции, как автономная работа, push-уведомления и доступ к оборудованию устройства.
Service Worker
Это скрипт, который работает независимо от веб-страницы на заднем плане, что открывает дверь к функциональности, которая не требует веб-страницы или взаимодействия пользователя. Теперь у них есть функции, такие как push-уведомления и фоновая синхронизация. будущее,Service Worker
Будут поддерживаться дополнительные функции, такие как периодическая синхронизация или геозона. Основная функциональность, обсуждаемая в этом учебнике, — это перехват и обработка сетевых запросов, включая программное управление ответами в кеше.
Ссылка на ссылку
Q: Наследование с использованием прототипа до ES6
Object.create() создаст «новый» объект, а затем свяжет [[Prototype]] внутри этого объекта с указанным вами объектом (Foo.prototype). Object.create(null) создает пустой связанный объект [[Prototype]], который не может быть делегирован.
function Foo(name) {
this.name = name;
}
Foo.prototype.myName = function () {
return this.name;
}
// 继承属性,通过借用构造函数调用
function Bar(name, label) {
Foo.call(this, name);
this.label = label;
}
// 继承方法,创建备份
Bar.prototype = Object.create(Foo.prototype);
// 必须设置回正确的构造函数,要不然在会发生判断类型出错
Bar.prototype.constructor = Bar;
// 必须在上一步之后
Bar.prototype.myLabel = function () {
return this.label;
}
var a = new Bar("a", "obj a");
a.myName(); // "a"
a.myLabel(); // "obj a"
В: Если конструктор связывает объект, будет ли экземпляр, созданный с помощью этого конструктора, наследовать свойства объекта? Почему?
Он не будет наследоваться, так как по четырем правилам этой привязки приоритет новой привязки выше, чем у привязки привязки display.При вызове конструктора через new будет создан новый объект, и этот новый объект заменит привязка объекта bind , как this этой функции, и если эта функция не возвращает объект, возвращает этот вновь созданный объект
(3) В чем разница между стрелочными функциями и обычными функциями? Можно ли использовать стрелочные функции в качестве конструкторов?
- Обычные функции определяются ключевым словом function. Его нельзя использовать в сочетании с лексической областью видимости. Оно связывается во время выполнения и зависит только от того, как вызывается функция, где она вызывается и где вызывается. (в зависимости от вызывающего абонента, и если он работает независимо)
- Стрелочные функции используют операции, известные как «толстые стрелки».
=>
Определение, стрелочные функции не применяют четыре правила этой привязки обычных функций, но определяют это в соответствии с областью действия внешнего слоя (функция или глобальная), и привязка стрелочных функций не может быть изменена (и не может быть новой).- Стрелочные функции часто используются в функциях обратного вызова, включая обработчики событий или таймеры.
- Стрелочные функции и var self = this пытаются заменить традиционный операционный механизм this, возвращая эту привязку к лексической области видимости.
- Нет прототипа, нет этого, нет супер, нет аргументов, нет new.target
- нельзя вызывать с новым ключевым словом
- Внутри функции есть два метода: [[Call]] и [[Construct]].При вызове функции через new будет выполнен метод [[construct]], создан экземпляр объекта, а затем функция тело будет выполнено. this функции привязано к этому объекту экземпляра
- При прямом вызове выполнить метод [[Call]] и выполнить тело функции напрямую
- Стрелочные функции не имеют метода [[Construct]] и не могут использоваться в качестве вызова конструктора, а при использовании new для вызова функции будет сообщено об ошибке.
function foo() {
return (a) => {
console.log(this.a);
}
}
var obj1 = {
a: 2
}
var obj2 = {
a: 3
}
var bar = foo.call(obj1);
bar.call(obj2);
использованная литература
В: Вы знаете класс ES6? Вы понимаете ключевое слово Static?
Добавляйте методы непосредственно в объект функции этого класса, а не добавляйте его в объект-прототип этого объекта функции.
(3) Вопрос: Механизм событийного цикла (Event Loop)
Механизм цикла событий сообщает нам порядок выполнения кода JavaScript в целом.Event Loop
то есть цикл событий, что означает браузер илиNode
решениеjavaScript
Механизм, который не блокируется при работе на одном потоке, то есть мы часто используемасинхронныйпринцип.
Сначала выполните скрипт Script, затем очистите очередь микрозадач, затем запустите следующий цикл цикла обработки событий, сначала продолжите выполнение задачи макроса, затем очистите очередь микрозадач и так далее.
- Задача макроса: Script/setTimeout/setInterval/setImmediate/I/O/UI Rendering
- Микрозадача: process.nextTick()/Promise
Обращенные setTimeout и setInterval являются источниками задач, и что действительно входит в очередь задач, так это задачи, которые они отправляют.
приоритет
- setTimeout = setInterval очередь
- setTimeout > setImmediate
- process.nextTick > Promise
for (const macroTask of macroTaskQueue) {
handleMacroTask();
for (const microTask of microTaskQueue) {
handleMicroTask(microTask);
}
}
Ссылка на ссылку
(2) Рукописный вопрос: выравнивание массива
function flatten(arr) {
let result = [];
for (let i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) {
result = result.concat(flatten(arr[i]));
} else {
result = result.concat(arr[i]);
}
}
return result;
}
const a = [1, [2, [3, 4]]];
console.log(flatten(a));
Рукописные вопросы: реализация каррирования
предварительно установить некоторые параметры
Что такое каррирование: относится к функции, которая принимает функцию A и возвращает новую функцию, которая обрабатывает оставшиеся аргументы функции A.
function createCurry(func, args) {
var argity = func.length;
var args = args || [];
return function () {
var _args = [].slice.apply(arguments);
args.push(..._args);
if (args.length < argity) {
return createCurry.call(this, func, args);
}
return func.apply(this, args);
}
}
Рукописный вопрос: Дедупликация массива
Array.from(new Set([1, 1, 2, 2]))
Q: пусть замыкания
let создаст временную мертвую зону.В текущем контексте выполнения переменная будет продвинута, но не инициализирована.Поэтому на этапе выполнения контекста выполнения, если код выполнения не выполнил назначение переменной, он сообщит об ошибке если на переменную ссылаются.Эта переменная не инициализирована.
Вопрос: Вариативное продвижение
Когда функция выполняется, она сначала создает контекст выполнения, затем помещает контекст выполнения в стек, а затем начинает выполнение контекста выполнения, когда контекст выполнения находится на вершине стека.
В процессе создания контекста выполнения будет сделано три вещи: создать переменный объект, создать цепочку областей действия и определить точку этого.В процессе создания переменного объекта сначала создать атрибут для аргументов со значением аргументов, а затем сканировать объявление функции code.function, создать свойство с тем же именем, значение является ссылкой на функцию, а затем просмотреть объявление переменной var, чтобы создать свойство с тем же именем, значение не определено , то есть переменное продвижение.
Как использовать экземпляр
Левая сторона может быть любым значением, правая сторона может быть только функцией
'hello tuture' instanceof String // false
использованная литература
- nuggets.capable/post/684490…
- Tickets.WeChat.QQ.com/Yes/Сопровождай меня на 5 пустырях...
- Tickets.WeChat.QQ.com/Yes/B HCl DPs GD…
- у-у-у. Краткое описание.com/afraid/Chengdu 3fee40 oh…
❤️ Спасибо за поддержку
Если вам это нравится, не забудьте поделиться, поставить лайк и посмотреть Санлянь~.