佳宸学习和分享笔记的地方

0%

几个笔试题总结

几个笔试题总结

逻辑运算实例解释
逻辑与,AND(&&expr1 && expr2expr1 可转换为 true,则返回 expr2;否则,返回 expr1
逻辑或,OR(``)

this指向问题

1
2
3
4
5
6
7
8
9
10
11
12
window.val = 1 //全局 val 为 1
var json = {
val: 10,
dbl: function() {
this.val *= 2
}
}
json.dbl() // json.val 为 20 ,this指向调用对象json
var dbl = json.dbl
dbl() // window.val 为 2 , 赋值传递丢失绑定对象 this指向全局
json.dbl.call(window) // window.val 为 4 ,ceindwall使this指向 window
console.log(window.val + json.val) // 4 + 20 = 24

JS执行顺序问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var name = 'Shumei';
(function() {
if (typeof name === 'undefined'){
var name = 'SM'
console.log('hello' + name)
}else {
console.log('hello' + name)
}
})()

JS编译过程是这样的:
先是声明变量不赋值 var name;
然后执行自执行函数
再name = 'shumei'

所以函数执行的时候 变量只声明 但是未赋值
输出: helloSM

数据类型原理问题

1
2
3
4
5
6
7
8
9
10
11
12
var a1 = [1,2]
var a2 = a1
a1[0] = a2[1]
a2.push(3)
console.log(a1)
console.log(a2)

数组是引用数据类型,引用数据类型在该对象在栈中存储的是引用地址,指向内存堆中真实的数据。
所以说如果是引用类型数据的新赋值,会影响到原数据。
输出:
[ 2, 2, 3 ]
[ 2, 2, 3 ]

JS继承问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function Test(name, age){
this.name = name
if(age != undefined){
this.age = age;
}
}
Test.prototype = {
name: 'SM',
age: 18
}

var instance = new Test();
console.log(instance.name); // undefine
console.log(instance.age); // 18
console.log(instance.constructor); // [Function: object]

双等转化问题

1
2
3
4
5
6
7
8
9
console.log(null == undefined)
console.log(Boolean("false"))
console.log({} == 0)
console.log([] == 0)

//true
//true
//false
//true

JS异步同步问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
setTimeout(function(){
console.log(1)
}, 0);
new Promise(function(resolve) { // 这里不是逗号
var i = 0;
console.log(2);
while(i<100) {
i++;
i == 1 && resolve();
}
console.log(3);
}).then(function(){
console.log(4);
});

console.log(5);

答案及解释:

1
2
3
4
5
6
7
8
9
10
涉及异步同步,宏任务微任务
先执行JS引擎线程全局宏任务 输出 2 3 5
然后执行 清空微任务 then 后的 输出 4
再执行宏任务 定时器线程执行完 然后回调到事件队列 输出 1
输出:
2
3
5
4
1