前端几道题-2

90 阅读2分钟

「这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战

1.下面代码的执行结果是什么?
console.log(123..toString());

答案:"123"
解析:包装类的原因,js会将123.通过new Number(123.)打包成包装类对象。调用的是Number.prototype.toString,所以new Number(123.).toString === Number.prototype.toString

2.有两个变量a和b,其值为number类型且非NaN,不借助其他变量,完成a与b的交换

答案:方式有很多种,下面是其中给一种
var a = 101;
var b = 102;
a = a + b;
b = a - b;
a = a - b;
console.log(a,b)

3.下面代码的执行结果是什么?为什么

**

var a = {},b={key:"b"},c={key:'c'};
a[b] = 123;
a[c] = 456;
console.log(a[b]);

答案:456
解析:在设置对象的属性时,如果属性传入是一个对象,js会隐式的讲变量变成对象对应的[object Object]
所以:a[b]和a[c]其实都相当于a["[object Object]"],所以他们操作的都是a对象的同一个属性,因此结果为456

4.下面代码的执行结果是?
(function(){
    try{
        throw new Error
    }catch(x){
        console.log(x)//Error
        var x = 1;
        var y = 2;
        console.log(x)//1
    }
    console.log(x);//undefined
    console.log(y);//2
})();

答案: 1 undefined 2

解析:最开始执行匿名立即执行函数参数的作用域中,由于预编译将变量x和y提升了值为undefined

当执行catch函数时,里面有自己的形参变量x,这里的值是错误信息:Error,后面赋值为1;所以里面catch中先打印Error后打印1

y被赋值为2;

所以外面打印的值:x为undefined,y为改变的值2

5.下面代码的执行结果是?
var a = 10;
function fn() {
    console.log(this.a)
}
var obj = {
    a: 5,
    method: function (fn) {
        fn();//自己执行的,所有this指向window,打印出10
        arguments[0]();
    }
}
obj.method(fn, 1)

答案:10 undefined

解析:函数自己执行里面this指向window,

函数传入另外一个函数作为参数,通过arguments[0]的形式调用,相当于arguments.0(),arguments.0就代表该函数,所以里面this指向arguments。

再比如:

**

var length = 10;
function fn() {
    console.log(this.length)
}
var obj = {
    length: 5,
    method: function (fn) {
        fn();//自己执行的,所有this指向window,打印出10
        arguments[0]();//相当于arguments.0(),这里argumentslength2,并且arguments.0中的0就是传入的fn,所以执行函数,相当于arguments调用。打印出2
    }
}
obj.method(fn, 1)

答案是:10 2