Javascript ING BANK面试3题测试

Javascript ING BANK 3 questions test interview

本文关键字:测试 面试 ING BANK Javascript      更新时间:2023-09-26

我参加了一次考试面试,有3道问题我不知道答案:

  1. 编写一个函数,将在字符之间插入下划线:这将成为t_h_i_s。

  2. 写一个函数输出如下:

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

  • 为什么输出为真?
  • var bar = true;
    function foo() {
      bar = false;
      return 5;
      function bar() {}
    }
    foo();
    console.log(bar);

    有人能帮我解答一下吗?

    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 result;
    }
    console.log( underscoreString('this') );
    
  • 写一个函数输出如下:
  • 您需要编写一个返回另一个函数的函数,以便将函数链接起来。由于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' );
    
  • 为什么输出为真?
  • var bar = true;
    function foo() {
      bar = false;
      return 5;
      function bar() {}
    }
    foo();
    console.log(bar);
    

    函数foo()中的bar没有引用全局变量bar。相反,它引用了函数function bar() {}。这是因为在评论中提到的提升。

    因此,全局变量bar根本不会被函数触及,并且始终保持为真。

    这实际上取决于预期的代码级别。如果你需要展示对算法的理解或如何使用javascript结构的知识。

    例如,第一个可以像这样简单:

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

    第二个问题递归方法:

    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' 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

    对字符串的开头使用负向前看,对字符使用正向前看。将给定的空字符串替换为下划线

    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);