Подготовка к собеседованию является очень важным этапом. Одних знаний зачастую не хватает, так как волнение может взять свое. Поэтому перед интервью необходимо провести тщательную подготовку, чтобы освежить свои знания. В статье подготовлены вопросы и как необходимо на них отвечать. Успехов!
1 2 3 4 5 6 7 8 9 10 |
функция привет сказать ( ) { консоль . журнал ( имя ) ; консоль . журнал ( возраст ) ; имя установить = ' Лидия' ; пусть возраст = 21 ; } привет ( ) ; |
Lydia
иundefined
Lydia
иReferenceError
ReferenceError
и21
undefined
иReferenceError
Отвечать
Внутри функции мы сначала объявляем name
переменную с var
ключевым словом. Это означает, что переменная поднимается (пространство памяти настраивается на создание) со значением по умолчанию undefined
, пока мы не доберемся до строки, где мы наблюдаем переменную. Мы еще не определили переменную в строке, где мы пытаемся зарегистрировать name
переменную, поэтому она по-прежнему содержит значение undefined
.
Переменные с let
ключевыми словами (и const
) поднимаются, но, в отличие от var
, не активизируются . Они доступны до строки, в которой мы их объявляем (инициализируем). Это называется «временной мертвой зоной». Когда мы пытаемся получить доступ к переменным до их объявления, JavaScript выдает ReferenceError
.
1 2 3 4 5 6 7 8 9 |
для ( вар я = 0 ; я < 3 ; я ++ ) { SetTimeout ( ( ) => console . войдите ( я ) , 1 ) ; } для ( пусть я = 0 ; я < 3 ; я ++ ) { SetTimeout ( ( ) => console . войдите ( я ) , 1 ) ; } |
0 1 2
и0 1 2
0 1 2
и3 3 3
3 3 3
и0 1 2
Отвечать
Из-за очереди событий в JavaScript setTimeout
функция обратного вызова вызывается после выполнения цикла. Поскольку переменная i
в первом цикле была объявлена с помощью var
ключевого слова, это значение было глобальным. Во время цикла мы каждый раз увеличивали значение i
на 1
, используя унарный оператор ++
. К моменту setTimeout
вызова функции обратного вызова i
было равно 3
в первом примере.
Во втором цикле переменная i
была объявлена с использованием let
ключевого слова: переменные, объявленные с помощью ключевого слова let
(и const
), имеют блочную область видимости (блок — это что-то между { }
). Во время каждой итерации i
будет иметь новое значение, и каждое значение находится внутри цикла.
1 2 3 4 5 6 7 8 9 10 11 12 |
const shape = { радиус : 10 , диаметр ( ) { вернуть это . радиус * 2 ; } , периметр : ( ) => 2 * Math . ПИ * это . радиус , } ; консоль . бревно ( форма . диаметр ( ) ) ; консоль . бревно ( форма . периметр ( ) ) ; |
20
и62.83185307179586
20
иNaN
20
и63
NaN
и63
Отвечать
Обратите внимание, что значение diameter
представляет собой обычную функцию, тогда как значение perimeter
представляет собой стрелочную функцию.
В стрелочных функциях this
ключевое слово указывает на его текущую окружающую область, в отличие от обычных функций! Это означает, что когда мы вызываем perimeter
, он относится не к объекту формы, а к окружающей его области (например, к окну).
В этом объекте нет значения radius
, которое возвращает NaN
.
1 2 3 4 |
+ правда ; ! «Лидия» ; |
1
иfalse
false
иNaN
false
иfalse
Отвечать
Унарный плюс пытается преобразовать операнд в число. true
есть 1
, и false
есть 0
.
Строка 'Lydia'
является истинным значением. На самом деле мы спрашиваем: «Является ли это истинное значение ложным?». Это возвращает false
.
1 2 3 4 5 6 7 8 9 10 |
const птица = { размер : 'маленький' , } ; const mouse = { имя : 'Микки' , маленький : правда , } ; |
mouse.bird.size
недействителенmouse[bird.size]
недействительноmouse[bird["size"]]
недействительноОтвечать
В JavaScript все ключи объекта являются строками (если только это не символ). Даже если мы не можем вводить их как строки, они всегда преобразуются в строки под капотом.
JavaScript интерпретирует (или распаковывает) операторы. Когда мы используем скобочную нотацию, она видит первую открывающую скобку [
и продолжает работать, пока не найдет закрывающую скобку ]
. Только тогда он будет оценивать заявление.
mouse[bird.size]
: Сначала он оценивает bird.size
, что есть "small"
. mouse["small"]
возвращаетсяtrue
Однако с точечной нотацией этого не происходит. mouse
не имеет ключа под названием bird
, что означает, что mouse.bird
это undefined
. Затем мы просим size
использовать запись через точку: mouse.bird.size
. Так mouse.bird
как undefined
, мы на самом деле спрашиваем undefined.size
. Это недопустимо и вызовет ошибку, аналогичную Cannot read property "size" of undefined
.
1 2 3 4 5 6 7 8 |
let c = { приветствие : 'Эй!' } ; пусть д ; д = с ; в . приветствие = 'Привет' ; консоль . журнал ( д . приветствие ) ; |
Hello
Hey!
undefined
ReferenceError
TypeError
Отвечать
В JavaScript все объекты взаимодействуют по ссылке , если установить их равными друг другу.
Во- первых, переменная c
содержит значение объекта. Позже мы присваиваем d
ту же ссылку, что c
и объект.
Когда вы меняете один объект, вы меняете их все.
1 2 3 4 5 6 7 8 9 |
пусть а = 3 ; пусть b = новый номер ( 3 ) ; пусть с = 3 ; консоль . журнал ( а == б ) ; консоль . бревно ( а === б ) ; консоль . журнал ( б === с ) ; |
true
false
true
false
false
true
true
false
false
false
true
true
Отвечать
new Number()
является встроенным конструктором функций. Хотя это выглядит как число, на самом деле это не число: оно имеет кучу дополнительных функций и является объектом.
Когда мы используем ==
оператор, он только проверяет, имеет ли он то же самое значение . Они оба имеют значение 3
, поэтому он возвращает true
.
Однако, когда мы используем ===
оператор, и значение, и тип должны быть одинаковыми. Это не: new Number()
это не число, это объект . Оба возвращаютсяfalse.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
класс Хамелеон { статический colorChange ( newColor ) { this . новый цвет = новый цвет ; вернуть это . новыйцвет ; } конструктор ( { newColor = 'зеленый' } = { } ) { this . новый цвет = новый цвет ; } } const freddie = новый хамелеон ( { newColor : 'purple' } ) ; консоль . log ( freddie .colorChange ( ' оранжевый' ) ) ; |
orange
purple
green
TypeError
Отвечать
Функция colorChange
статическая. Статические методы предназначены для работы только в конструкторе, в котором они созданы, и не могут передаваться каким-либо дочерним элементам или вызываться в экземплярах класса. Так freddie
как это экземпляр класса Chameleon, функция не может быть вызвана для него. Брошен TypeError
А.
1 2 3 4 5 |
пусть приветствие ; приветствие = { } ; // Опечатка! консоль . журнал ( приветствие ) ; |
{}
ReferenceError: greetign is not defined
undefined
Отвечать
Он регистрирует объект, потому что мы только что создали пустой объект для глобального объекта! Когда мы опечатались greeting
как greetign
, интерпретатор JS фактически увидел это как global.greetign = {}
(или window.greetign = {}
в браузере).
Чтобы этого избежать, мы можем использовать "use strict"
. Это гарантирует, что вы объявили переменную, прежде чем установить ее равной чему-либо.
1 2 3 4 5 6 7 |
функция коры ( ) { консоль . бревно ( "Гав!" ) ; } кора .животное = 'собака' ; |
SyntaxError
. Вы не можете добавлять свойства к функции таким образом."Woof"
регистрируется.ReferenceError
Отвечать
Это возможно в JavaScript, потому что функции — это объекты! (Все, кроме примитивных типов, являются объектами)
Функция — это особый тип объекта. Код, который вы пишете сами, не является реальной функцией. Функция — это объект со свойствами. Это свойство вызывается.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
функция Person ( имя , фамилия ) { this . имя = имя ; это . фамилия = фамилия ; } const member = new Person ( 'Лидия' , 'Хэлли' ) ; человек . getFullName = function ( ) { return ` ${ this . имя } ${ это . фамилия } ` ; } ; консоль . log ( член.getFullName ( ) ) ; _ _ |
TypeError
SyntaxError
Lydia Hallie
undefined
undefined
Отвечать
В JavaScript функции являются объектами, поэтому метод getFullName
добавляется к самому объекту функции-конструктора. По этой причине мы можем вызвать Person.getFullName()
, но member.getFullName
выдает TypeError
.
Если вы хотите, чтобы метод был доступен для всех экземпляров объекта, вы должны добавить его в свойство прототипа:
1 2 3 4 5 |
человек . прототип . getFullName = function ( ) { return ` ${ this . имя } ${ это . фамилия } ` ; } ; |
1 2 3 4 5 6 7 8 9 10 11 12 |
функция Person ( имя , фамилия ) { this . имя = имя ; это . фамилия = фамилия ; } const lydia = new Person ( 'Лидия' , 'Хэлли' ) ; const sarah = Person ( 'Сара' , 'Смит' ) ; консоль . журнал ( Лидия ) ; консоль . журнал ( Сара ) ; |
Person {firstName: "Lydia", lastName: "Hallie"}
иundefined
Person {firstName: "Lydia", lastName: "Hallie"}
иPerson {firstName: "Sarah", lastName: "Smith"}
Person {firstName: "Lydia", lastName: "Hallie"}
и{}
Person {firstName: "Lydia", lastName: "Hallie"}
иReferenceError
Отвечать
Для sarah
, мы не использовали new
ключевое слово. При использовании new
относится this
к новому пустому объекту, который мы создаем. Однако, если вы не добавите new
, this
ссылается на глобальный объект !
Мы сказали, что this.firstName
равны "Sarah"
и this.lastName
равны "Smith"
. То, что мы на самом деле сделали, определяет global.firstName = 'Sarah'
и global.lastName = 'Smith'
. sarah
сам по себе оставлен undefined
, так как мы не возвращаем значение из Person
функции.
Отвечать
На этапе захвата событие проходит через элементы-предки до целевого элемента. Затем он достигает целевого элемента, и начинается всплытие .
Отвечать
Все объекты имеют прототипы, кроме базового объекта . Базовый объект — это объект, созданный пользователем, или объект, созданный с использованием new
ключевого слова. Базовый объект имеет доступ к некоторым методам и свойствам, таким как .toString
. Вот почему вы можете использовать встроенные методы JavaScript! Все такие способы доступны на прототипе. Хотя JavaScript не может найти его непосредственно в вашем объекте, он идет вниз по цепочке прототипов и находит его там, что делает его доступным для вас.
1 2 3 4 5 6 7 |
сумма функций ( а , б ) { вернуть а + б ; } сумма ( 1 , '2' ) ; |
NaN
TypeError
"12"
3
Отвечать
JavaScript — это язык с динамической типизацией : мы не указываем, к какому типу относятся те или иные переменные. Значения могут быть автоматически преобразованы в другой тип без вашего ведома, что называется неявным приведением типа . Принуждение — это превращение одного типа в другой.
В этом примере JavaScript преобразует число 1
в строку, чтобы функция имела смысл и возвращала значение. При добавлении числового типа ( 1
) и строкового типа ( '2'
) число рассматривается как строка. Мы можем объединять такие строки, как "Hello" + "World"
, так что здесь происходит то, "1" + "2"
что возвращает "12"
.
1 2 3 4 5 6 |
пусть число = 0 ; консоль . бревно ( число ++ ) ; консоль . журнал ( ++ число ) ; консоль . журнал ( число ) ; |
1
1
2
1
2
2
0
2
2
0
1
2
Отвечать
Постфиксный унарный оператор ++
:
0
)1
)Префикс унарный оператор ++
:
2
)2
)Это возвращает 0 2 2
.
1 2 3 4 5 6 7 8 9 10 11 12 |
функция getPersonInfo ( один , два , три ) { console . журнал ( один ) ; консоль . бревно ( два ) ; консоль . бревно ( три ) ; } const person = 'Лидия' ; постоянный возраст = 21 ; getPersonInfo ` ${ person } $ { age } лет` ; |
"Lydia"
21
["", " is ", " years old"]
["", " is ", " years old"]
"Lydia"
21
"Lydia"
["", " is ", " years old"]
21
Отвечать
Если вы используете теговые литералы шаблонов, значение первого аргумента всегда является массивом строковых значений. Остальные аргументы получают значения переданных выражений!
1 2 3 4 5 6 7 8 9 10 11 12 13 |
function checkAge ( data ) { if ( data === { age : 18 } ) { console . log ( 'Вы взрослый!' ) ; } else if ( data == { age : 18 } ) { console . log ( 'Вы все еще взрослый.' ) ; } еще { консоль . log `Хм.. Думаю, у тебя нет возраста` () ; } } checkAge ( { возраст : 18 } ) ; |
You are an adult!
You are still an adult.
Hmm.. You don't have an age I guess
Отвечать
При проверке на равенство примитивы сравниваются по их значению , а объекты — по их ссылке . JavaScript проверяет, имеют ли объекты ссылки на одно и то же место в памяти.
Два объекта, которые мы сравниваем, не имеют этого: объект, который мы передали в качестве параметра, ссылается на другое место в памяти, чем объект, который мы использовали для проверки равенства.
Вот почему оба { age: 18 } === { age: 18 }
и { age: 18 } == { age: 18 }
return false
.
1 2 3 4 5 6 7 |
функция getAge ( ... аргументы ) { console . журнал ( тип аргументов ) ; } получить возраст ( 21 ) ; |
"number"
"array"
"object"
"NaN"
Отвечать
Параметр rest ( ...args
) позволяет нам «собрать» все оставшиеся аргументы в массив. Массив является объектом, поэтому typeof args
возвращает"object"
1 2 3 4 5 6 7 8 9 |
function getAge ( ) { 'использовать строгое' ; возраст = 21 ; консоль . журнал ( возраст ) ; } getAge ( ) ; |
21
undefined
ReferenceError
TypeError
Отвечать
С помощью "use strict"
вы можете быть уверены, что случайно не объявите глобальные переменные. Мы никогда не объявляли переменную age
, и, поскольку мы используем "use strict"
, это вызовет ошибку ссылки. Если бы мы не использовали "use strict"
, это сработало бы, так как свойство age
было бы добавлено к глобальному объекту.
sum
?
1 2 3 |
const sum = eval ( '10*10+5' ) ; |
105
"105"
TypeError
"10*10+5"
Отвечать
eval
оценивает коды, переданные в виде строки. Если это выражение, как в этом случае, оно вычисляет выражение. Выражение есть 10 * 10 + 5
. Это возвращает число 105
.
1 2 3 |
хранилище сессий . setItem ( 'cool_secret' , 123 ) ; |
Отвечать
Сохраненные данные sessionStorage
удаляются после закрытия вкладки .
Если бы вы использовали localStorage
, данные были бы там навсегда, если, например localStorage.clear()
, не вызываются.
1 2 3 4 5 6 |
переменная число = 8 ; переменная число = 10 ; консоль . журнал ( число ) ; |
8
10
SyntaxError
ReferenceError
Отвечать
С помощью var
ключевого слова вы можете объявить несколько переменных с одним и тем же именем. Затем переменная будет содержать последнее значение.
Вы не можете сделать это с let
или const
с тех пор, как они имеют блочную область видимости.
1 2 3 4 5 6 7 8 9 |
const obj = { 1 : 'а' , 2 : 'b' , 3 : 'c' } ; const set = new Set ( [ 1 , 2 , 3 , 4 , 5 ] ) ; объект . имеет собственное свойство ( '1' ) ; объект . имеет собственное свойство ( 1 ) ; установить . имеет ( '1' ) ; установить . имеет ( 1 ) ; |
false
true
false
true
false
true
true
true
true
true
false
true
true
true
true
true
Отвечать
Все ключи объекта (за исключением символов) являются строками внутри, даже если вы не вводите их сами как строку. Вот почему obj.hasOwnProperty('1')
также возвращает true.
Это не работает таким образом для набора. В '1'
нашем наборе нет: set.has('1')
возвращает false
. Имеет числовой тип 1
, set.has(1)
возвращает true
.
1 2 3 4 |
const obj = { a : 'один' , b : 'два' , a : 'три' } ; консоль . журнал ( объект ) ; |
{ a: "one", b: "two" }
{ b: "two", a: "three" }
{ a: "three", b: "two" }
SyntaxError
Отвечать
Если у вас есть два ключа с одинаковым именем, ключ будет заменен. Он по-прежнему будет в своей первой позиции, но с последним указанным значением.
Отвечать
Базовый контекст выполнения — это глобальный контекст выполнения: он доступен везде в вашем коде.
1 2 3 4 5 6 |
for ( пусть я = 1 ; я < 5 ; я ++ ) { если ( я === 3 ) продолжить ; консоль . журнал ( я ) ; } |
1
2
1
2
3
1
2
4
1
3
4
Отвечать
Оператор continue
пропускает итерацию, если возвращается определенное условие true
.
1 2 3 4 5 6 7 8 9 |
Строка . прототип . датьЛидияПицца = ( ) => { return 'Дай уже Лидии пиццу!' ; } ; константное имя = 'Лидия' ; имя . датьЛидияПицца ( ) ; |
"Just give Lydia pizza already!"
TypeError: not a function
SyntaxError
undefined
Отвечать
String
— это встроенный конструктор, к которому мы можем добавлять свойства. Я просто добавил метод к его прототипу. Примитивные строки автоматически преобразуются в строковый объект, генерируемый функцией прототипа строки. Итак, все строки (строковые объекты) имеют доступ к этому методу!
1 2 3 4 5 6 7 8 9 10 |
константа = { } ; _ const b = { ключ : 'b' } ; константа с = { ключ : 'c' } ; а [ б ] = 123 ; а [ с ] = 456 ; консоль . журнал ( а [ б ] ) ; |
123
456
undefined
ReferenceError
Отвечать
Ключи объекта автоматически преобразуются в строки. Мы пытаемся установить объект в качестве ключа к объекту a
со значением 123
.
Однако, когда мы строим объект, он становится "[object Object]"
. Итак, что мы говорим здесь, это то, что a["[object Object]"] = 123
. Затем мы можем попытаться сделать то же самое снова. c
— это еще один объект, который мы неявно строкируем. Итак, a["[object Object]"] = 456
.
Затем мы регистрируем a[b]
, что на самом деле a["[object Object]"]
. Мы просто установили его в 456
, поэтому он возвращает 456
.
1 2 3 4 5 6 7 8 9 |
const foo = ( ) => консоль . журнал ( "Первый" ) ; const bar = ( ) => setTimeout ( ( ) => console .log ( ' Второй' ) ) ; const baz = ( ) => консоль . журнал ( "Третий" ) ; бар ( ) ; фу ( ) ; баз ( ) ; |
First
Second
Third
First
Third
Second
Second
First
Third
Second
Third
First
Отвечать
У нас есть setTimeout
функция, и мы вызвали ее первой. Тем не менее, он был зарегистрирован последним.
Это связано с тем, что в браузерах у нас есть не только механизм выполнения, но и нечто, называемое файлом WebAPI
. The WebAPI
дает нам setTimeout
функцию для начала и, например, DOM.
После того, как обратный вызов передается в WebAPI, сама setTimeout
функция (но не обратный вызов!) удаляется из стека.
Теперь foo
вызывается и "First"
регистрируется.
foo
извлекается из стека и baz
вызывается. "Third"
регистрируется.
WebAPI не может просто добавлять что-то в стек, когда оно будет готово. Вместо этого он отправляет функцию обратного вызова в нечто, называемое очередью .
Здесь начинает работать цикл событий. Цикл событий просматривает стек и очередь задач. Если стек пуст, он берет первое из очереди и помещает его в стек.
bar
вызывается, "Second"
регистрируется и извлекается из стека.
1 2 3 4 5 6 7 8 9 |
< div onclick =" console.log('первый div') " > < div onclick =" console.log('второй div') " > < button onclick =" console.log('button') " > Нажмите! </ кнопка > </ дел > </ дел > |
div
div
button
Отвечать
Самый глубокий вложенный элемент, вызвавший событие, является целью события. Вы можете перестать булькать,event.stopPropagation
1 2 3 4 5 6 7 |
< div onclick =" console.log('div') " > < p onclick =" console.log('p') " > Кликните сюда! </ р > </ дел > |
p
div
div
p
p
div
Отвечать
Если мы нажмем p
, то увидим два лога: p
и div
. Во время распространения события есть 3 фазы: захват, цель и всплытие. По умолчанию обработчики событий выполняются в фазе всплытия (если не установлено useCapture
значение true
). Он идет от самого глубоко вложенного элемента наружу.
1 2 3 4 5 6 7 8 9 10 |
const person = { имя : 'Лидия' } ; function sayHi ( возраст ) { return ` ${ this . имя } равно ${ возрасту } ` ; } консоль . войти ( привет . звонок ( лицо , 21 ) ) ; консоль . бревно ( привет . связывать ( лицо , 21 ) ) ; |
undefined is 21
Lydia is 21
function
function
Lydia is 21
Lydia is 21
Lydia is 21
function
Отвечать
В обоих случаях мы можем передать объект, на который this
должно ссылаться ключевое слово. Однако .call
также выполняется немедленно !
.bind.
возвращает копию функции, но с привязанным контекстом! Он выполняется не сразу.
1 2 3 4 5 6 7 |
function sayHi ( ) { return ( ( ) => 0 ) ( ) ; } консоль . журнал ( typeof сказать Привет ( ) ) ; |
"object"
"number"
"function"
"undefined"
Отвечать
Функция sayHi
возвращает возвращаемое значение немедленно вызванного функционального выражения (IIFE). Эта функция вернула 0
тип "number"
.
К вашему сведению: есть только 7 встроенных типов: null
, undefined
, boolean
, number
, string
, object
, и symbol
. "function"
не является типом, так как функции являются объектами, он имеет тип "object"
.
1 2 3 4 5 6 7 8 |
0 ; новый номер ( 0 ) ; ( '' ) ; ( '' ) ; новое логическое значение ( ложь ) ; не определено ; |
0
,''
,undefined
0
, new Number(0)
, ''
,new Boolean(false)
,undefined
0
, ''
,new Boolean(false)
,undefined
Отвечать
Есть 8 ложных значений:
undefined
null
NaN
false
''
(пустой строки)0
-0
0n
(большое целое (0))Конструкторы функций вроде new Number
и new Boolean
правдивы.
1 2 3 |
консоль . журнал ( тип типа 1 ) ; |
"number"
"string"
"object"
"undefined"
Отвечать
typeof 1
возвращается "number"
. typeof "number"
возвращается"string"
1 2 3 4 5 |
константные числа = [ 1 , 2 , 3 ] ; числа [ 10 ] = 11 ; консоль . журнал ( числа ) ; |
[1, 2, 3, 7 x null, 11]
[1, 2, 3, 11]
[1, 2, 3, 7 x empty, 11]
SyntaxError
Отвечать
Когда вы устанавливаете значение для элемента в массиве, превышающее длину массива, JavaScript создает нечто, называемое «пустыми слотами». На самом деле они имеют значение undefined
, но вы увидите что-то вроде:
[1, 2, 3, 7 x empty, 11]
в зависимости от того, где вы его запускаете (он отличается для каждого браузера, узла и т. д.)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
( ( ) => { пусть x , y > ; try { throw new Error ( ) ; } catch ( x ) { ( x = 1 ) , ( y = 2 ) ; console .log ( x ) ; } console . log ( x ) ; консоль .журнал ( у ) } _ ; ) ( ) ; |
1
undefined
2
undefined
undefined
undefined
1
1
2
1
undefined
undefined
Отвечать
catch
Блок получает аргумент x
. Это не то же самое, x
что переменная при передаче аргументов. Эта переменная x
имеет блочную область видимости.
Позже мы устанавливаем эту блочную переменную равной 1
и устанавливаем значение переменной y
. Теперь мы регистрируем переменную блочной области видимости x
, которая равна 1
.
Вне catch
блока, x
по – прежнему undefined
, и y
это 2
. Когда мы хотим выйти console.log(x)
за пределы catch
блока, он возвращает undefined
и y
возвращает 2
.
Отвечать
В JavaScript есть только примитивные типы и объекты.
Примитивные типы: boolean
, null
, undefined
, bigint
, number
, string
, и symbol
.
Что отличает примитив от объекта, так это то, что у примитивов нет никаких свойств или методов; однако вы заметите, что это 'foo'.toUpperCase()
оценивает 'FOO'
и не приводит к TypeError
. Это связано с тем, что когда вы пытаетесь получить доступ к свойству или методу примитива, такого как строка, JavaScript неявно обертывает примитивный тип, используя один из классов-оболочек, т . е String
. , а затем сразу же отбрасывает оболочку после оценки выражения. Все примитивы, кроме null
и undefined
, демонстрируют это поведение.
1 2 3 4 5 6 7 8 |
[ [ 0 , 1 ] , [ 2 , 3 ] ] . уменьшите ( ( соотв , кур ) => { возврат согл . concat ( кур ) ; } , [ 1 , 2 ] , ) ; |
[0, 1, 2, 3, 1, 2]
[6, 1, 2]
[1, 2, 0, 1, 2, 3]
[1, 2, 6]
Отвечать
[1, 2]
наше начальное значение. Это значение, с которого мы начинаем, и значение самого первого acc
. Во время первого раунда acc
есть [1,2]
, и cur
есть [0, 1]
. Мы объединяем их, что приводит к [1, 2, 0, 1]
.
Тогда [1, 2, 0, 1]
есть acc
и [2, 3]
есть cur
. Соединяем их и получаем[1, 2, 0, 1, 2, 3]
1 2 3 4 5 |
! ! ноль ; ! ! '' ; ! ! 1 ; |
false
true
false
false
false
true
false
true
true
true
true
false
Отвечать
null
является ложным. !null
возвращается true
. !true
возвращается false
.
""
является ложным. !""
возвращается true
. !true
возвращается false
.
1
правдиво. !1
возвращается false
. !false
возвращается true
.
setInterval
метод возвращает в браузере?
1 2 3 |
setInterval ( ( ) => console.log ( ' Привет ' ) , 1000 ) ; |
undefined
Отвечать
Он возвращает уникальный идентификатор. Этот идентификатор можно использовать для очистки этого интервала с помощью clearInterval()
функции.
1 2 3 |
[ ... 'Лидия' ] ; |
["L", "y", "d", "i", "a"]
["Lydia"]
[[], "Lydia"]
[["L", "y", "d", "i", "a"]]
Отвечать
Строка является итерируемой. Оператор распространения сопоставляет каждый символ итерируемого объекта с одним элементом.
1 2 3 4 5 6 7 8 9 10 |
функция * генератор ( я ) { выход я ; выход я * 2 ; } const gen = генератор ( 10 ) ; консоль . журнал ( gen.next ( ) . value ) ; _ _ консоль . log ( gen.next ( ) . value ) ; _ _ |
[0, 10], [10, 20]
20, 20
10, 20
0, 10 and 10, 20
Отвечать
Обычные функции не могут быть остановлены на полпути после вызова. Однако функция генератора может быть «остановлена» на полпути, а затем продолжиться с того места, где она остановилась. Каждый раз, когда функция генератора встречает yield
ключевое слово, функция возвращает значение, указанное после него. Обратите внимание, что функция генератора в этом случае не возвращает значение, а возвращает значение.
Во-первых, мы инициализируем функцию генератора i
равным 10
. Мы вызываем функцию генератора, используя next()
метод. Первый раз, когда мы вызываем функцию генератора, i
равно 10
. Он встречает первое yield
ключевое слово: оно дает значение i
. Генератор теперь «приостановлен» и 10
регистрируется.
Затем мы снова вызываем функцию с помощью next()
метода. Он начинает продолжаться с того места, где остановился ранее, по-прежнему с i
равным 10
. Теперь он встречает следующее yield
ключевое слово и возвращает i * 2
. i
равно 10
, поэтому он возвращает 10 * 2
, то есть 20
. Это приводит к 10, 20
.
1 2 3 4 5 6 7 8 9 10 11 |
const firstPromise = новое обещание ( ( res , rej ) => { setTimeout ( res , 500 , 'один' ) ; } ) ; const secondPromise = новое обещание ( ( res , rej ) => { setTimeout ( res , 100 , 'two' ) ; } ) ; Обещание . раса ( [ firstPromise , второе обещание ] ) . затем ( res = > console .log ( res ) ) ; |
"one"
"two"
"two" "one"
"one" "two"
Отвечать
Когда мы передаем Promise.race
методу несколько обещаний, он разрешает/отклоняет первое обещание, которое разрешается/отклоняется. В setTimeout
метод мы передаем таймер: 500 мс для первого обещания ( firstPromise
) и 100 мс для второго обещания ( secondPromise
). Это означает, что secondPromise
сначала разрешается значение 'two'
. res
теперь содержит значение 'two'
, которое регистрируется.
1 2 3 4 5 6 7 |
пусть человек = { имя : 'Лидия' } ; константные члены = [ человек ] ; человек = ноль ; консоль . журнал ( участники ) ; |
null
[null]
[{}]
[{ name: "Lydia" }]
Отвечать
Сначала мы объявляем переменную person
со значением объекта, у которого есть name
свойство.
Затем мы объявляем переменную с именем members
. Мы устанавливаем первый элемент этого массива равным значению person
переменной. Объекты взаимодействуют по ссылке при установке их равными друг другу. Когда вы присваиваете ссылку из одной переменной другой, вы делаете копию этой ссылки. (обратите внимание, что у них разные ссылки!)
Затем мы устанавливаем переменную person
равной null
.
Мы изменяем только значение person
переменной, а не первый элемент в массиве, так как этот элемент имеет другую (скопированную) ссылку на объект. Первый элемент по members
-прежнему содержит ссылку на исходный объект. Когда мы регистрируем members
массив, первый элемент по-прежнему содержит значение объекта, которое регистрируется.
1 2 3 4 5 6 7 8 9 10 |
постоянный человек = { name : 'Lydia' , age : 21 , } ; for ( const item in person ) { console . журнал ( элемент ) ; } |
{ name: "Lydia" }, { age: 21 }
"name", "age"
"Lydia", 21
["name", "Lydia"], ["age", 21]
Отвечать
С помощью for-in
цикла мы можем перебирать ключи объектов, в данном случае name
и age
. Под капотом объектные ключи представляют собой строки (если они не являются символами). В каждом цикле мы устанавливаем значение, item
равное текущему ключу, по которому выполняется итерация. Во- первых, item
равно name
и регистрируется. Затем item
равно age
, что регистрируется.
1 2 3 |
консоль . журнал ( 3 + 4 + '5' ) ; |
"345"
"75"
12
"12"
Отвечать
Ассоциативность операторов — это порядок, в котором компилятор оценивает выражения слева направо или справа налево. Это происходит только в том случае, если все операторы имеют одинаковый приоритет. У нас есть только один тип оператора: +
. Кроме того, ассоциативность слева направо.
3 + 4
оценивается в первую очередь. В результате получается число 7
.
7 + '5'
получается "75"
из-за принуждения. JavaScript преобразует число 7
в строку, см. вопрос 15. Мы можем объединить две строки с помощью +
оператора. "7" + "5"
приводит к "75"
.
num
?
1 2 3 |
const num = parseInt ( '7*6' , 10 ) ; |
42
"42"
7
NaN
Отвечать
Возвращаются только первые числа в строке. На основе системы счисления (второй аргумент, чтобы указать, какой тип числа мы хотим разобрать: основание 10, шестнадцатеричное, восьмеричное, двоичное и т. д.) parseInt
проверяет, допустимы ли символы в строке. Как только он встречает символ, который не является допустимым числом в системе счисления, он прекращает синтаксический анализ и игнорирует следующие символы.
*
недействительный номер. Он только анализирует "7"
десятичный 7
. num
теперь имеет значение 7
.
1 2 3 4 5 6 |
[ 1 , 2 , 3 ] . map ( num => { if ( typeof num === 'number' ) return ; return num * 2 ; } ) ; |
[]
[null, null, null]
[undefined, undefined, undefined]
[ 3 x empty ]
Отвечать
При отображении массива значение num
равно элементу, который в данный момент зацикливается. В этом случае элементы являются числами, поэтому условие оператора if typeof num === "number"
возвращает true
. Функция карты создает новый массив и вставляет значения, возвращенные функцией.
Однако мы не возвращаем значение. Когда мы не возвращаем значение из функции, функция возвращает undefined
. Для каждого элемента массива вызывается функциональный блок, поэтому для каждого элемента мы возвращаем undefined
.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
функция getInfo ( член , год ) { член . имя = 'Лидия' ; год = '1998' ; } const person = { имя : 'Сара' } ; константный год рождения = '1997' ; getInfo ( человек ,год рождения ) ; консоль . журнал ( человек , год рождения ) ; |
{ name: "Lydia" }, "1997"
{ name: "Sarah" }, "1998"
{ name: "Lydia" }, "1998"
{ name: "Sarah" }, "1997"
Отвечать
Аргументы передаются по значению , если их значение не является объектом, то они передаются по ссылке . birthYear
передается по значению, так как это строка, а не объект. Когда мы передаем аргументы по значению, создается копия этого значения (см. вопрос 46).
Переменная birthYear
имеет ссылку на значение "1997"
. Аргумент year
также имеет ссылку на значение "1997"
, но это не то же самое значение, на birthYear
которое ссылается. Когда мы обновляем значение year
, устанавливая year
равным "1998"
, мы только обновляем значение year
. birthYear
по-прежнему равно "1997"
.
Значение person
является объектом. Аргумент member
имеет (скопированную) ссылку на тот же объект. Когда мы изменяем свойство объекта member
, на которое есть ссылка, значение person
также будет изменено, так как они оба имеют ссылку на один и тот же объект. person
свойство name
теперь равно значению"Lydia"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
function Greeting ( ) { throw 'Привет, мир!' ; } function sayHi ( ) { try { const data = Greeting ( ) ; консоль . log ( 'Это сработало!' , данные ) ; } поймать ( д ) { консоль . log ( 'О нет, ошибка:' , e ) ; } } привет ( ) ; |
It worked! Hello world!
Oh no an error: undefined
SyntaxError: can only throw Error objects
Oh no an error: Hello world!
Отвечать
С помощью throw
оператора мы можем создавать собственные ошибки. С помощью этого оператора вы можете генерировать исключения. Исключением может быть строка , число , логическое значение или объект . В данном случае нашим исключением является строка 'Hello world!'
.
С помощью оператора мы можем указать, что делать, если в блоке catch
возникает исключение . try
Выбрасывается исключение: строка 'Hello world!'
. e
теперь равен той строке, которую мы записываем. Это приводит к 'Oh an error: Hello world!'
.
1 2 3 4 5 6 7 8 9 |
функция автомобиля ( ) { это . сделать = 'Ламборгини' ; return { сделать : 'Мазерати' } ; } const myCar = новый автомобиль ( ) ; консоль . журнал ( моя машина . марка ) ; |
"Lamborghini"
"Maserati"
ReferenceError
TypeError
Отвечать
Когда вы возвращаете свойство, значение свойства равно возвращаемому значению, а не значению, заданному в функции-конструкторе. Мы возвращаем строку "Maserati"
, поэтому myCar.make
она равна "Maserati"
.
1 2 3 4 5 6 7 8 |
( ( ) => { пусть х = ( у = 10 ) ; } ) ( ) ; консоль . журнал ( тип х ) ; консоль . журнал ( тип y ) ; |
"undefined", "number"
"number", "number"
"object", "number"
"number", "undefined"
Отвечать
let x = (y = 10);
на самом деле является сокращением для:
1 2 3 4 |
у = 10 ; пусть х = у ; |
Когда мы устанавливаем y
равным 10
, мы фактически добавляем свойство y
к глобальному объекту ( window
в браузере, global
в узле). В браузере window.y
теперь равно 10
.
Затем мы объявляем переменную x
со значением y
, которое равно 10
. Переменные, объявленные с помощью let
ключевого слова, имеют область действия блока , они определены только в блоке, в котором они объявлены; немедленно вызываемое функциональное выражение (IIFE) в этом случае. Когда мы используем typeof
оператор, операнд x
не определен: мы пытаемся получить доступ x
за пределами блока, в котором он объявлен. Это означает, что x
он не определен. Значения, которым не было присвоено значение или объявлено, относятся к типу "undefined"
. console.log(typeof x)
возвращается "undefined"
.
Однако мы создали глобальную переменную y
при установке y
равной 10
. Это значение доступно в любом месте нашего кода. y
определено и содержит значение типа "number"
. console.log(typeof y)
возвращается "number"
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
класс Собака { конструктор ( имя ) { это . имя = имя ; } } Собака . прототип . кора = функция ( ) { консоль . log ( ` Гав, я $ { this.name } ` ) ; } ; const pet = новая собака ( "Мара" ) ; домашнее животное . кора ( ) ; удалить Собака . прототип . кора ; домашнее животное . кора ( ) ; |
"Woof I am Mara"
,TypeError
"Woof I am Mara"
,"Woof I am Mara"
"Woof I am Mara"
,undefined
TypeError
,TypeError
Отвечать
Мы можем удалять свойства объектов с помощью delete
ключевого слова, в том числе и на прототипе. При удалении свойства прототипа оно становится недоступным в цепочке прототипов. В этом случае bark
функция больше недоступна в прототипе после delete Dog.prototype.bark
, но мы все равно пытаемся получить к ней доступ.
Когда мы пытаемся вызвать что-то, что не является функцией, TypeError
выбрасывается a. В этом случае TypeError: pet.bark is not a function
, так как pet.bark
есть undefined
.
1 2 3 4 5 |
константный набор = новый набор ( [ 1 , 1 , 2 , 3 , 4 ] ) ; консоль . журнал ( набор ) ; |
[1, 1, 2, 3, 4]
[1, 2, 3, 4]
{1, 1, 2, 3, 4}
{1, 2, 3, 4}
Отвечать
Объект Set
представляет собой набор уникальных значений: значение может встречаться в наборе только один раз.
Мы передали итерируемый объект [1, 1, 2, 3, 4]
с повторяющимся значением 1
. Поскольку в наборе не может быть двух одинаковых значений, одно из них удаляется. Это приводит к {1, 2, 3, 4}
.
1 2 3 4 5 |
// counter.js пусть counter = 10 ; экспортировать счетчик по умолчанию ; |
1 2 3 4 5 6 7 8 |
// импорт index.js myCounter из './counter' ; мойСчетчик += 1 ; консоль . бревно ( мойСчетчик ) ; |
10
11
Error
NaN
Отвечать
Импортированный модуль доступен только для чтения : вы не можете изменить импортированный модуль. Только модуль, который их экспортирует, может изменить его значение.
Когда мы пытаемся увеличить значение myCounter
, выдается ошибка: myCounter
доступно только для чтения и не может быть изменено.
1 2 3 4 5 6 7 |
константное имя = 'Лидия' ; возраст = 21 ; консоль . журнал ( удалить имя ) ; консоль . журнал ( удалить возраст ) ; |
false
,true
"Lydia"
,21
true
,true
undefined
,undefined
Отвечать
Оператор delete
возвращает логическое значение: true
при успешном удалении, иначе он вернет false
. Однако переменные, объявленные с помощью ключевого слова var
, const
или , let
нельзя удалить с помощью delete
оператора.
Переменная name
была объявлена с const
ключевым словом, поэтому ее удаление не удалось: false
возвращается. Когда мы устанавливаем age
равным 21
, мы фактически добавляем свойство, вызываемое age
к глобальному объекту. Таким образом вы можете успешно удалять свойства объектов, а также глобальный объект, поэтому delete age
возвращает true
.
1 2 3 4 5 6 |
константные числа = [ 1 , 2 , 3 , 4 , 5 ] ; const [ y ] = числа ; консоль . журнал ( у ) ; |
[[1, 2, 3, 4, 5]]
[1, 2, 3, 4, 5]
1
[1]
Отвечать
Мы можем распаковывать значения из массивов или свойства из объектов посредством деструктурирования. Например:
1 2 3 |
[ а , б ] = [ 1 , 2 ] ; |
Значение a
сейчас 1
, а значение b
сейчас 2
. Что мы на самом деле сделали в вопросе, так это:
1 2 3 |
[ у ] = [ 1 , 2 , 3 , 4 , 5 ] ; |
Это означает, что значение y
равно первому значению в массиве, то есть числу 1
. Когда мы регистрируемся y
, 1
возвращается.
1 2 3 4 5 6 |
const user = { имя : 'Лидия' , возраст : 21 } ; const admin = { admin : true , ... user } ; консоль . журнал ( админ ) ; |
{ admin: true, user: { name: "Lydia", age: 21 } }
{ admin: true, name: "Lydia", age: 21 }
{ admin: true, user: ["Lydia", 21] }
{ admin: true }
Отвечать
Можно комбинировать объекты с помощью оператора распространения ...
. Он позволяет создавать копии пар ключ/значение одного объекта и добавлять их к другому объекту. В этом случае мы создаем копии user
объекта и добавляем их к admin
объекту. Теперь admin
объект содержит скопированные пары ключ/значение, в результате чего создается файл { admin: true, name: "Lydia", age: 21 }
.
1 2 3 4 5 6 7 8 |
const person = { имя : 'Лидия' } ; Объект . определить свойство ( человек , 'возраст' , { значение : 21 } ) ; консоль . журнал ( человек ) ; консоль . log ( Объект . ключи ( человек ) ) ; |
{ name: "Lydia", age: 21 }
,["name", "age"]
{ name: "Lydia", age: 21 }
,["name"]
{ name: "Lydia"}
,["name", "age"]
{ name: "Lydia"}
,["age"]
Отвечать
С помощью этого defineProperty
метода мы можем добавить к объекту новые свойства или изменить существующие. Когда мы добавляем свойство к объекту с помощью defineProperty
метода, они по умолчанию не являются перечисляемыми . Object.keys
Метод возвращает все перечисляемые имена свойств от объекта, только в этом случае "name"
.
Свойства, добавленные с помощью этого defineProperty
метода, по умолчанию являются неизменяемыми. Вы можете переопределить это поведение, используя свойства writable
, configurable
и enumerable
. Таким образом, defineProperty
метод дает вам намного больше контроля над свойствами, которые вы добавляете к объекту.
1 2 3 4 5 6 7 8 9 10 |
const settings = { имя пользователя : 'lydiahallie' , уровень : 19 , здоровье : 90 , } ; постоянные данные = JSON . stringify ( настройки , [ 'уровень' , 'здоровье' ] ) ; консоль . журнал ( данные ) ; |
"{"level":19, "health":90}"
"{"username": "lydiahallie"}"
"["level", "health"]"
"{"username": "lydiahallie", "level":19, "health":90}"
Отвечать
Второй аргумент JSON.stringify
— заменитель . Заменитель может быть либо функцией, либо массивом, и позволяет вам контролировать, какие и как значения должны быть преобразованы в строку.
Если заменитель является массивом , в строку JSON будут добавлены только имена свойств, включенных в массив. В этом случае исключаются только свойства с именами "level"
и . теперь равно ."health"
"username"
data
"{"level":19, "health":90}"
Если заменитель является функцией , эта функция вызывается для каждого свойства в объекте, который вы преобразуете в строку. Значение, возвращаемое этой функцией, будет значением свойства при его добавлении в строку JSON. Если значение равно undefined
, это свойство исключается из строки JSON.
1 2 3 4 5 6 7 8 9 10 11 12 |
пусть число = 10 ; const увеличитьЧисло = ( ) => число ++ ; const увеличитьPassedNumber = число => число ++ ; const num1 = увеличить число ( ) ; константа число2 = увеличение переданного числа ( число1 ) ; консоль . журнал ( число1 ) ; консоль . журнал ( число2 ) ; |
10
,10
10
,11
11
,11
11
,12
Отвечать
Унарный оператор ++
сначала возвращает значение операнда, а затем увеличивает значение операнда. Значение num1
равно 10
, так как increaseNumber
функция сначала возвращает значение num
, которое равно 10
, а затем только увеличивает значение num
.
num2
, 10
так как мы перешли num1
к increasePassedNumber
. number
равно 10
(значению num1
. Опять же, унарный оператор ++
сначала возвращает значение операнда, а затем увеличивает значение операнда. Значение number
равно 10
, поэтому num2
равно 10
.
1 2 3 4 5 6 7 8 9 10 11 12 |
константное значение = { число : 10 } ; const умножить = ( x = { ... значение } ) => { console . журнал ( ( х . число *= 2 ) ) ; } ; умножить ( ) ; умножить ( ) ; умножить ( значение ) ; умножить ( значение ) ; |
20
,40
,80
,160
20
, 40
,20
,40
20
, 20
,20
,40
NaN
, NaN
, 20
,40
Отвечать
В ES6 мы можем инициализировать параметры со значением по умолчанию. Значение параметра будет значением по умолчанию, если никакое другое значение не было передано в функцию или если значение параметра равно "undefined"
. В этом случае мы распространяем свойства value
объекта на новый объект, поэтому x
имеет значение по умолчанию { number: 10 }
.
Аргумент по умолчанию оценивается во время вызова ! Каждый раз, когда мы вызываем функцию, создается новый объект. Мы вызываем multiply
функцию первые два раза без передачи значения: x
имеет значение по умолчанию { number: 10 }
. Затем мы записываем умноженное значение этого числа, которое равно 20
.
В третий раз, когда мы вызываем умножение, мы передаем аргумент: вызываемый объект value
. На *=
самом деле этот оператор является сокращением x.number = x.number * 2
: мы изменяем значение x.number
и регистрируем умноженное значение 20
.
В четвертый раз мы value
снова передаем объект. x.number
ранее был изменен на 20
, поэтому x.number *= 2
журналы 40
.
1 2 3 |
[ 1 , 2 , 3 , 4 ] . уменьшить ( ( х , у ) => > console .log ( x , y ) ) ; |
1
2
и 3
3
и6
4
1
2
и 2
3
и3
4
1
undefined
и 2
undefined
и 3
undefined
и4
undefined
1
2
и undefined
3
иundefined
4
Отвечать
В данном случае первым аргументом, который reduce
получает метод, является аккумулятор . x
Второй аргумент – это текущее значение , y
. С помощью метода сокращения мы выполняем функцию обратного вызова для каждого элемента массива, что в конечном итоге может привести к одному единственному значению.
В этом примере мы не возвращаем никаких значений, мы просто регистрируем значения аккумулятора и текущее значение.
Значение аккумулятора равно ранее возвращенному значению функции обратного вызова. Если вы не передадите необязательный initialValue
аргумент reduce
методу, аккумулятор будет равен первому элементу при первом вызове.
При первом вызове аккумулятор ( x
) равен 1
, а текущее значение ( y
) равно 2
. Мы не возвращаемся из функции обратного вызова, мы регистрируем аккумулятор и текущее значение: 1
и 2
регистрируемся.
Если вы не возвращаете значение из функции, она возвращает undefined
. При следующем вызове аккумулятор равен undefined
, а текущее значение равно 3
. undefined
и 3
войти в систему.
При четвертом вызове мы снова не возвращаемся из функции обратного вызова. Аккумулятор снова равен undefined
, а текущее значение равно 4
. undefined
и 4
войти в систему.
Dog
класс?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
класс Собака { конструктор ( имя ) { это . имя = имя ; } } ; class Labrador extends Dog { // 1 конструктор ( имя , размер ) { this . размер = размер ; } // 2 конструктор ( имя , размер ) { super ( имя ) ; это . размер = размер ; } // 3 конструктор ( размер ) { супер ( имя ) ; этот .размер = размер ; } // 4 конструктор ( имя , размер ) { this . имя = имя ; это . размер = размер ; } } ; |
Отвечать
В производном классе вы не можете получить доступ к this
ключевому слову до вызова super
. Если вы попытаетесь это сделать, он выдаст ошибку ReferenceError: 1 и 4 выдаст ошибку ссылки.
С помощью super
ключевого слова мы вызываем конструктор этого родительского класса с заданными аргументами. Родительский конструктор получает name
аргумент, поэтому нам нужно перейти name
к super
.
Labrador
Класс принимает два аргумента, name
так как она проходит Dog
, и в size
качестве дополнительного имущества на Labrador
классе. Оба они должны быть переданы в функцию-конструктор на Labrador
, что правильно делается с помощью конструктора 2.
1 2 3 4 5 6 7 8 9 |
// консоль index.js . log ( 'запуск index.js' ) ; импортировать { sum } из './sum.js' ; консоль . журнал ( сумма ( 1 , 2 ) ) ; // консоль sum.js. log ( 'выполняется sum.js' ) ; экспортировать const sum = ( a , b ) => a + b ; |
running index.js
,running sum.js
,3
running sum.js
, running index.js
,3
running sum.js
, 3
,running index.js
running index.js
, undefined
,running sum.js
Отвечать
По import
ключевому слову все импортируемые модули предварительно анализируются . Это означает, что импортированные модули запускаются первыми , код в файле, который импортирует модуль, выполняется после .
В этом разница между require()
CommonJS и import
! С помощью require()
вы можете загружать зависимости по требованию во время выполнения кода. Если бы мы использовали require
вместо import
, running index.js
, running sum.js
, 3
то вошли бы в консоль.
1 2 3 4 5 |
консоль . журнал ( Число ( 2 ) === Число ( 2 ) ) ; консоль . log ( логическое значение ( ложь ) === логическое значение ( ложь ) ) ; консоль . log ( Символ ( 'foo' ) === Символ ( 'foo' ) ) ) ; |
true
,true
,false
false
, true
,false
true
, false
,true
true
, true
,true
Отвечать
Каждый символ полностью уникален. Назначение аргумента, передаваемого символу, состоит в том, чтобы дать символу описание. Значение Symbol не зависит от переданного аргумента. Проверяя равенство, мы создаем два совершенно новых символа: первый Symbol('foo')
и второй Symbol('foo')
. Эти два значения уникальны и не равны друг другу, Symbol('foo') === Symbol('foo')
возвращает false
.
1 2 3 4 |
const name = 'Лидия Халли' ; консоль . log ( имя.padStart ( 13 ) ) ; _ _ консоль . log ( имя.padStart ( 2 ) ) ; _ _ |
"Lydia Hallie"
,"Lydia Hallie"
" Lydia Hallie"
, " Lydia Hallie"
("[13x whitespace]Lydia Hallie"
, "[2x whitespace]Lydia Hallie"
)" Lydia Hallie"
, "Lydia Hallie"
("[1x whitespace]Lydia Hallie"
, "Lydia Hallie"
)"Lydia Hallie"
, "Lyd"
,Отвечать
С помощью padStart
метода мы можем добавить дополнение к началу строки. Значение, передаваемое этому методу, представляет собой общую длину строки вместе с дополнением. Строка "Lydia Hallie"
имеет длину 12
. name.padStart(13)
вставляет 1 пробел в начале строки, потому что 12 + 1 равно 13.
Если аргумент, переданный padStart
методу, меньше длины массива, заполнение добавляться не будет.
1 2 3 |
консоль . журнал ( '🥑' + '💻' ) ; |
"🥑💻"
257548
Отвечать
С помощью +
оператора вы можете конкатенировать строки. В этом случае мы объединяем строку "🥑"
со строкой "💻"
, в результате чего получается "🥑💻"
.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
function * startGame ( ) { const answer = yield 'Вы любите JavaScript?' ; if ( answer !== 'Да' ) { return "Ого... Думаю, мы ушли" ; } return 'JavaScript любит вас в ответ ❤️' ; } Const игра = StartGame ( ) ; консоль . журнал ( /* 1 */ ) ; // Вы любите JavaScript? консоль . журнал ( /* 2 */ ) ; // JavaScript любит вас в ответ ❤️ |
game.next("Yes").value
иgame.next().value
game.next.value("Yes")
иgame.next.value()
game.next().value
иgame.next("Yes").value
game.next.value()
иgame.next.value("Yes")
Отвечать
Генераторная функция «приостанавливает» свое выполнение, когда видит yield
ключевое слово. Во-первых, мы должны позволить функции выдать строку «Вы любите JavaScript?», что можно сделать, вызвав game.next().value
.
Каждая строка выполняется, пока не найдет первое yield
ключевое слово. В yield
первой строке функции есть ключевое слово: выполнение останавливается с первым выходом! Это означает, что переменная answer
еще не определена!
Когда мы вызываем game.next("Yes").value
, в данном случае предыдущее yield
заменяется значением параметров, переданных next()
функции "Yes"
. Теперь значение переменной answer
равно "Yes"
. Условие оператора if возвращает false
и JavaScript loves you back ❤️
регистрируется.
1 2 3 |
консоль . Журнал ( Строка . сырыми `Hello \ nworld` ) ; |
Hello world!
Hello
world
Hello\nworld
Hello\n
world
Отвечать
String.raw
возвращает строку, в которой escape-последовательности ( \n
, \v
, \t
и т. д.) игнорируются! Обратная косая черта может быть проблемой, так как вы можете получить что-то вроде:
const path =
C:\Documents\Projects\table.html
Что приведет к:
"C:DocumentsProjects able.html"
С String.raw
, он просто проигнорирует escape и напечатает:
C:\Documents\Projects\table.html
В данном случае это строка Hello\nworld
, которая регистрируется.
1 2 3 4 5 6 7 8 |
асинхронная функция getData ( ) { return await Promise . решить ( "Я сделал это!" ) ; } константные данные = getData ( ) ; консоль . журнал ( данные ) ; |
"I made it!"
Promise {<resolved>: "I made it!"}
Promise {<pending>}
undefined
Отвечать
Асинхронная функция всегда возвращает обещание. По- await
прежнему нужно дождаться разрешения промиса: ожидающий промис возвращается, когда мы вызываем getData()
, чтобы установить data
равный ему.
Если бы мы хотели получить доступ к разрешенному значению "I made it"
, мы могли бы использовать .then()
метод на data
:
data.then(res => console.log(res))
Это было бы зарегистрировано "I made it!"
1 2 3 4 5 6 7 8 |
функция addToList ( элемент , список ) { возвращаемый список . нажать ( предмет ) ; } const result = addToList ( 'яблоко' , [ 'банан' ] ) ; консоль . журнал ( результат ) ; |
['apple', 'banana']
2
true
undefined
Отвечать
Метод .push()
возвращает длину нового массива! Ранее массив содержал один элемент (строку "banana"
) и имел длину 1
. После добавления строки "apple"
в массив массив содержит два элемента и имеет длину 2
. Это возвращается из addToList
функции.
Метод push
изменяет исходный массив. Если вы хотели вернуть массив из функции, а не длину массива , вы должны были вернуться list
после нажатия item
на него.
1 2 3 4 5 6 7 8 9 10 |
константное поле = { х : 10 , у : 20 } ; Объект . заморозить ( коробку ) ; константа форма = коробка ; форма . х = 100 ; консоль . бревно ( форма ) ; |
{ x: 100, y: 20 }
{ x: 10, y: 20 }
{ x: 100 }
ReferenceError
Отвечать
Object.freeze
делает невозможным добавление, удаление или изменение свойств объекта (если только значение свойства не является другим объектом).
Когда мы создаем переменную shape
и устанавливаем ее равной замороженному объекту box
, shape
это также относится к замороженному объекту. Вы можете проверить, заморожен ли объект, используя Object.isFrozen
. В этом случае Object.isFrozen(shape)
возвращает true, так как переменная shape
имеет ссылку на замороженный объект.
Так shape
как заморожено и поскольку значение x
не является объектом, мы не можем изменить свойство x
. x
по-прежнему равно 10
и { x: 10, y: 20 }
регистрируется.
1 2 3 4 5 |
константа { имя : мое имя } = { имя : 'Лидия' } ; консоль . журнал ( имя ) ; |
"Lydia"
"myName"
undefined
ReferenceError
Отвечать
Когда мы распаковываем свойство name
из объекта в правой части, мы присваиваем его значение "Lydia"
переменной с именем myName
.
С помощью { name: myName }
мы сообщаем JavaScript, что хотим создать новую переменную myName
со значением name
свойства в правой части.
Поскольку мы пытаемся записать name
, переменная, которая не определена, undefined
возвращается в левом присваивании. Позже значение Lydia
сохраняется посредством присваивания деструктуризации.
1 2 3 4 5 |
сумма функций ( а , б ) { возврат а + б ; } |
Отвечать
Чистая функция — это функция, которая всегда возвращает один и тот же результат, если переданы одни и те же аргументы.
Функция sum
всегда возвращает один и тот же результат. Если мы передаем 1
и 2
, он всегда будет возвращаться 3
без побочных эффектов. Если мы передаем 5
и 10
, он всегда будет возвращаться 15
и так далее. Это определение чистой функции.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
константа добавить = ( ) => { const cache = { } ; return num => { if ( num in cache ) { return `Из кеша! ${ кеш [ число ] } ` ; } иначе { константный результат = число + 10 ; кэш [ число ] = результат ; вернуть `Рассчитано! ${результат} `; } }; }; константа addFunction = добавить ( ) ; консоль . журнал ( добавить функцию ( 10 ) ) ; консоль . журнал ( добавить функцию ( 10 ) ) ; консоль . журнал ( добавить функцию ( 5 * 2 ) ) ; |
Calculated! 20
Calculated! 20
Calculated! 20
Calculated! 20
From cache! 20
Calculated! 20
Calculated! 20
From cache! 20
From cache! 20
Calculated! 20
From cache! 20
Error
Отвечать
Функция add
является запоминаемой функцией. С помощью мемоизации мы можем кэшировать результаты функции, чтобы ускорить ее выполнение. В этом случае мы создаем cache
объект, в котором хранятся ранее возвращенные значения.
Если мы addFunction
снова вызовем функцию с тем же аргументом, она сначала проверит, не получила ли уже это значение в своем кеше. В этом случае будет возвращено значение caches, что сэкономит время выполнения. В противном случае, если он не кэширован, он вычислит значение и сохранит его впоследствии.
Мы вызываем addFunction
функцию три раза с одним и тем же значением: при первом вызове значение функции, когда num
оно равно, 10
еще не кэшируется. Условие оператора if num in cache
возвращает значение false
, и блок else выполняется: Calculated! 20
регистрируется, и значение результата добавляется в объект кеша. cache
теперь похоже { 10: 20 }
.
Во второй раз cache
объект содержит значение, которое возвращается для 10
. Условие оператора if num in cache
возвращает true
и 'From cache! 20'
регистрируется.
В третий раз мы переходим 5 * 2
к функции, которая оценивается как 10
. Объект cache
содержит значение, которое возвращается для 10
. Условие оператора if num in cache
возвращает true
и 'From cache! 20'
регистрируется.
1 2 3 4 5 6 7 8 9 10 11 |
const myLifeSummedUp = [ '☕' , '💻' , '🍷' , '🍫' ] ; for ( позволить элементу в myLifeSummedUp ) { console . журнал ( элемент ) ; } для ( пусть пункт из myLifeSummedUp ) { консоли . журнал ( элемент ) ; } |
0
1
2
3
и"☕"
"💻"
"🍷"
"🍫"
"☕"
"💻"
"🍷"
"🍫"
и"☕"
"💻"
"🍷"
"🍫"
"☕"
"💻"
"🍷"
"🍫"
и0
1
2
3
0
1
2
3
и{0: "☕", 1: "💻", 2: "🍷", 3: "🍫"}
Отвечать
С помощью цикла for-in мы можем перебирать перечисляемые свойства. В массиве перечисляемые свойства являются «ключами» элементов массива, которые на самом деле являются их индексами. Вы можете увидеть массив как:
{0: "☕", 1: "💻", 2: "🍷", 3: "🍫"}
Где ключи — перечисляемые свойства. 0
1
2
3
войти в систему.
С помощью цикла for-of мы можем перебирать итерируемые объекты . Массив является итерируемым. Когда мы перебираем массив, переменная «item» равна элементу, по которому он в данный момент перебирает, "☕"
"💻"
"🍷"
"🍫"
регистрируется.
1 2 3 |
список констант = [ 1 + 2 , 1 * 2 , 1/2 ] ; _ _ консоль . журнал ( список ) ; |
["1 + 2", "1 * 2", "1 / 2"]
["12", 2, 0.5]
[3, 2, 0.5]
[1, 1, 1]
Отвечать
Элементы массива могут содержать любое значение. Числа, строки, объекты, другие массивы, нулевые значения, логические значения, неопределенные и другие выражения, такие как даты, функции и вычисления.
Элемент будет равен возвращаемому значению. 1 + 2
возвращается 3
, 1 * 2
возвращается 2
и 1 / 2
возвращается 0.5
.
1 2 3 4 5 6 7 |
function sayHi ( name ) { return `Привет, ${ name } ` ; } консоль . журнал ( привет ( ) ) ; |
Hi there,
Hi there, undefined
Hi there, null
ReferenceError
Отвечать
По умолчанию аргументы имеют значение undefined
, если в функцию не было передано значение. В этом случае мы не передавали значение name
аргумента. name
равно тому, undefined
что регистрируется.
В ES6 мы можем перезаписать это undefined
значение по умолчанию параметрами по умолчанию. Например:
function sayHi(name = "Lydia") { ... }
В этом случае, если бы мы не передали значение или если бы мы передали undefined
, name
всегда было бы равно строкеLydia
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
вар статус = '😎' ; setTimeout ( ( ) => { const status = '😍' ; const data = { статус : '🥑' , getStatus ( ) { вернуть это . статус ; } , } ; консоль . журнал ( данные.getStatus ( ) ) ; _ _ консоль . log ( data.getStatus.call ( this ) ) ; _ _ _ _ } , 0 ) ; |
"🥑"
и"😍"
"🥑"
и"😎"
"😍"
и"😎"
"😎"
и"😎"
Отвечать
Значение this
ключевого слова зависит от того, где вы его используете. В методе , как и в getStatus
методе, this
ключевое слово относится к объекту, которому принадлежит метод . Метод принадлежит data
объекту, поэтому this
относится к data
объекту. Когда мы регистрируем this.status
, регистрируется status
свойство data
объекта, то есть "🥑"
.
С помощью call
метода мы можем изменить объект, к которому this
относится ключевое слово. В функциях ключевое слово this
относится к объекту, которому принадлежит функция . Мы объявили setTimeout
функцию для глобального объекта , поэтому внутри setTimeout
функции this
ключевое слово относится к глобальному объекту . В глобальном объекте есть переменная с именем status со значением "😎"
. При регистрации this.status
регистрируется "😎"
.
1 2 3 4 5 6 7 8 9 10 11 |
const person = { name : 'Lydia' , age : 21 , } ; пусть город = человек . город ; город = 'Амстердам' ; консоль . журнал ( человек ) ; |
{ name: "Lydia", age: 21 }
{ name: "Lydia", age: 21, city: "Amsterdam" }
{ name: "Lydia", age: 21, city: undefined }
"Amsterdam"
Отвечать
Мы устанавливаем переменную city
равной значению свойства, вызываемого city
у person
объекта. У этого объекта нет свойства с именем city
, поэтому переменная city
имеет значение undefined
.
Обратите внимание, что мы не ссылаемся на person
сам объект! Мы просто устанавливаем переменную city
равной текущему значению city
свойства person
объекта.
Затем мы устанавливаем city
равным строке "Amsterdam"
. Это не изменяет объект человека: на этот объект нет ссылки.
При регистрации person
объекта возвращается неизмененный объект.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
function checkAge ( age ) { if ( age < 18 ) { const message = "Извините, вы слишком молоды." ; } else { const message = "Ура! Ты достаточно взрослый!" ; } ответное сообщение ; } консоль . журнал ( checkAge ( 21 ) ) ; |
"Sorry, you're too young."
"Yay! You're old enough!"
ReferenceError
undefined
Отвечать
Переменные с ключевым словом const
and let
имеют блочную область видимости . Блок — это все, что заключено в фигурные скобки ( { }
). В этом случае фигурные скобки операторов if/else. Вы не можете ссылаться на переменную вне блока, в котором она объявлена, возникает ошибка ReferenceError.
1 2 3 4 5 |
выборка ( 'https://www.website.com/api/user/1' ) . затем ( res => res . json ( ) ) . затем ( Рез => консоль . журнал ( Рез ) ) ; |
fetch
метода.fetch
метода..then()
.Отвечать
Значение res
во втором .then
равно возвращаемому значению предыдущего .then
. Вы можете продолжать цепочку .then
s таким образом, где значение передается следующему обработчику.
hasName
равным true
, если вы не можете передать его true
в качестве аргумента?
1 2 3 4 5 |
функция getName ( имя ) { const hasName = // } |
!!name
name
new Boolean(name)
name.length
Отвечать
С помощью !!name
мы определяем, является ли значение name
истинным или ложным. Если имя истинно, что мы и хотим проверить, !name
возвращает false
. !false
(что !!name
практически и есть) возвращает true
.
Устанавливая hasName
равным name
, вы устанавливаете hasName
равным любому значению, которое вы передали getName
функции, а не логическому значению true
.
new Boolean(true)
возвращает оболочку объекта, а не само логическое значение.
name.length
возвращает длину переданного аргумента, а не является ли он true
.
1 2 3 |
консоль . log ( 'Я хочу пиццу' [ 0 ] ) ; |
"""
"I"
SyntaxError
undefined
Отвечать
Чтобы получить символ по определенному индексу строки, вы можете использовать запись в квадратных скобках. Первый символ в строке имеет индекс 0 и так далее. В данном случае мы хотим получить элемент с индексом 0, символ "I'
, который регистрируется.
Обратите внимание, что этот метод не поддерживается в IE7 и более ранних версиях. В таком случае используйте .charAt()
.
1 2 3 4 5 6 7 |
сумма функций ( число1 , число2 = число1 ) { console . журнал ( число1 + число2 ) ; } сумма ( 10 ) ; |
NaN
20
ReferenceError
undefined
Отвечать
Вы можете установить значение параметра по умолчанию равным другому параметру функции, если они были определены до параметра по умолчанию. Мы передаем значение 10
в sum
функцию. Если sum
функция получает только 1 аргумент, это означает, что значение for num2
не передается, и в этом случае значение num1
равно переданному значению 10
. Значением по умолчанию num2
является значение num1
, которое равно 10
. num1 + num2
возвращается 20
.
Если вы пытаетесь установить значение параметра по умолчанию, равное параметру, который определен после (справа), значение параметра еще не было инициализировано, что приведет к ошибке.
1 2 3 4 5 6 7 8 9 10 |
// module.js export default ( ) => 'Hello world' ; экспортировать константное имя = 'Лидия' ; // index.js импортирует * как данные из './module' ; консоль . журнал ( данные ) ; |
{ default: function default(), name: "Lydia" }
{ default: function default() }
{ default: "Hello world", name: "Lydia" }
module.js
Отвечать
С помощью import * as name
синтаксиса мы импортируем все экспорты из module.js
файла в index.js
файл по мере создания нового вызываемого объекта data
. В module.js
файле есть два экспорта: экспорт по умолчанию и именованный экспорт. Экспорт по умолчанию — это функция, возвращающая строку "Hello World"
, а именованный экспорт — это вызываемая переменная name
, которая имеет значение строки "Lydia"
.
У data
объекта есть default
свойство для экспорта по умолчанию, другие свойства имеют имена именованных экспортов и соответствующие им значения.
1 2 3 4 5 6 7 8 9 10 |
класс Person { конструктор ( имя ) { это . имя = имя ; } } const member = новый человек ( "Джон" ) ; консоль . журнал ( член типа ) ; |
"class"
"function"
"object"
"string"
Отвечать
Классы — это синтаксический сахар для конструкторов функций. Эквивалентом Person
класса в качестве конструктора функции будет:
1 2 3 4 5 |
функция Человек ( ) { это . имя = имя ; } |
Вызов конструктора функции с new
результатом создания экземпляра Person
ключевого typeof
слова возвращает "object"
для экземпляра. typeof member
возвращается "object"
.
1 2 3 4 5 |
пусть новый список = [ 1 , 2 , 3 ] . нажать ( 4 ) ; консоль . журнал ( новый список . push ( 5 ) ) ; |
[1, 2, 3, 4, 5]
[1, 2, 3, 5]
[1, 2, 3, 4]
Error
Отвечать
Метод .push
возвращает новую длину массива, а не сам массив! Устанавливая newList
равным [1, 2, 3].push(4)
, мы устанавливаем newList
равным новой длине массива: 4
.
Затем мы пытаемся использовать .push
метод на newList
. Поскольку newList
это числовое значение 4
, мы не можем использовать этот .push
метод: генерируется TypeError.
1 2 3 4 5 6 7 8 9 10 11 |
function giveLydiaPizza ( ) { return 'Вот пицца!' ; } const giveLydiaChocolate = ( ) => "Вот шоколад... а теперь иди уже в спортзал." ; консоль . журнал ( дать Лидии Пицце . прототип ) ; консоль . Журнал ( giveLydiaChocolate . прототип ) ; |
{ constructor: ...}
{ constructor: ...}
{}
{ constructor: ...}
{ constructor: ...}
{}
{ constructor: ...}
undefined
Отвечать
Обычные функции, такие как giveLydiaPizza
функция, имеют prototype
свойство, которое представляет собой объект (объект-прототип) со constructor
свойством. Однако стрелочные функции, такие как giveLydiaChocolate
function, не обладают этим prototype
свойством. undefined
возвращается при попытке доступа к prototype
свойству с помощью giveLydiaChocolate.prototype
.
1 2 3 4 5 6 7 8 9 10 |
const person = { name : 'Lydia' , age : 21 , } ; for ( const [ x , y ] of Object . entry ( person ) ) { console . журнал ( х , у ) ; } |
name
Lydia
иage
21
["name", "Lydia"]
и["age", 21]
["name", "age"]
иundefined
Error
Отвечать
Object.entries(person)
возвращает массив вложенных массивов, содержащих ключи и объекты:
[ [ 'name', 'Lydia' ], [ 'age', 21 ] ]
Используя for-of
цикл, мы можем перебирать каждый элемент массива, в данном случае подмассивы. Мы можем мгновенно деструктурировать подмассивы в цикле for-of, используя const [x, y]
. x
равен первому элементу в подмассиве, y
равен второму элементу в подмассиве.
Первый подмассив равен [ "name", "Lydia" ]
, x
равен "name"
и y
равен "Lydia"
, которые регистрируются. Второй подмассив равен [ "age", 21 ]
, x
равен "age"
и y
равен 21
, которые регистрируются.
1 2 3 4 5 6 7 |
функция getItems ( FruitList , ... аргументы , избранные фрукты ) { return [ ... список фруктов , ... аргументы , любимые фрукты ] } getItems ( [ "банан" , "яблоко" ] , "груша" , "апельсин" ) |
["banana", "apple", "pear", "orange"]
[["banana", "apple"], "pear", "orange"]
["banana", "apple", ["pear"], "orange"]
SyntaxError
Отвечать
...args
является параметром покоя. Значение остаточного параметра представляет собой массив, содержащий все оставшиеся аргументы, и может быть только последним параметром ! В этом примере параметр rest был вторым параметром. Это невозможно и вызовет синтаксическую ошибку.
1 2 3 4 5 6 7 |
function getItems ( fruitList , FavoriteFruit , ... args ) { return [ ... FruitList , ... args , FavoriteFruit ] ; } getItems ( [ 'банан' , 'яблоко' ] , 'груша' , 'апельсин' ) ; |
Приведенный выше пример работает. Это возвращает массив[ 'banana', 'apple', 'orange', 'pear' ]
1 2 3 4 5 6 7 8 9 10 11 |
function nums ( a , b ) { если ( a > b ) console . log ( 'a больше' ) ; иначе консоль .log ( 'b больше' ) ; вернуть а + б ; } консоль . лог ( НУМС ( 4 , 2 ) ) ; консоль . лог ( НУМС ( 1 , 2 ) ) ; |
a is bigger
, 6
и b is bigger
,3
a is bigger
, undefined
и b is bigger
,undefined
undefined
иundefined
SyntaxError
Отвечать
В JavaScript нам не нужно писать точку с запятой ( ;
) явно, однако движок JavaScript все равно добавляет их после операторов. Это называется автоматической вставкой точки с запятой . Оператор может, например, быть переменными или ключевыми словами, такими как throw
, return
, break
и т. д.
Здесь мы написали return
оператор и другое значение a + b
в новой строке . Однако, поскольку это новая строка, движок не знает, что это именно то значение, которое мы хотели вернуть. Вместо этого он автоматически добавил точку с запятой после return
. Вы могли видеть это как:
1 2 3 4 |
возврат ; а + б ; |
Это означает, что a + b
она никогда не будет достигнута, так как функция перестает работать после return
ключевого слова. Если значение не возвращается, как здесь, функция возвращает undefined
. if/else
Обратите внимание, что после операторов нет автоматической вставки !
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
класс Person { конструктор ( ) { это . имя = 'Лидия' ; } } Человек = класс AnotherPerson { конструктор ( ) { это . имя = 'Сара' ; } } ; константный член = новый человек ( ) ; консоль . журнал ( член . имя ) ; |
"Lydia"
"Sarah"
Error: cannot redeclare Person
SyntaxError
Отвечать
Мы можем установить классы равными другим конструкторам классов/функций. В этом случае примем Person
равным AnotherPerson
. Имя этого конструктора — Sarah
, поэтому свойство имени в новом Person
экземпляре member
— "Sarah"
.
1 2 3 4 5 6 7 8 |
const info = { [ Символ ( 'a' ) ] : 'b' , } ; консоль . журнал ( информация ) ; консоль . журнал ( Объект . ключи ( информация ) ) ; |
{Symbol('a'): 'b'}
и["{Symbol('a')"]
{}
и[]
{ a: "b" }
и["a"]
{Symbol('a'): 'b'}
и[]
Отвечать
Символ не является перечислимым . Метод Object.keys возвращает все перечисляемые ключевые свойства объекта. Символ не будет виден, и будет возвращен пустой массив. При регистрации всего объекта будут видны все свойства, даже неперечисляемые.
Это одно из многих качеств символа: помимо представления совершенно уникального значения (что предотвращает случайное столкновение имен объектов, например, при работе с двумя библиотеками, которые хотят добавить свойства к одному и тому же объекту), вы также можете «скрыть» свойства объектов таким образом (хотя и не полностью. Вы все еще можете получить доступ к символам, используя этот Object.getOwnPropertySymbols()
метод).
1 2 3 4 5 6 7 8 9 10 |
const getList = ( [ x , ... y ] ) => [ x , y ] const getUser = user => { name : user . имя , возраст : пользователь . возраст } const list = [ 1 , 2 , 3 , 4 ] const user = { имя : "Лидия" , возраст : 21 } консоль . log ( getList ( список ) ) консоль . журнал ( getUser ( пользователь ) ) |
[1, [2, 3, 4]]
иSyntaxError
[1, [2, 3, 4]]
и{ name: "Lydia", age: 21 }
[1, 2, 3, 4]
и{ name: "Lydia", age: 21 }
Error
и{ name: "Lydia", age: 21 }
Отвечать
В getList
качестве аргумента функция получает массив. Между скобками getList
функции мы сразу деструктурируем этот массив. Вы могли видеть это как:
[x, ...y] = [1, 2, 3, 4]
С помощью параметра rest ...y
мы помещаем все «оставшиеся» аргументы в массив. Остальные аргументы 2
, 3
и 4
в данном случае. Значение y
представляет собой массив, содержащий все остальные параметры. Значение x
равно 1
в этом случае, поэтому, когда мы регистрируем [x, y]
, [1, [2, 3, 4]]
регистрируется.
Функция getUser
получает объект. В стрелочных функциях нам не нужно писать фигурные скобки, если мы просто возвращаем одно значение. Однако, если вы хотите мгновенно вернуть объект из стрелочной функции, вы должны написать его между круглыми скобками, иначе все, что находится между двумя фигурными скобками, будет интерпретироваться как оператор блока. В этом случае код между фигурными скобками не является допустимым кодом JavaScript, поэтому SyntaxError
выбрасывается a.
Следующая функция вернула бы объект:
const getUser = user => ({ name: user.name, age: user.age })
1 2 3 4 5 |
константное имя = 'Лидия' ; консоль . журнал ( имя ( ) ) ; |
SyntaxError
ReferenceError
TypeError
undefined
Отвечать
Переменная name
содержит значение строки, которая не является функцией, поэтому не может вызываться.
TypeErrors возникает, когда значение не соответствует ожидаемому типу. Ожидается, что JavaScript name
будет функцией, поскольку мы пытаемся его вызвать. Однако это была строка, поэтому выдается ошибка TypeError: name не является функцией!
Синтаксические ошибки возникают, когда вы написали что-то, что не является допустимым JavaScript, например, когда вы написали слово return
как retrun
. ReferenceErrors возникает, когда JavaScript не может найти ссылку на значение, к которому вы пытаетесь получить доступ.
1 2 3 4 5 6 |
// 🎉✨ Это мой сотый вопрос! ✨🎉 const output = ` ${ [ ] && 'Im' } возможно! Вы должны ${ '' && `n't` } обратиться к терапевту после такого большого количества JavaScript lol` ; |
possible! You should see a therapist after so much JavaScript lol
Impossible! You should see a therapist after so much JavaScript lol
possible! You shouldn't see a therapist after so much JavaScript lol
Impossible! You shouldn't see a therapist after so much JavaScript lol
Отвечать
[]
является истинным значением. С &&
оператором правое значение будет возвращено, если левое значение является истинным значением. В этом случае левое значение []
является истинным значением, поэтому "Im'
возвращается.
""
является ложным значением. Если левое значение ложно, ничего не возвращается. n't
не возвращается.
1 2 3 4 5 6 7 |
константа один = ложь || { } || ноль ; константа два = ноль || ложно || '' ; константа три = [ ] || 0 || правда ; консоль . журнал ( раз , два , три ) ; |
false
null
[]
null
""
true
{}
""
[]
null
null
true
Отвечать
С помощью ||
оператора мы можем вернуть первый истинный операнд. Если все значения ложны, возвращается последний операнд.
(false || {} || null)
: пустой объект {}
является истинным значением. Это первое (и единственное) истинное значение, которое возвращается. one
равно {}
.
(null || false || "")
: все операнды являются ложными значениями. ""
Это означает, что возвращается последний операнд . two
равно ""
.
([] || 0 || "")
: пустой массив []
является истинным значением. Это первое истинное значение, которое возвращается. three
равно []
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
const myPromise = ( ) => Promise . разрешить ( "Я решил!" ) ; функция первая функция ( ) { мое обещание ( ) . затем ( res = > console .log ( res ) ) ; консоль . журнал ( "секунда" ) ; } асинхронная функция secondFunction ( ) { console . журнал ( ожидание myPromise ( ) ) ; консоль . журнал ( "секунда" ) ; } перваяФункция ( ) ; втораяФункция ( ) ; |
I have resolved!
, second
и I have resolved!
,second
second
, I have resolved!
и second
,I have resolved!
I have resolved!
, second
и second
,I have resolved!
second
, I have resolved!
и I have resolved!
,second
Отвечать
С обещанием мы в основном говорим, что я хочу выполнить эту функцию, но я пока отложу ее, пока она работает, так как это может занять некоторое время. Только когда определенное значение разрешено (или отклонено) и когда стек вызовов пуст, я хочу использовать это значение.
Мы можем получить это значение как с ключевым словом, так .then
и с await
ключевым словом в async
функции. Хотя мы можем получить значение обещания с помощью обоих .then
и await
, они работают немного по-разному.
В firstFunction
, мы (как бы) отложили функцию myPromise во время ее выполнения, но продолжили выполнение другого кода, как console.log('second')
в данном случае. Затем функция разрешилась со строкой I have resolved
, которая затем была зарегистрирована после того, как увидела, что стек вызовов пуст.
Используя ключевое слово await в secondFunction
, мы буквально приостанавливаем выполнение асинхронной функции до тех пор, пока значение не будет разрешено, прежде чем переходить к следующей строке.
Это означает, что он ждал myPromise
разрешения со значением I have resolved
, и только после того, как это произошло, мы перешли к следующей строке: second
got logged.
1 2 3 4 5 6 7 8 9 |
константный набор = новый набор ( ) ; установить . добавить ( 1 ) ; установить . добавить ( 'Лидия' ) ; установить . добавить ( { имя : 'Лидия' } ) ; for ( пусть элемент набора ) { console . _ журнал ( элемент + 2 ) ; } |
3
,NaN
,NaN
3
, 7
,NaN
3
, Lydia2
,[object Object]2
"12"
, Lydia2
,[object Object]2
Отвечать
+
Оператор не только используется для добавления числовых значений, но мы также можем использовать его для конкатенации строк. Всякий раз, когда движок JavaScript видит, что одно или несколько значений не являются числом, он преобразует число в строку.
Первый 1
— это числовое значение. 1 + 2
возвращает число 3.
Однако второй является строкой "Lydia"
. "Lydia"
является строкой и 2
является числом: 2
преобразуется в строку. "Lydia"
и "2"
объединяются, что приводит к строке "Lydia2"
.
{ name: "Lydia" }
является объектом. Ни число, ни объект не являются строками, поэтому они преобразуются в строки обоих. Всякий раз, когда мы преобразуем обычный объект в строку, он становится "[object Object]"
. "[object Object]"
в сочетании с "2"
становится "[object Object]2"
.
1 2 3 |
Обещание . решить ( 5 ) ; |
5
Promise {<pending>: 5}
Promise {<fulfilled>: 5}
Error
Отвечать
Мы можем передать любое значение, какое захотим Promise.resolve
, как обещание, так и не обещание. Сам метод возвращает обещание с разрешенным значением ( <fulfilled>
). Если вы передадите обычную функцию, это будет разрешенное обещание с обычным значением. Если вы передадите обещание, это будет разрешенное обещание с разрешенным значением этого переданного обещания.
В данном случае мы просто передали числовое значение 5
. Он возвращает разрешенное обещание со значением 5
.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
function compareMembers ( person1 , person2 = person ) { if ( person1 !== person2 ) { console . log ( 'Не то же самое!' ) ; } еще { консоль . log ( 'Они одинаковы!' ) ; } } const person = { имя : 'Лидия' } ; сравнение участников ( человек ) ; |
Not the same!
They are the same!
ReferenceError
SyntaxError
Отвечать
Объекты передаются по ссылке. Когда мы проверяем объекты на строгое равенство ( ===
), мы сравниваем их ссылки.
Мы устанавливаем значение по умолчанию для person2
равного person
объекту и передаем person
объект в качестве значения для person1
.
Это означает, что оба значения ссылаются на одно и то же место в памяти, поэтому они равны.
Блок кода в else
операторе запускается и They are the same!
регистрируется.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
const colorConfig = { красный : истина , синий : ложь , зеленый : истина , черный : истина , желтый : ложь , } ; const colors = [ 'розовый' , 'красный' , 'синий' ] ; консоль . log ( colorConfig.colors [ 1 ] ) ; _ _ |
true
false
undefined
TypeError
Отвечать
В JavaScript у нас есть два способа доступа к свойствам объекта: запись в квадратных скобках или запись через точку. В этом примере мы используем запись через точку ( colorConfig.colors
) вместо записи в скобках ( colorConfig["colors"]
).
С точечной нотацией JavaScript пытается найти свойство объекта с точным именем. В этом примере JavaScript пытается найти свойство, вызываемое colors
у colorConfig
объекта. Свойство не вызывается colors
, поэтому возвращается undefined
. Затем мы пытаемся получить доступ к значению первого элемента, используя [1]
. Мы не можем сделать это со значением, равным undefined
, поэтому выдается TypeError
: Cannot read property '1' of undefined
.
JavaScript интерпретирует (или распаковывает) операторы. Когда мы используем скобочную нотацию, она видит первую открывающую скобку [
и продолжает работать, пока не найдет закрывающую скобку ]
. Только тогда он будет оценивать заявление. Если бы мы использовали colorConfig[colors[1]]
, он вернул бы значение red
свойства colorConfig
объекта.
1 2 3 |
консоль . журнал ( '❤️' === '❤️' ) ; |
true
false
Отвечать
Под капотом смайлики — это юникоды. Юникод для эмодзи сердца: "U+2764 U+FE0F"
. Они всегда одинаковы для одних и тех же эмодзи, поэтому мы сравниваем две равные строки друг с другом, что возвращает true.
1 2 3 4 5 6 7 8 9 10 |
const emojis = [ '✨' , '🥑' , '😍' ] ; смайлики . карта ( х => х + '✨' ) ; смайлики . фильтр ( x => x !== '🥑' ) ; смайлики . найти ( х => х !== '🥑' ) ; смайлики . уменьшить ( ( акк , кур ) => акк + '✨' ) ; смайлики . срез ( 1 , 2 , '✨') ; смайлики . соединение ( 1 , 2 , '✨' ) ; |
All of them
map
reduce
slice
splice
map
slice
splice
splice
Отвечать
С помощью splice
метода мы изменяем исходный массив, удаляя, заменяя или добавляя элементы. В этом случае мы удалили 2 элемента из индекса 1 (мы удалили '🥑'
и '😍'
) и добавили вместо смайликов.
map
и возвращает новый массив, возвращает элемент и filter
возвращает уменьшенное значение.slice
find
reduce
1 2 3 4 5 6 7 8 |
постоянная еда = [ '🍕' , '🍫' , '🥑' , '🍔' ] ; const info = { фаворитная еда : еда [ 0 ] } ; информация . избранноеЕда = '🍝' ; консоль . бревно ( еда ) ; |
['🍕', '🍫', '🥑', '🍔']
['🍝', '🍫', '🥑', '🍔']
['🍝', '🍕', '🍫', '🥑', '🍔']
ReferenceError
Отвечать
Мы устанавливаем значение favoriteFood
свойства info
объекта равным строке с эмодзи пиццы, '🍕'
. Строка — это примитивный тип данных. В JavaScript примитивные типы данных не взаимодействуют по ссылке.
В JavaScript примитивные типы данных (все, что не является объектом) взаимодействуют по значению . В этом случае мы устанавливаем значение favoriteFood
свойства info
объекта равным значению первого элемента в food
массиве, в данном случае строке с эмодзи пиццы ( '🍕'
). Строка является примитивным типом данных и взаимодействует по значению (см. мой блог , если вам интересно узнать больше)
Затем мы меняем значение favoriteFood
свойства info
объекта. Массив food
не изменился, так как значение favoriteFood
было просто копией значения первого элемента в массиве и не имеет ссылки на то же место в памяти, что и элемент в food[0]
. Когда мы записываем food, это все еще исходный массив ['🍕', '🍫', '🥑', '🍔']
.
1 2 3 |
JSON . разобрать ( ) ; |
Отвечать
С помощью этого JSON.parse()
метода мы можем преобразовать строку JSON в значение JavaScript.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// Строковое преобразование числа в действительный JSON, затем преобразование строки JSON в значение JavaScript: const jsonNumber = JSON . упорядочить ( 4 ) ; // '4' JSON . разобрать ( jsonNumber ) ; // 4 // Строковое преобразование значения массива в действительный JSON, затем преобразование строки JSON в значение JavaScript: const jsonArray = JSON . Строка ( [ 1 , 2 , 3 ] ) ; // '[1, 2, 3]' JSON . разобрать ( jsonArray ) ; // [1, 2, 3] // Строковое преобразование объекта в действительный JSON, затем преобразование строки JSON в значение JavaScript: const jsonArray = JSON . stringify ( { имя : 'Лидия' } ) ; // '{"имя":"Лидия"}' JSON . разобрать ( jsonArray ) ; // {имя: 'Лидия' } |
1 2 3 4 5 6 7 8 9 10 |
пусть имя = 'Лидия' ; функция getName ( ) { console . журнал ( имя ) ; пусть имя = 'Сара' ; } получитьИмя ( ) ; |
undefined
ReferenceError
Отвечать
Каждая функция имеет свой собственный контекст выполнения (или область видимости ). Функция getName
сначала просматривает свой собственный контекст (область действия), чтобы увидеть, содержит ли он переменную , к которой name
мы пытаемся получить доступ. В этом случае getName
функция содержит свою собственную name
переменную: мы объявляем переменную name
с let
ключевым словом и со значением 'Sarah'
.
Переменные с let
ключевым словом (и const
) поднимаются, но, в отличие от var
, не инициализируются . Они недоступны до строки, в которой мы их объявляем (инициализируем). Это называется «временной мертвой зоной». Когда мы пытаемся получить доступ к переменным до их объявления, JavaScript выдает ReferenceError
.
Если бы мы не объявили name
переменную внутри getName
функции, движок javascript просмотрел бы цепочку областей видимости . Во внешней области есть переменная, вызываемая name
со значением Lydia
. В этом случае он был бы зарегистрирован Lydia
.
1 2 3 4 5 6 7 8 9 |
пусть имя = 'Лидия' ; функция getName ( ) { console . журнал ( имя ) ; } получитьИмя ( ) ; // Лидия |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
function * generatorOne ( ) { yield [ 'a' , 'b' , 'c' ] ; } function * generatorTwo ( ) { yield * [ 'a' , 'b' , 'c' ] ; } const один = генераторОдин ( ) ; const два = генераторДва ( ) ; консоль . log ( один.следующий ( ) . значение ) ; _ _ консоль . журнал ( два . след ( ) . значение ) ; |
a
иa
a
иundefined
['a', 'b', 'c']
иa
a
и['a', 'b', 'c']
Отвечать
С помощью yield
ключевого слова мы получаем yield
значения в функции-генераторе. С помощью yield*
ключевого слова мы можем получить значения из другой функции-генератора или итерируемого объекта (например, массива).
В generatorOne
, мы получаем весь массив, ['a', 'b', 'c']
используя yield
ключевое слово. Значение value
свойства объекта, возвращаемого next
методом on one
( one.next().value
), равно всему массиву ['a', 'b', 'c']
.
1 2 3 |
консоль . log ( один.следующий ( ) . значение ) ; _ _ // ['a', 'b', 'c'] консоль . log ( один.следующий ( ) . значение ) ; _ _ // неопределенный |
В generatorTwo
, мы используем yield*
ключевое слово. Это означает, что первое полученное значение two
равно первому полученному значению в итераторе. Итератор — это массив ['a', 'b', 'c']
. Первое полученное значение равно a
, поэтому при первом вызове two.next().value
возвращается a
.
1 2 3 4 5 6 |
консоль . журнал ( два . след ( ) . значение ) ; // 'a' консоль . журнал ( два . след ( ) . значение ) ; // 'b' консоль . журнал ( два . след ( ) . значение ) ; // 'c' консоль . журнал ( два . след ( ) . значение ) ; // неопределенный |
1 2 3 |
консоль . log ( ` ${ ( x => x ) ( 'Я люблю' ) } в программу` ) ; |
I love to program
undefined to program
${(x => x)('I love') to program
TypeError
Отвечать
Выражения в литералах шаблона оцениваются в первую очередь. Это означает, что строка будет содержать возвращаемое значение выражения, (x => x)('I love')
в данном случае немедленно вызванную функцию. Мы передаем значение 'I love'
в качестве аргумента x => x
стрелочной функции. x
равно 'I love'
, которое возвращается. Это приводит к I love to program
.
1 2 3 4 5 6 7 8 9 |
let config = { alert : setInterval ( ( ) => { console .log ( ' Alert !' ) ; } , 1000 ) , } ; конфигурация = ноль ; |
setInterval
Обратный вызов не будет вызванsetInterval
обратный вызов вызывается один разsetInterval
Обратный вызов по-прежнему будет вызываться каждую секундуconfig.alert()
, конфигnull
Отвечать
Обычно, когда мы устанавливаем объекты равными null
, эти объекты удаляются сборщиком мусора , поскольку на этот объект больше нет ссылок. Однако, поскольку функция обратного вызова внутри setInterval
является функцией стрелки (таким образом привязанной к config
объекту), функция обратного вызова по-прежнему содержит ссылку на config
объект. Пока есть ссылка, объект не будет собирать мусор. Поскольку это интервал, установка или -ing не приведет config
к сборке мусора интервала, поэтому интервал все равно будет вызываться. Его следует очистить с помощью , чтобы удалить его из памяти. Поскольку он не был очищен, функция обратного вызова по-прежнему будет вызываться каждые 1000 мс (1 с).null
delete
config.alert
clearInterval(config.alert)
setInterval
'Hello world!'
?
1 2 3 4 5 6 7 8 9 10 11 12 13 |
const myMap = новая карта ( ) ; const myFunc = ( ) => 'приветствие' ; моя карта . set ( myFunc , 'Привет, мир!' ) ; //1 моя карта . получить ( «приветствие» ) ; //2 моя карта . получить ( myFunc ) ; //3 моя карта . получить ( ( ) => 'приветствие' ) ; |
Отвечать
При добавлении пары ключ/значение с помощью set
метода ключом будет значение первого аргумента, переданного set
функции, а значением будет второй аргумент, переданный set
функции. В данном случае ключ — это функция () => 'greeting'
, а значение — 'Hello world'
. myMap
сейчас { () => 'greeting' => 'Hello world!' }
.
1 неверно, так как ключ не 'greeting'
но () => 'greeting'
. 3 неверно, так как мы создаем новую функцию, передавая ее в качестве параметра get
методу. Объект взаимодействует по ссылке . Функции — это объекты, поэтому две функции никогда не бывают строго равными, даже если они идентичны: они имеют ссылку на другое место в памяти.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
const person = { name : 'Lydia' , age : 21 , } ; const changeAge = ( x = { ... человек } ) => ( x . age += 1 ) ; const changeAgeAndName = ( x = { ... человек } ) => { x . возраст += 1 ; х . имя = 'Сара' ; } ; changeAge ( человек ) ; изменитьВозрастИИмя ( ) ; консоль . журнал ( человек ) ; |
{name: "Sarah", age: 22}
{name: "Sarah", age: 23}
{name: "Lydia", age: 22}
{name: "Lydia", age: 23}
Отвечать
Обе функции changeAge
и changeAgeAndName
имеют параметр по умолчанию, а именно вновь созданный объект { ...person }
. Этот объект имеет копии всех ключей/значений в person
объекте.
Сначала мы вызываем changeAge
функцию и передаем person
объект в качестве ее аргумента. Эта функция увеличивает значение age
свойства на 1. person
is now { name: "Lydia", age: 22 }
.
Затем мы вызываем changeAgeAndName
функцию, но не передаем параметр. Вместо этого значение x
равно новому объекту: { ...person }
. Поскольку это новый объект, он не влияет на значения свойств person
объекта. person
по-прежнему равно { name: "Lydia", age: 22 }
.
6
?
1 2 3 4 5 |
function sumValues ( x , y , z ) { return x + y + z ; } |
sumValues([...1, 2, 3])
sumValues([...[1, 2, 3]])
sumValues(...[1, 2, 3])
sumValues([1, 2, 3])
Отвечать
С помощью оператора распространения ...
мы можем распространять итерации на отдельные элементы. Функция sumValues
получает три аргумента: x
, y
и z
. ...[1, 2, 3]
приведет к 1, 2, 3
, который мы передаем в sumValues
функцию.
1 2 3 4 5 6 |
пусть число = 1 ; const list = [ '🥳' , '🤠' , '🥰' , '🤪' ] ; консоль . журнал ( список [ ( число += 1 ) ] ) ; |
🤠
🥰
SyntaxError
ReferenceError
Отвечать
С помощью +=
операнда мы увеличиваем значение num
на 1
. num
имел начальное значение 1
, так 1 + 1
что 2
. Элемент по второму индексу в list
массиве,
console.log(list[2])
печатает.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
const person = { firstName : 'Лидия' , lastName : 'Hallie' , pet : { name : 'Мара' , порода : 'Голландская тюльпановая гончая' , } , getFullName ( ) { return ` ${ this . имя } ${ это . фамилия } ` ; } , } ; консоль . журнал ( человек . питомец ?. имя ) ; консоль . журнал ( человек . домашнее животное ?. семья ?. имя ) ; консоль . журнал ( человек.getFullName ? . ( ) ) ; _ консоль . log ( член.getLastName ? . ( ) ) ; _ |
undefined
undefined
undefined
undefined
Mara
undefined
Lydia Hallie
ReferenceError
Mara
null
Lydia Hallie
null
null
ReferenceError
null
ReferenceError
Отвечать
С необязательным оператором цепочки ?.
нам больше не нужно явно проверять, допустимы ли более глубокие вложенные значения. Если мы пытаемся получить доступ к свойству значения undefined
или null
( nullish ), выражение замыкается и возвращает значение undefined
.
person.pet?.name
: person
имеет свойство с именем pet
: person.pet
не является нулевым. У него есть свойство с именем name
, и оно возвращает Mara
. person.pet?.family?.name
: person
имеет свойство с именем pet
: person.pet
не является нулевым. pet
не имеет свойства с именем family
, person.pet.family
является нулевым. Выражение возвращает undefined
. person.getFullName?.()
: person
имеет свойство с именем getFullName
: person.getFullName()
не является нулевым и может вызываться, что возвращает Lydia Hallie
. member.getLastName?.()
: переменная member
не существует, поэтому ReferenceError
выбрасывается!
1 2 3 4 5 6 7 8 9 |
const groceries = [ 'банан' , 'яблоко' , 'арахис' ] ; if ( бакалея . indexOf ( 'банан' ) ) { console . log ( 'Мы должны купить бананы!' ) ; } еще { консоль . log ( `Нам не нужно покупать бананы!` ) ; } |
undefined
1
Отвечать
Мы передали условие groceries.indexOf("banana")
в оператор if. groceries.indexOf("banana")
возвращает 0
, что является ложным значением. Поскольку условие в операторе if ложно, код в else
блоке выполняется и We don't have to buy bananas!
регистрируется.
1 2 3 4 5 6 7 8 9 10 |
const config = { языки : [ ] , установить язык ( язык ) { вернуть это .языки . нажать ( язык ) ; } , } ; консоль . лог ( конфиг . язык ) ; |
function language(lang) { this.languages.push(lang }
0
[]
undefined
Отвечать
Метод language
представляет собой setter
. Сеттеры не хранят фактическое значение, их цель – изменить свойства. При вызове setter
метода undefined
возвращается.
1 2 3 4 5 6 |
const name = 'Лидия Халли' ; консоль . log ( ! typeof name === 'object' ) ; консоль . log ( ! typeof name === 'string' ) ; |
false
true
true
false
false
false
true
true
Отвечать
typeof name
возвращается "string"
. Строка "string"
является истинным значением, поэтому !typeof name
возвращает логическое значение false
. false === "object"
и false === "string"
оба возвращаются false
.
(Если бы мы хотели проверить, был ли тип (не)равным определенному типу, мы должны были написать !==
вместо !typeof
)
1 2 3 4 5 6 7 8 |
const add = x => y => z => { console . журнал ( х , у , г ) ; вернуть х + у + г ; } ; добавить ( 4 ) ( 5 ) ( 6 ) ; |
4
5
6
6
5
4
4
function
function
undefined
undefined
6
Отвечать
Функция add
возвращает стрелочную функцию, которая возвращает стрелочную функцию, которая возвращает стрелочную функцию (все еще со мной?). Первая функция получает аргумент x
со значением 4
. Мы вызываем вторую функцию, которая получает аргумент y
со значением 5
. Затем мы вызываем третью функцию, которая получает аргумент z
со значением 6
. Когда мы пытаемся получить доступ к значению x
и y
в z
последней функции стрелки, движок JS поднимается по цепочке областей видимости, чтобы найти значения для x
и y
соответственно. Это возвращает 4
5
6
.
1 2 3 4 5 6 7 8 9 10 11 12 |
асинхронная функция * диапазон ( начало , конец ) { for ( пусть я = начало ; я <= конец ; я ++ ) { yield Promise . решить ( я ) ; } } ( async ( ) = > { const gen = range ( 1 , 3 ) ; for await ( const item of gen ) { console .log ( item ) ; } } ) ( ) ; |
Promise {1}
Promise {2}
Promise {3}
Promise {<pending>}
Promise {<pending>}
Promise {<pending>}
1
2
3
undefined
undefined
undefined
Отвечать
Функция генератора range
возвращает асинхронный объект с обещаниями для каждого элемента в диапазоне, который мы передаем: Promise{1}
, Promise{2}
, Promise{3}
. Мы устанавливаем переменную gen
равной асинхронному объекту, после чего перебираем его с помощью for await ... of
цикла. Мы устанавливаем переменную item
равной возвращаемым значениям Promise: сначала Promise{1}
, затем Promise{2}
, затем Promise{3}
. Поскольку мы ожидаем значения item
, разрешенного промиса, возвращаются разрешенные значения промисов: 1
, 2
, затем 3
.
1 2 3 4 5 6 7 |
const myFunc = ( { x , y , z } ) => { console . журнал ( х , у , г ) ; } ; моя функция ( 1 , 2 , 3 ) ; |
1
2
3
{1: 1}
{2: 2}
{3: 3}
{ 1: undefined }
undefined
undefined
undefined
undefined
undefined
Отвечать
myFunc
ожидает объект со свойствами x
и y
в z
качестве аргумента. Поскольку мы передаем только три отдельных числовых значения (1, 2, 3) вместо одного объекта со свойствами и x
( {x: 1, y: 2, z: 3}), и имеют значение по умолчанию .y
z
x
y
z
undefined
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
function getFine ( скорость , количество ) { const formattedSpeed = new Intl . NumberFormat ( 'en-US' , { стиль : 'единица' , единица измерения : 'миля в час' } ) . формат ( скорость ) ; const formattedAmount = новый Intl . NumberFormat ( 'en-US' , { стиль : 'валюта' , валюта : 'доллар США' } ) . формат ( количество ) ; return `Водитель проехал ${ formatedSpeed } и должен заплатить ${ formatedAmount } ` ; } консоль . журнал ( getFine ( 130 , 300 ) ) |
Отвечать
С помощью этого Intl.NumberFormat
метода мы можем форматировать числовые значения для любой локали. Мы форматируем числовое значение 130
для en-US
языкового стандарта как unit
in mile-per-hour
, что приводит к 130 mph
. Числовое значение 300
языкового en-US
стандарта в виде currency
in USD
приводит к $300.00
.
1 2 3 4 5 6 |
const spookyItems = [ '👻' , '🎃' , '🕸' ] ; ( { пункт : spookyItems [ 3 ] } = { элемент : '💀' } ) ; консоль . журнал ( жуткие предметы ) ; |
["👻", "🎃", "🕸"]
["👻", "🎃", "🕸", "💀"]
["👻", "🎃", "🕸", { item: "💀" }]
["👻", "🎃", "🕸", "[object Object]"]
Отвечать
Деструктурируя объекты, мы можем распаковать значения из правого объекта и присвоить неупакованное значение значению того же имени свойства в левом объекте. В этом случае мы присваиваем значение “” на
spookyItems[3]
. Это означает, что мы изменяем spookyItems
массив, мы добавляем “” к нему. При регистрации
spookyItems
регистрируется ["👻", "🎃", "🕸", "💀"]
.
1 2 3 4 5 6 7 8 9 10 |
const name = 'Лидия Халли' ; постоянный возраст = 21 ; консоль . log ( Число.isNaN ( имя ) ) ; _ _ консоль . log ( Число.isNaN ( возраст ) ) ; _ _ консоль . журнал ( isNaN ( имя ) ) ; консоль . log ( isNaN ( возраст ) ) ; |
true
false
true
false
true
false
false
false
false
false
true
false
false
true
false
true
Отвечать
С помощью этого Number.isNaN
метода вы можете проверить, является ли переданное вами значение числовым значением и равным NaN
. name
не является числовым значением, поэтому Number.isNaN(name)
возвращает false
. age
является числовым значением, но не равно NaN
, поэтому Number.isNaN(age)
возвращает false
.
С помощью этого isNaN
метода вы можете проверить, не является ли переданное вами значение числом. name
не является числом, поэтому isNaN(name)
возвращает true. age
является числом, поэтому isNaN(age)
возвращает false
.
1 2 3 4 5 6 7 8 9 10 |
константное случайное значение = 21 ; функция getInfo ( ) { консоль . журнал ( тип случайного значения ) ; const randomValue = 'Лидия Холли' ; } получитьинформацию ( ) ; |
"number"
"string"
undefined
ReferenceError
Отвечать
На переменные, объявленные с помощью const
ключевого слова, нельзя ссылаться до их инициализации: это называется временной мертвой зоной . В getInfo
функции переменная randomValue
ограничена функциональной областью getInfo
. В строке, где мы хотим зарегистрировать значение typeof randomValue
, переменная randomValue
еще не инициализирована: выдается a ReferenceError
! Движок не спускался по цепочке областей видимости, так как мы объявили переменную randomValue
в getInfo
функции.
1 2 3 4 5 6 7 |
const myPromise = Обещание . resolve ( 'Вау, классные данные' ) ; ( async ( ) => { try { console .log ( await myPromise ) ; } catch { throw new Error ( `Ой, не сработало` ) ] } finally { console .log ( ' О , наконец!' ) ; } } ) ( ) ; |
Woah some cool data
Oh finally!
Woah some cool data
Oh finally!
Oops didn't work
Oh finally!
Отвечать
В try
блоке мы записываем ожидаемое значение myPromise
переменной: "Woah some cool data"
. Поскольку в блоке не возникало ошибок try
, код в catch
блоке не запускается. Код в finally
блоке всегда запускается, "Oh finally!"
регистрируется.
1 2 3 4 5 |
const emojis = [ '🥑' , [ '✨' , '✨' , [ '🍕' , '🍕' ] ] ] ; консоль . журнал ( смайлики . плоский ( 1 ) ) ; |
['🥑', ['✨', '✨', ['🍕', '🍕']]]
['🥑', '✨', '✨', ['🍕', '🍕']]
['🥑', ['✨', '✨', '🍕', '🍕']]
['🥑', '✨', '✨', '🍕', '🍕']
Отвечать
С помощью этого flat
метода мы можем создать новый сглаженный массив. Глубина сглаженного массива зависит от значения, которое мы передаем. В этом случае мы передали значение 1
(которое нам не нужно было делать, это значение по умолчанию), означающее, что будут объединены только массивы на первой глубине. ['🥑']
и ['✨', '✨', ['🍕', '🍕']]
в этом случае. Объединение этих двух массивов приводит к ['🥑', '✨', '✨', ['🍕', '🍕']]
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
класс счетчик { конструктор ( ) { это . количество = 0 ; } приращение ( ) { это . считать ++ ; } } const counterOne = новый счетчик ( ) ; счетчикОдин . приращение ( ) ; счетчикОдин . приращение ( ) ; константа counterTwo = counterOne ; счетчикДва . приращение ( ) ; консоль . лог ( счетчикОдин.количество ) ; _ _ |
0
1
2
3
Отвечать
counterOne
является экземпляром Counter
класса. Класс счетчика содержит count
свойство конструктора и increment
метод. Во-первых, мы increment
дважды вызвали метод, вызвав counterOne.increment()
. В настоящее время counterOne.count
есть 2
.
Затем мы создаем новую переменную counterTwo
и устанавливаем ее равной counterOne
. Поскольку объекты взаимодействуют по ссылке, мы просто создаем новую ссылку на то же место в памяти, counterOne
на которое указывает. Поскольку он имеет то же место в памяти, любые изменения, внесенные в объект, на который counterTwo
есть ссылка, также применяются к counterOne
. В настоящее время counterTwo.count
есть 2
.
Мы вызываем counterTwo.increment()
, который устанавливает count
значение 3
. Затем мы регистрируем счетчик на counterOne
, который регистрирует 3
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
const myPromise = Обещание . разрешить ( Обещание . Решение ( 'Обещание' ) ) ; function funcOne ( ) { setTimeout ( ( ) => console . log ( 'Тайм-аут 1!' ) , 0 ) ; мое обещание . затем ( рез => рез ) . then ( res => console .log ( ` $ { res } 1!` ) ) ) ; консоль . log ( 'Последняя строка 1!' ) ; } асинхронная функция funcTwo ( ) { const res = await myPromise ; консоль . log ( ` ${ res } 2!` ) setTimeout ( ( ) => console.log ( ' Timeout 2!' ) , 0 ) ; консоль . log ( 'Последняя строка 2!' ) ; } |