最近面试遇到的笔试题,话不多说,直接上题
1.promise相关
function fn() {
console.log(1);
Promise.resolve().then(function() {
console.log(2);
})
}
console.log(3);
fn()
setTimeout(function() {
console.log(4);
}, 0)
var p = new Promise(function(resolve, reject) {
console.log(5);
setTimeout(() => {
console.log(6);
}, 0);
resolve()
console.log(7);
})
p.then(function() {
console.log(8);
})
console.log(9);
答案:3 1 5 7 9 2 8 4 6
思路:先执行同步代码,再执行异步代码,then是微任务,setTimeout是宏任务,先执行微任务,再执行宏任务
2.let相关
var a = 10
function fn() {
console.log(a);
let a = 20
}
fn()
答案:报错
思路:let声明的变量会存在暂时性死区
3.浮点数相关
console.log(0.1 + 0.2 === 0.3);
答案:false
思路:js浮点数会有精度问题
4.运算符相关
console.log(1 + "2" + "2");
console.log(1 + +"2" + "2");
console.log(1 + -"1" + "2");
console.log(+"1" + "1" + "2");
console.log("a" - "b" + "2");
console.log("a" - "b" + 2);
console.log("a" - "b");
答案:122 32 02 112 NaN2 NaN NaN
思路:字符串相加为相连,ps(这道题给我整懵了)
5.Array相关
console.log(Array(2));
console.log(Array(2, 3));
答案:返回长度为2的空数组 返回一个元素是2和3的数组
思路:Array函数可以创建一个数组,当输入一个参数且为数字的话,那么返回的就是这个参数长度的空数组,当如果是多个参数时,返回的就是相对应参数组成的数组
6.this相关
function Fn() {
this.name = '张三'
var age = 18
this.sayAge = function() {
console.log('my age is' + this.age);
}
this.sayHi = function() {
console.log('Hi' + name);
}
}
var p = new Fn()
console.log(p.name);
console.log(p.age);
p.sayAge();
p.sayHi()
答案:张三 undefined my age isundefined Hi
思路:this指向了构造函数创建的实例对象
7.setTimeout相关
function fn() {
setTimeout(fn, 0)
}
答案:无输出
8.for和foreach相关
function fn() {
for (var i = 0; i < 10; i++) {
if (i === 3) {
console.log(i);
return
}
console.log(i);
}
}
function fn() {
[0, 1, 2, 3, 4, 5, 6].forEach(function(i) {
if (i === 3) {
return
}
console.log(i);
})
}
fn()
答案:无输出 0 1 2 4 5 6
思路:函数不调用不执行 foreach遍历每一项,return后面的语句不执行,相当于终止函数
9.浅拷贝相关
var objA = {
a: 10,
b: 20
}
var objB = objA
console.log(objA.a);
objB.a = 30
console.log(objA.a);
setTimeout(function() {
objA.a = 10
}, 0)
console.log(objB.a);
答案:10 30 30
思路:对于引用类型,直接赋值认为是浅拷贝,setTimeout是任务队列中的宏任务,放在后面再执行
10.set相关
var arr = new Set([0, 1, 2, 3, 3])
console.log(arr);
console.log(arr.length);
答案:set类 undefined
思路:set方法返回的是一个set类,并不是一个数组