昼猫笔记 -- 闭包、隐式转换面试题集合

昼猫笔记 – 闭包、隐式转换面试题集合

主要内容:闭包、函数声明方式、隐式转换


一、如下代码输出的结果是什么:

(function () {
    var x = foo();
        var foo = function foo() {
        return 'foobar'
    };
    return x;
})();

分析:

首先看到这道题,我们最先看到这是以一个匿名自执行函数,然后想到的知识点就是变量提升函数表达式函数声明

这道题核心知识点就是变量提升函数表达式函数声明这三者的联系

首先是xfoo变量得到提升,顾名思义值为undefined,foo的赋值(也就是函数)并没有提前,xfoo之前定义,此时foo是undefined。运行到x = foo();时,就会报错。
如果把x定义放在foo的后面,就不会报错。

结果是:TypeError: foo is not a function


二、如下代码输出的结果是什么:

console.log(1 + "2" + "2");
console.log(1 + +"2" + "2");
console.log("A" - "B" + "2");
console.log("A" - "B" + 2);

分析:
这道题主要的考点是拼串隐式转换

  1. console.log(1+ "2"+"2");
    在做加法时要注意双引号,当使用双引号时,JavaScript认为是字符串,字符串相加等于字符串合并。
    因此,这里相当于字符串的合并,即为122。

  2. console.log(1+ +"2"+"2");
    第一个+"2"中的加号是一元加操作符+"2"会变成数值2,因此1+ +"2"相当于1+2=3,然后和后面的字符串“2”相合并,变成了字符串"32"。

  3. console.log("A"- "B"+"2");
    "A"-"B"的运算中,需要先把"A""B"用Number函数转换为数值,其结果为NaN,在剪发操作中,如果有一个是NaN,则结果是NaN,因此"A"-"B"结果为NaN。然后和"2"进行字符串合并,变成了NaN2.

  4. console.log("A"- "B"+2);
    根据上题所述,"A"-"B"结果为NaN,然后和数值2进行加法操作,在加法操作中,如果有一个操作数是NaN,则结果为NaN。

结果:122、“32”、NaN2、NaN


三、下列哪一组对应关系与此类似

这道题就有点意思了,虽然我是做对了,但也是瞎蒙的,第一次见这种题,有点懵

蔺相如,司马相如;魏无忌,长孙无忌。下列哪一组对应关系与此类似()
A. PHP,Python
B. JSP,servlet
C. Java,Javascript
D. C,C++

后来看了下网友的解释,感觉有点意思啊
网友解释


四、y和z的最终结果为:

var m = 1, j = k = 0; 
function add(n) { 
    return n = n + 1; 
} 
y = add(m); 
function add(n) { 
    return n = n + 3; 
} 
z = add(m); 

分析:
首先我们得知道 在js中,定义了两个同名函数后,后面的函数会覆盖前面定义的函数。结合这道题来说,由于函数声明提升,所以函数声明会提前。由于存在同名函数,后面的add函数将覆盖第一个add函数,所以两次调用add()返回的值是相同的。

知识点:
定义函数的方式有三种:function函数、Function()构造函数、对象字面量。
还有就是从解析顺序来分析的话,它们的不同在于:function函数会优先解析;Function()构造函数、函数字面量定义是顺序解析

后来在网上查了下这种覆盖在其他语言中(比如java)中是函数重载的概念,可以存在同名函数,然而js中没有函数重载的概念

结果:4、4


五、

var foo = 'Hello';
(function(){
    var bar = 'World';
    console.log(foo + bar);
})();
console.log(foo + bar);

分析:
这道题结合了第一道和第二道题,这是一个匿名自执行函数,会先调用并执行一次,即console.log(foo + bar)的结果是字符串拼接;
var bar = 'World'是函数内部声明的局部变量,外部无法调用,所以外部的console.log(foo + bar)会报错。

结果:hello world报错


六、下面代码的输出结果是:

var one;
var two = null;
console.log(one == two, one === two);

分析:
在之前写的笔记中曾经写过关于js隐式转换的知识点,今天来总结下

数据类型 转换为true的值 转换为false的值
Boolean true false
String 任何非空字符串 ’ '(空串)
Number 任何非零数字(包括无穷大) 0和NaN
Object 任何对象 null
Undefined 不适用 undefined

