Javascript ING BANK тестовое интервью из 3 вопросов

#javascript

#javascript

Вопрос:

У меня было тестовое интервью, и на 3 вопроса я не знал ответа:

  1. Напишите функцию, которая будет вставлять подчеркивание между символами: это станет t_h_i_s .

  2. Напишите функцию, которая будет выводить это:

 l('t') === 'lt'
l()('t') === 'l3t'
l()()('t') === 'l33t'
l()()('g') === 'l33g'
l()()()()()()()()()()()('t') === 'l33333333333t'  

  1. Почему вывод true?

 var bar = true;
function foo() {
  bar = false;
  return 5;
  function bar() {}
}
foo();
console.log(bar);  

Может кто-нибудь помочь, пожалуйста, с ответами?

Комментарии:

1. Вам нужно задать 3 разных вопроса

2. Сделайте свою домашнюю работу.

3. 1. и 3. тривиальны, вы вообще пытались что-нибудь исследовать?

4. Я искал в Google, поверьте мне, и я не нашел ничего, что могло бы их решить.

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

Ответ №1:

  1. Напишите функцию, которая будет вставлять подчеркивание между символами: это станет t_h_i_s .

Вы хотите написать функцию, которая перебирает все символы в строке и добавляет символ подчеркивания между всеми символами.

Например:

 function underscoreString(str) {
    var result = str.charAt(0);

    for (var i=1; i<str.length; i  ) {
        result  = '_'   str.charAt(i);
    }

    return resu<
}

console.log( underscoreString('this') );
  
  1. Напишите функцию, которая будет выводить это:

Вам нужно будет написать функцию, которая возвращает другую функцию, чтобы вы могли объединять функции в цепочку. Поскольку Javascript позволяет хранить функции в виде переменных, вы можете использовать это, постоянно вызывая одну и ту же функцию, пока не будет возвращен правильный аргумент.

Следующая функция является примером. Он работает так, как задумано, но не самый красивый.

 function l(ch) {
    var str = 'l';
    if (ch) return str   ch;
    else str  = '3';

    var newFunc = function (ch) {
        if (ch) return str   ch; 
        str  = '3';
        return newFunc;
    }
    return newFunc
}

console.log( l('t') === 'lt' );
console.log( l()('t') === 'l3t' );
console.log( l()()('t') === 'l33t' );
console.log( l()()('g') === 'l33g' );
console.log( l()()()()()()()()()()()('t') === 'l33333333333t' );
  
  1. Почему вывод true?
 var bar = true;
function foo() {
  bar = false;
  return 5;
  function bar() {}
}
foo();
console.log(bar);
  

То bar , что находится внутри функции foo() , не ссылается на глобальную переменную bar . Вместо этого он ссылается на функцию function bar() {} . Это из-за подъема, как упоминалось в комментариях.

Таким образом, глобальная bar переменная вообще не затрагивается функцией и всегда остается true .

Комментарии:

1. Я думаю, также стоит упомянуть, что из-за подъема функции() объявление bar {} перемещается в начало функции foo

2. Я добавил заявление для этого в ответ, спасибо @Maggie

Ответ №2:

Это действительно зависит от ожидаемого уровня кода. Если вам нужно продемонстрировать понимание алгоритмов или знание того, как использовать конструкции javascript.

Например, первый может быть таким простым, как:

 function insertUnderscore(x){
    return x.split('').join('_');
}
  

2-й вопрос рекурсивный метод:

 function l( end ){
    var acc = '';
    function iter( eChar ){
        if( typeof eChar === "undefined"){
            acc=acc '3';
            return iter;
        }
        return 'l' acc eChar;
    }
    if(typeof end === "undefined"){
        acc = acc   '3';
        return iter;
    }
    return iter(end);
}
  

Третий вопрос:
функция bar(){} фактически объявляет ‘bar’ в локальной области, поэтому ваше назначение bar = false действует на локальный ‘bar’.

Ответ №3:

Это просто возвращает функцию итератора, если буква не определена, когда буква определена, она повторяет символ ‘3’ n раз.

Два других должны быть довольно простыми для понимания

 function l(letter) {
  let count = 0
  function iter(letter) {
    if (typeof letter === 'undefined') {
      count  
      return iter
    } else {
      return 'l'   ('3'.repeat(count))   letter
    }
  }
  return iter(letter)
}

console.log(l('t') === 'lt')
console.log(l()('t') === 'l3t')
console.log(l()()('t') === 'l33t')
console.log(l()()('g') === 'l33g')
console.log(l()()()()()()()()()()()('t') === 'l33333333333t')  

Комментарии:

1. Я думаю, что у вас есть вопросы 2 и 3, смешанные здесь в один?

Ответ №4:

Вопрос 1

Используйте отрицательный прогноз для начала строки и положительный прогноз для символа. Замените заданную пустую строку символом подчеркивания.

 function spacer(s) {
    return s.replace(/(?!^.)(?=.)/g, '_');
}

console.log(spacer('this'));  

Вопрос 2

Используйте замыкание и возвращайте для не заданного параметра функцию, в противном случае расширенное значение.

 function l(v) {
    var s = 'l';
        fn = function (v) {
            s  = 3;
            return v === undefined ? fn : s   v;
        };

    return v === undefined ? fn : s   v;
}

console.log(l('t') === 'lt');
console.log(l()('t') === 'l3t');
console.log(l()()('t') === 'l33t');
console.log(l()()('g') === 'l33g');
console.log(l()()()()()()()()()()()('t') === 'l33333333333t');  

Вопрос 3

Потому function bar() {} что он поднимается до начала функции, а затем перезаписывается false . Внешняя bar переменная никогда не меняла свое содержимое.

 var bar = true;
function foo() {
    bar = false;
    console.log('foo's bar:', bar);
    return 5;
    function bar() {}
}

foo();
console.log(bar);  

Комментарии:

1. Спасибо @Nina Scholz за ваши объяснения. В 1 должна быть функция, ничего больше. Другие ребята показывают мне, как это сделать.