Вопросы на собеседовании по JavaScript, которые меня впечатлили

внешний интерфейс JavaScript опрос

1. Введение

Для веб-интерфейса во время интервью неизбежно столкновение с вопросами интервью javascript. Для себя. Есть несколько вопросов для интервью, с некоторыми я столкнулся во время интервью, а некоторые видел в Интернете, но все они впечатляют. Сегодня я кратко проанализирую некоторые вопросы интервью, с которыми я столкнулся и которые меня впечатлили! Основная цель - дать маленьким друзьям чему-то научиться.Если вы столкнетесь с подобной ситуацией в будущем, помните, чтобы не попасть в яму!

2. Предварительный разбор

Pre-parse: В текущей области перед запуском js будет сделано предварительное объявление с ключевыми словами var и function, но оно не будет назначено (личное мнение)

Впечатлен предварительным разбором, не потому что это сложно, а потому что надо быть внимательным, если немного небрежно ответ будет неверным! Я столкнулся с более чем одной проблемой предварительного синтаксического анализа, две из них я до сих пор помню, позвольте мне сказать это!

2-1. Предварительный разбор 1

alert(a)
a();
var a=3;
function a(){
    alert(10)
}   
alert(a)
a=6;
a();  

------------分割线------------------

alert(a)
a();
var a=3;
var a=function(){
    alert(10)
}   
alert(a)
a=6;
a(); 

Когда я увидел этот код, я ошибся. Позже попросил совета у знакомого, а потом сам разобрался, и выпрямилось!
На самом деле есть два тестовых сайта, первое объявление переменной расширено, а второе объявление функции имеет приоритет над объявлением переменной!
Я кратко проанализирую это ниже.
Первая часть беговых результатов:
1. Объявления функций имеют приоритет над объявлениями переменных, поэтому в началеfunction a(){alert(10)}, вы увидите эту функцию.
2.a(), исполнительная функция, должна появитьсяalert(10)
3. Казненvar a=3;такalert(a)просто покажи3
4. Из-заaЭто больше не функция, поэтому она выполняется доa()Когда возникает ошибка.
Вторая часть беговых результатов:
1.underfind
2. Сообщить об ошибке
Как я уже говорил, подготовка — этоvarа такжеfunctionПредварительное утверждение ключевого слова, но не присвоение. Итак, началоunderfind, а затем сообщается об ошибке, поскольку выполнениеa()когда,aне является функцией.

//函数表达式,和变量声明同等
var a=function(){
    alert(10)
} 
//函数声明,优于变量声明    
function a(){
    alert(10)
} 

2-2. Подготовка и обзор

var a=0;
function aa(){
    alert(a)
    a=3
}
//结果是什么都没发生,因为要执行aa函数才会执行alert(0)

------------分割线1------------------

var a=0;
function aa(){
    alert(a)
    var a=3
}
aa();
//underfind  在aa函数里面,有var a=3,那么在aa作用域里面,就是把a这个变量声明提前,但是不会赋值,所以是underfind

------------分割线2------------------

var a=0;
function aa(a){
    alert(a)
    var a=3
}
aa(5)
alert(a)
//5,0   在函数体内,参数a的优先级高于变量a

------------分割线3------------------

var a=0;
function aa(a){
    alert(a)
    a=3
}
aa(5)
alert(a)
//5,0   在函数体内,执行alert(a)和a=3,修改的的并不是全局变量a,而是参数a

------------分割线4------------------

var a=0;
function aa(a){
    alert(a)
    var a=3
    alert(a)
}
aa(5)
//5,3
//这个我也有点不理解,请教网上的说法,有两个答案(小伙伴如果知道怎么理解,欢迎在评论上指点)
//1.参数优先级高于变量声明,所以 变量a的声明其实被忽略了,此时相当于
//var a=0;
//function aa(a){
//  var a=5;
//    alert(a)
//    a=3
//    alert(a)
//}
//aa(5)

//2.形参和局部变量优先级一样,此时相当于
//var a=0;
//function aa(a){
//  var a;    先声明
//  a=5      由于形参和变量名称一样,覆盖了!
//    alert(a)
//    a=3
//    alert(a)
//}
//aa(5)

------------分割线5------------------

var a=0;
function aa(a){
    alert(a)
    a=3
    alert(a)
}
aa()
alert(a)
//underfind  3  0 
//首先,参数优先级高于全局变量,由于没传参数,所以是underfind
//a=3,实际上修改的时形参a的值,并不是全局变量a,往下alert(a)也是形参a
//最后的alert(a),你懂的

3. Циклы и рекурсия

3-1 Массив Фибоначчи

Это не так много, чтобы сказать, очень простой, но очень классический. заключается в том, что текущий член равен сумме двух предыдущих членов

var arr=[];
for(var i=0;i<10;i++ ){
    i<=1?arr.push(1):arr.push(arr[i-1]+arr[i-2]);
}
console.log(arr)