还有就是 == 和 == 的区别,== 会将两边的值进行隐式类型转换,而 === 不会,会判断等号两边是否是一个类型。
上述代码中,var one; 只定义未赋值,所以one的值为 undefined, undefined 和 null转换为 Boolean 类型后都为false,而 === 不会进行转换,那么 undefined 和 null 就不相等,所以是true

结果:true false


七、以下代码输输出的结果是:

function test() {
    var n = 4399;
    function add() {
        n++;
        console.log(n);
    }
    return {n: n, add: add};
}
var result = test();
var result2 = test();
result.add();
console.log(result.n);
result2.add()

这道题相对来说有点难度,做的时候要考虑到很多知识点

分析:
一步步来分析,首先,题目中定义了一个名为test的函数,函数内部中分别定义了一个变量n和闭包函数add,在test函数的最后有一行 return {n: n, add: add};,在这块实际上返回了一个object对象,而这个object中有一个属性n,它的值是n,还有一个方法add,它的值是add。

代码解释好了,再来看看输出的问题
函数外部分别定义了两个变量,resultresult2,他们都指向test函数,但是分属两个不同的作用域,这也就解释了答案中1和4,4不会在2的基础上继续n++。
1和2属于闭包的问题,在前边笔记中我们曾经也写过闭包的作用,闭包最大的好处就是可以读取到函数内部的变量,以及让这些变量的值始终保持在内存中,第二个用途就解释了同一个作用域中答案2会在1的基础上进行+1操作。
对于第三个答案,会有点难度,上边代码分析的时候说过在test函数最后一行返回的是return {n: n, add: add};,在这里,在匿名对象中,属性n和方法add是互不相关的,即使在闭包add中改变了变量n的值,result.n的值依然不变。

结果:4400 4401 4399 4400


八、以下代码输出什么

function Foo(){
     var i=0;
     return function(){
         document.write(i++);
     }
}
var f1=Foo(),
    f2=Foo();
f1();
f1();
f2();

分析:
这道题呢还是一个闭包问题,所以说跟第七题的逻辑是一样的,就是让这些变量的值始终保持在内存中。
这里的变量i,对f1()、f2()来说是全局变量,但是f1()if2()i又是相互独立相互不可见的,f1()每执行一次,f1()i就加一,f2()每次执行一次,f2()i就加一,但是相互之间不影响。

结果:010


九、以下的Js程序输出什么

var a="undefined";
var b="false";
var c="";
function test(aVar){
    if(aVar){     
        alert(true);
    }else{
        alert(false);
    }
}
test(a);
test(b);
test(c);

分析:首先呢,这是里边有隐式转换的问题,还有就是当中的变量a、b、c都是字符串的变量,而不是真正的 undefined 和 false ,在判断里都会被认为是真值,显示true,只有变量c为空串所以显示false

十、以下代码输出结果

var f = function g() {
    return 23;
    };
typeof g();

分析:
在第一题中,写过声明函数的方式是三种,

  1. function foo(){...}(函数声明)
  2. var foo = function(){...}(等号后面必须是匿名函数,函数表达式)
  3. new Function() Function()构造函数

类似于var foo = function bar(){...}这种的声明方式在函数外部无法通过bar访问到函数,因为这已经变成了一个表达式。

还有一个问题就是,为什么不是undefined
测试之后,会得到以下的结果

typeof f;   // 结果是function
typeof f(); // 结果是number
typeof g;   // 结果是undefined.
typeof g(); // 结果是ReferenceError,g is not defined

好了,今天的十道题就结束了,主要就是一些闭包啊,函数声明方式,还有就是隐式转换的一些问题,都是比较基础的。

相关内容来自 百度、CSDN博客、博客园等等一些渠道,都是本人搜索下的的一些题、转载请备注链接谢谢!
公众号:昼猫笔记 https://mp.weixin.qq.com/mp/homepage?__biz=MzUzNjkyNjkwOA==&hid=5&sn=a88bd0eb37b9e7e35ee43c39938635c8

猜你喜欢

转载自blog.csdn.net/weixin_44176774/article/details/86467260