Замечания Chengxing очень освежаются, и работа собеседования пострадало много трудностей. К счастью, у меня есть ежедневный партнер справки, нажмите, чтобы следовать и не ленивить.
Это сезон прыжков с работы из золота, девятки, серебра, десяти, чтобы позволить большему количеству друзей стать лучше во время интервью.offer
, Так что с прошлого месяца я буду задавать один или два вопроса для интервью каждый день в своем общедоступном аккаунте [Некоторые игры во внешнем интерфейсе], обычно известные как один вопрос в день (один пит в день). Небольшим партнерам, ищущим работу, удобно каждый день получать новые урожаи. В этой статье редактор разобрался с некоторыми из наиболее классических ежедневных вопросов на ранней стадии.Приглашаем всех взглянуть. Содержание этой статьи было впервые опубликовано в публичном аккаунте [некоторая игра во внешнем интерфейсе], обратите внимание===
учить.
Массив вопросов, связанных с классом интервью
Что такое массив, подобный массиву, массив, подобный массиву, должен иметьlength
Объект, другие свойства (индексы) которого являются неотрицательными целыми числами и не имеет методов, используемых массивами. такие как наши обычно используемыеdocument.querySelectorAll
вернутьNodeLists
представляет собой массив классов. Этот вопрос связан с контентом, подобным массиву.
тема
Пожалуйста, скажите, что выводит следующий код, вам нужно различатьnodejs
,chrome
так же какchrome
Удалитьsplice
вывод после
var obj = {
'2': 3,
'3': 4,
'length': 2,
'splice': Array.prototype.splice,
'push': Array.prototype.push
}
obj.push(1)
obj.push(2)
console.log(obj)
Отвечать
Этот вопрос задает в общей сложности три случая следующего вывода, и ответы объясняются ниже по очереди.
-
node
Следующий вывод{ '2': 1, '3': 2, length: 4, splice: [Function: splice], push: [Function: push] }
-
chrome
Следующий вывод[empty × 2, 1, 2, splice: ƒ, push: ƒ]
-
chrome
Удалитьsplice
Следующий вывод{2: 1, 3: 2, length: 4, push: ƒ}
Из приведенного выше выходного содержимого видно, что один и тот же код, выходное содержимое отличается в разных ситуациях, ниже приводится подробная разбивка.
отвечать
Прежде чем ответить на вопрос, давайте еще раз посмотрим на этот код
const arr = new Array(2)
// 输出 2 [empty * 2]
console.log(arr.length, arr)
arr.push(1)
// 输出 3 [empty * 2, 1]
console.log(arr.length, arr)
можно увидетьpush
метод преобразует массивlength + 1
, затем поместите значение в index какlength - 1
позицию, такую как приведенный выше код, потому что при инициализации массива длина массива была указана как2
, так что вpush
Позжеlength
это становится3
,Потомarr[3 - 1] = 1
существуетMDN
лицевой стороной вверхpush
Объяснение метода таково:
push
Метод универсальный. этот метод иcall()
илиapply()
При совместном использовании может применяться к массивоподобным объектам.push
метод согласноlength
свойство, чтобы решить, где начать вставку данного значения. еслиlength
не может быть преобразовано в значение, индекс вставленного элемента равен 0, в том числеlength
когда его не существует. когдаlength
Когда его нет, он будет создан.
согласно сMDN
объяснять,push
Может использоваться в массиве, массив может использоваться в классе. В соответствии с интерпретацией вышеизложенного типа массива, можно увидеть в заголовкеobj
стандартный массив классов, то вы можетеobj
используя массивы вышеpush
метод.
посмотри сноваobj.push(1)
, потому чтоobj.length = 2
, так будетlength + 1
это становится3
, на этот раз, когда значение индексаobj[3 - 1] = 1
которыйobj[2] = 1
, по аналогииobj.push(2)
То же самое. Потому чтоobj
Уже есть свойство (индекс) в2
а также3
, так что вpush
будет перезаписан, когда2
а также3
Значение по умолчанию выше.
так вnodejs
будет выводить
{ '2': 1,
'3': 2,
length: 4,
splice: [Function: splice],
push: [Function: push] }
Но когдаchrome
вывод в консоль
[empty × 2, 1, 2, splice: ƒ, push: ƒ]
Очень странно, почему так выводится? В этом произведении есть особая ловушка,chrome
Как консоль определяет, является ли напечатанное содержимое массивом или другим объектом? За это,chrome
Это путем оценки того, имеет ли объектsplice
а такжеlength
Эти два свойства оцениваются, поэтому, если выsplice
После удаления выдает следующее
{2: 1, 3: 2, length: 4, push: ƒ}
Вы также можете попробовать следующий код:
console.log({splice:function(){},length:1})
console.log({slice:function(){},length:1})
Логические вопросы на собеседовании: мыши пьют яд
Когда я был выпускником, я столкнулся с несколькими логическими вопросами интервью во время интервью.Этот вопрос является логическим вопросом интервью.Давайте посмотрим.
тема
Есть 16 бутылок с водой, из которых только одна бутылка воды ядовитая Мыши умрут в течение часа после того, как выпьют одну каплю Сколько мышей нужно использовать хотя бы, чтобы найти ядовитую воду за 1 час?
Ответы и решения
Ответ по крайней мере4
Мышь, как ты это понимаешь? Мы можем использовать двоичный код, чтобы рассуждать об этом:
Предположим, есть 4 мыши, это метил, этил и пропил, и используйте двоичный код для представления порядка, в котором мыши пьют лекарство.1
пить лекарство,0
значит нет лекарств
Первый:1111 1111 0000 0000
Второй:1111 0000 1111 0000
С:1100 1100 1100 1100
Дин:1010 1010 1010 1010
Тогда мы можем судить о следующем:
- A, B, C и D мертвы, что указывает на то, что первая бутылка ядовита.
- A, B и C мертвы, что указывает на то, что вторая бутылка ядовита.
- A-D-D мертв, что указывает на то, что третья бутылка ядовита.
- A и B мертвы, что указывает на то, что четвертая бутылка ядовита.
- Мепродин мертв, что указывает на то, что пятая бутылка ядовита.
- . . . И так далее
На самом деле, для этой проблемы вы можете использовать2
изn
Если судить по мощности, например, есть32
бутылка воды, затем2
из5
мощность, поэтому нам нужно5
мышь.
вопросы интервью аргументы
существуетES6
В середине, если параметр функции не уверен, мы обычно используем оператор расширения.function(...rest){}
, получить массив параметровrest
,Но когдаES6
Раньше мы не могли использовать оператор спреда, поэтому нам нужно подумать об использованииarguments
тема
Скажите, пожалуйста, что выводит следующая программа (вывод chrome)
let obj = {
age: 18,
foo: function(func) {
func()
arguments[0]()
}
}
var age = 10
function fn() {
console.log(this.age)
}
obj.foo(fn)
Отвечать
Ответ на этот вопрос:
// 第一个输出 10
func()
// 第一个输出 undefined
arguments[0]()
Немного неожиданно?
Объясним первый, почему бы не вывести18
Ну, хотяfunc()
вfoo
Функция вызывается, но область действия явно не указана, в этом случае будет использоваться область действия по умолчаниюwindow
, а для браузера глобально черезvar
Объявленные переменные автоматически монтируются вwindow
выше, такvar age = 10
эквивалентноwindow.age = 10
, в то время как первыйfunc()
внутриthis.age
эквивалентноwindow.age
Второе может заключаться в том, что многие люди немного запутались, почему этоundefined
, сначала посмотрите на следующий код
const arr = [function() {console.log(this[1])}, '我是子君']
// 输出 我是子君
console.log(arr[0]())
мы проходимarr[0]
Получите функцию, в настоящее время областью действия функции является этот массив, поэтому при повторном вызовеthis
то естьarr
, такthis[1]
является вторым элементом в массиве.
Теперь оглянисьarguments
, На самом деле это массив классов, в котором хранятся параметры, переданные функцией. Первый элемент — это переданная функция, как и в приведенном выше примере.arguments[0]
Область примененияarguments
,а такжеarguments
вышеизложенное неage
собственность, такundefined
это указывает на проблему
this
Указание на проблему всегда приводило к путанице.this
Указатель на связан не с тем, где определен код, а с тем, кто его выполняет, и из-за этого многие разработчики часто путаются.this
Кто это. Следующие два вопросаthis
Укажите на сопутствующие вопросы.
Тема 1 (Бронза)
Скажите, что выводит следующий код
var num = 1;
let obj = {
num: 2,
add: function() {
this.num = 3;
(function() {
console.log(this.num);
this.num = 4;
})();
console.log(this.num);
},
sub: function() {
console.log(this.num)
}
}
obj.add();
console.log(obj.num);
console.log(num);
const sub = obj.sub;
sub();
Тема 2 (Золото)
Скажите, что выводит следующий код
var num = 10
const obj = {num: 20}
obj.fn = (function (num) {
this.num = num * 3
num++
return function (n) {
this.num += n
num++
console.log(num)
}
})(obj.num)
var fn = obj.fn
fn(5)
obj.fn(10)
console.log(num, obj.num)
Отвечать
Тема 1
Выходной результат:1
,3
,3
,4
,4
, вы правильно поняли? Давайте взглянем на анализ кода
var num = 1;
let obj = {
num: 2,
add: function() {
this.num = 3;
// 这里的立即指向函数,因为我们没有手动去指定它的this指向,所以都会指向window
(function() {
// 所有这个 this.num 就等于 window.num
console.log(this.num);
this.num = 4;
})();
console.log(this.num);
},
sub: function() {
console.log(this.num)
}
}
// 下面逐行说明打印的内容
/**
* 在通过obj.add 调用add 函数时,函数的this指向的是obj,这时候第一个this.num=3
* 相当于 obj.num = 3 但是里面的立即指向函数this依然是window,
* 所以 立即执行函数里面console.log(this.num)输出1,同时 window.num = 4
*立即执行函数之后,再输出`this.num`,这时候`this`是`obj`,所以输出3
*/
obj.add() // 输出 1 3
// 通过上面`obj.add`的执行,obj.name 已经变成了3
console.log(obj.num) // 输出3
// 这个num是 window.num
console.log(num) // 输出4
// 如果将obj.sub 赋值给一个新的变量,那么这个函数的作用域将会变成新变量的作用域
const sub = obj.sub
// 作用域变成了window window.num 是 4
sub() // 输出4
тема вторая
Результат:22
23
65
30
, вы правильно поняли? Давайте проанализируем это
var num = 10
const obj = {num: 20}
obj.fn = (function (num) {
this.num = num * 3
num++
return function (n) {
this.num += n
num++
console.log(num)
}
})(obj.num)
var fn = obj.fn
fn(5)
obj.fn(10)
console.log(num, obj.num)
Разобьем приведенный выше код на следующие шаги для анализа
-
Сначала посмотрите на третью строку кода, которая представляет собой операцию присваивания.Мы знаем, что операция присваивания выполняется справа налево, и
=
Правая часть числа — это функция немедленного выполнения, поэтому функция немедленного выполнения будет выполняться первой, а функция немедленного выполнения не указывается вручную.this
,В этот моментthis = window
, а параметр непосредственной функцииnum
был принят вobj.num
,такnum
Значение параметра по умолчанию:20
-
Четвертая строка эквивалентна
window.num = 20 * 3
-
Пятая строка добавляет единицу к входящему параметру, поэтому
num = 20 + 1
-
шестой ряд
return
функция, и эта функцияobj.fn
ценность, а потомуreturn
Функция ссылается на немедленно выполняемую функцию внутриnum
, так что замыкание формируется. В этот моментobj.fn = function(n) { this.num += n // 这个num是立即执行函数里面的num num++ console.log(num) }
-
var fn = obj.fn
, Будуobj.fn
присваивается новой переменной, область действия которойwindow
-
вызов
fn(5)
когда на втором шагеwindow.num
Значение стало60
, то потому что на этот разfn
изthis
даwindow
,this.num += n
эквивалентноwindow.num += n
, которыйwindow.num = 65
-
num++
, из-за замыкания, третий шагnum
да21
, поэтому этот шагnum
стал22
, при выводе22
-
потом
obj.fn(10)
,В этот моментfn
изthis
дляobj
,obj.num
Значение по умолчанию20
,this.num += n
эквивалентноobj.num += 10
-
Как и в шаге 7,
num + 1
выход23
-
console.log(num, obj.num)
эквивалентноconsole.log(window.num, obj.num)
, Видно из приведенных выше шагов,window.num = 65
,obj.num = 30
.
расширенный вопрос
Если два вышеуказанных вопросаvar
изменить наlet
, что будет на выходе?
проблема преобразования типа данных
Хотя в повседневной разработке мы реже используем неявное преобразование типов (не обязательно), но это по-прежнему часто задаваемый вопрос на собеседованиях, и его все же необходимо освоить.Давайте разберемся в этой теме.
Тема (жареный король / бронза, я не знаю)
Скажите, что выводит следующий код
console.log([] + [])
console.log({} + [])
console.log([] == ![])
console.log(true + false)
Отвечать
Давайте посмотрим ответ вместе
- первая строка кода
// 输出 "" 空字符串
console.log([] + [])
Эта строка кода выводит пустую строку""
, когда тип оболочки работает, он сначала вызоветvalueOf
Метод, еслиvalueOf
Возврат по-прежнему является типом оболочки, затем снова вызовитеtoString
метод
// 还是 数组
const val = [].valueOf()
// 数组 toString 默认会将数组各项使用逗号 "," 隔开, 比如 [1,2,3].toSting 变成了"1,2,3",空数组 toString 就是空字符串
const val1 = val.toString() // val1 是空字符串
Таким образом, приведенный выше код эквивалентен
console.log("" + "")
-
вторая строка кода
// 输出 "[object Object]" console.log({} + [])
Как и в случае с первым вопросом, объект
{}
неявно преобразуется в[object Object]
Тогда с""
добавить -
третья строка кода
// 输出 true console.log([] == ![])
для
===
, будет строго сравнивать два значения, но для==
это не одно и то же- Например
null == undefined
- если не
number
а такжеnumber
сравнения, он будет преобразован вnumber
- Если одна из двух сторон сравнения
boolean
, то первыйboolean
Перевести вnumber
Итак, для приведенного выше кода посмотрите на следующий пошаговый анализ.
// 这个输出 false console.log(![]) // 套用上面第三条 将 false 转换为 数值 // 这个输出 0 console.log(Number(false)) // 包装类型与 基本类型 == 先将包装类型通过 valueOf toString 转换为基本类型 // 输出 "" console.log([].toString()) // 套用第2条, 将空字符串转换为数值、 // 输出 0 console.log(Number("")) // 所以 console.log(0 == 0)
- Например
-
четвертая строка кода
// 输出 1 console.log(true + false)
Добавьте два базовых типа, если один из них является символом, другой преобразуйте в символьное сложение, в противном случае преобразуйте тип в
Number
, а затем сложить,Number(true)
да1
,Number(false)
да0
, так что результат1
Суммировать
Интервью, чтобы построить ракеты, работать, чтобы закрутить винты. Хотя я просто хочу закручивать гайки, мне нужно найти работу по завинчиванию шурупов, строя ракеты. Каждый день задается один вопрос, и каждый день появляются новые вопросы для интервью. Добро пожаловать, чтобы обратить внимание на общедоступный номер [Front-end some play], втяните вас в группу по коммуникациям передовых технологий, один вопрос в день ждет вас, чтобы ответить на вопрос вместе.
Эпилог
Не истощайте свое вдохновение и воображение, не будьте рабом своих моделей. - Винсент Ван Гог