Javascript ING BANK 3个问题测试面试

时间:2016-10-11 09:09:44

标签: javascript

我进行了一次测试面试,对于3个问题,我不知道答案:

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

  2. 编写一个输出此函数的函数:

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

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

      有人可以帮忙解答一下吗?

4 个答案:

答案 0 :(得分:3)

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

您希望编写一个迭代字符串中所有字符的函数,并在所有字符之间附加下划线。

例如:

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') );
  
      
  1. 编写一个输出此函数的函数:
  2.   

您需要编写一个返回另一个函数的函数,以便链接这些函数。由于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. 为什么输出是真的?
  2.   
var bar = true;
function foo() {
  bar = false;
  return 5;
  function bar() {}
}
foo();
console.log(bar);

函数bar中的foo()未引用全局变量bar。相反,它引用了函数function bar() {}。这是因为hoisting,如评论中所述。

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

答案 1 :(得分:2)

这实际上取决于预期的代码级别。如果您需要证明对算法的理解或如何使用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);
}

第三个问题:  function bar(){}实际上声明了&#39; bar&#39;在本地范围内,因此您的作业栏= false会对本地&#39;栏进行操作。

答案 2 :(得分:1)

如果字母未定义,则只返回迭代器函数。当定义字母时,它会重复字符'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')

答案 3 :(得分:1)

问题1

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

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

console.log(spacer('this'));
&#13;
&#13;
&#13;

问题2

使用闭包并返回非给定参数,否则返回扩展值。

&#13;
&#13;
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');
&#13;
&#13;
&#13;

问题3

因为function bar() {}被提升到函数的开头,然后被false覆盖。外部bar变量从未更改过它的内容。

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

foo();
console.log(bar);
&#13;
&#13;
&#13;