3-2. Расположение данных

Например 123454321 23456765432
Как это сделать? В то время моя практика была написана в два этапа, сначала показывая переднюю часть, а затем показывающую заднюю часть.
код

//01234543210
//先展示前面的   01234
//n:开始的数字    m:结束的数字
function num1(n,m){
    for(var i=n;i<m;i++){
        //再展示后面的 543210
        console.log(i);
        if(i===m-1){
            num2(n,m)
        }
    }
}
function num2(n,m){
    for(var i=m;i>=n;i--){
        console.log(i)
    }
}
num1(2,5)  //2345432

Это слишком много кода, и позже я изучил это

function num(n,m){
    console.log(n);
    if(n<m){
        num(n+1,m);
        console.log(n);
    }
}
num(2,5)  //2345432

объясняется следующим образом

1.首先执行num(2,5),就是
console.log(2); ->  num(3,5);  ->  console.log(2);      
//执行num(3,5);  就是是相当于   console.log(3); -> num(4,5); -> console.log(3); 下面以此类推
console.log(2); -> console.log(3); -> num(4,5); -> console.log(3); ->  console.log(2);  

然后就是

console.log(2); -> console.log(3); -> console.log(4); -> num(5,5); -> console.log(4); -> console.log(3); ->  console.log(2);

最后就是

console.log(2); -> console.log(3); -> console.log(4); -> console.log(5); -> console.log(4); -> console.log(3); ->  console.log(2);

4. Другое

4-1

function foo1()
{
 return {
     bar: "hello"
 };
}
 
function foo2()
{
 return
 {
     bar: "hello"
 };
}
var a=foo1();
var b=foo2();
console.log(a) //Object {bar: "hello"}
console.log(b) //underfind
//仔细看就知道了

4-2

Тема видела в Интернете, я трансформированJS Вопросы на собеседовании, на которые не отвечают 80% кандидатов

for (var i = 0; i < 5; i++) {
  console.log(i);
}
console.log(i);
//这个大家应该很快就知道了,012345



for (var i = 0; i < 5; i++) {
 setTimeout(function() {
  console.log(i);
 }, 1000);
}
console.log(i);
//这个大家就要小心一点了,答案是5    55555
//在setTimeout执行之前,for循环早就执行完了,i的值早已经是5了,所以一开始是执行,最后面的console.log(i);
//在for循环的时候一下子自定义5个setTimeout,大概一秒后,就是输出55555



for (var i = 0; i < 5; i++) {
 (function(j) { // j = i
  setTimeout(function() {
   console.log(j);
  }, 1000);
 })(i);
}
console.log(i); 
//这里的解析和上面基本一样,只是用闭包来记录每一次循环的i,
//所以答案是5     01234



var output = function (i) {
 setTimeout(function() {
  console.log(i);
 }, 1000);
};
 
for (var i = 0; i < 5; i++) {
 output(i); // 这里传过去的 i 值被复制了
}
console.log(i);

//这里的解析和上面基本一样,把i当参数传进output,记录每一次循环的i,
//所以答案是5     01234



for (let i = 0; i < 5; i++) {
 setTimeout(function() {
  console.log(i);
 }, 1000);
}
console.log(i);
//结果是  报错   01234 
//注意i是用let定义的,不是var

5. Резюме

Прежде всего, я хочу сказать, что это некоторые из тем, с которыми я столкнулся, и некоторые из тем, которые являются более впечатляющими, не обязательно общими.
Тогда эту статью можно назвать моей заметкой, в которой записаны темы, с которыми я столкнулся. Я рассылаю эту статью с вопросами для интервью своим друзьям.Цель не в том,чтобы друзья запомнили вопросы и ответы,или справились с интервью.Это бессмысленно и нереально! Моя цель состоит в том, чтобы через эту тему дать каждому возможность узнать о некоторых принципах и механизмах работы или узнать о некоторых возможных «ловушках».
Кроме того, я столкнулся со многими проблемами практической эксплуатации, такими как数组去重,打乱数组,统计数组各个元素出现的次数, 字符串各个字符的出现次数,获取地址链接的各个参数и т.п. Эти вопросы не только чаще встречаются в вопросах интервью, но также часто используются в реальной разработке проекта, и небольшие партнеры могут учиться сами. Разумеется, некоторые функции я инкапсулировал сам, то есть функции, реализующие указанные выше операции, об этом я тоже в ближайшее время напишу статью, где отпишусь, какие функции я инкапсулировал, а какие часто используемые функции инкапсулировал. , и я поделюсь ими позже. Если есть что-то, что нужно исправить, или хорошие предложения, пожалуйста, укажите!


------------------------- Великолепная разделительная линия --------------------
Хотите узнать больше, обратите внимание на мой публичный аккаунт WeChat: В ожидании книжного магазина