前端面试题总结二(js)
程序员文章站
2022-06-09 17:07:20
...
2019的行情确实很糟糕,面试前一定要做好充分的准备!下面主要介绍一些常见面试题
1.有下面一段代码,输出index是3和4的li结果是什么
<ul>
<li>这是第一个</li>
<li>这是第二个</li>
<li>这是第三个</li>
<li>这是第四个</li>
<li>这是第五个</li>
</ul>
var nodes=document.querySelectorAll('ul li')
for(let i=0,len=nodes.length;i<len;i++){
nodes[i].addEventListener('click',function(){
console.log('click='+i)
})
}
结果:click=3,click=4
那如果我们把let改为var结果会是什么
for(var i=0,len=nodes.length;i<len;i++){
nodes[i].addEventListener('click',function(){
console.log('click='+i)
})
}
结果:click=5,click=5
2.下面代码执行结果
console.log('1',typeof f,f)
function f(){
console.log(f)
}
var f="g"
console.log('2',typeof f,f)
结果:
1 function ƒ f(){
console.log(f)
}
2 string g
上面的代码的输出值是"function"而不是‘g’,这说明变量声明并没有覆盖掉函数声明
函数声明优先级要高于变量的声明,但是变量赋值以后,就会覆盖之前声明的函数。
如果把var改为let结果:Identifier 'f' has already been declared
let不能重新声明,无论let声明的变量放在function之前还是之后结果一样都是报错
3.
function f(){
console.log(a)
let a=2 //报错 var的话undefined
}
f()
因为 const、let会在声明地方到块级顶部形成临时性死区,在这区间使用该变量都会被报错
4.
var name ='the windows'
var object={
name:"my object",
getName:function(){
return function(){
return this.name
}
}
}
console.log(object.getName()())
结果:the windows
5.
var num =1;//这里可以改为let,下面的var改为let会报错,应为let不可以重复定义
(function(){
console.log(num)//undefined
var num =2
console.log(num)//2
})()
var num =1;//改成let也是一样的
(function(){
console.log(num)//1
num =2
console.log(num)//2
})()
6
var a = {n:1};
var b = a;//赋值
a.o=a={n:2}
console.log(a) //{n:2}
console.log(b) //{n:1,o:{n:2}}
var a = {n:1};
var b = a;//赋值
a.o=b={n:2}
console.log(a) //{n:1,o:{n:2}}
console.log(b) //{n:2}
var a = {n:1};
var b = a;//赋值
a.o={n:2}
console.log(a) //{n:1,o:{n:2}}
console.log(b) //{n:1,o:{n:2}}
var a = {n:1};
var b = a;//赋值
b.o={n:2}
console.log(a) //{n:1,o:{n:2}}
console.log(b) //{n:1,o:{n:2}}
其实这类问题很容易理解,只需要记得变量只是对象的引用,变量并不是对象本身。
(1)取值的时候顺着变量找到对象;
(2)赋值的时候则改变变量的指向。
7
num =1;
var o={
num:2,
print:function(){
this.num=3;
(function(){
console.log(this.num);//1
})();
console.log(this.num)//3
}
}
o.print();
考察的this指代问题
8
var a=10;
function f(){
var b= 2*a;
var a=20;
var c=a+1
console.log(b);//NaN
console.log(c);//21
}
var a=1//let一样的结果
function fun(){
console.log(a)
}
fun();//1
let b2=1
function fun(){
console.log(b2)
let b2=5
}
fun();//报错 如果都是var的话是undefined
function fun(){
var a=1
}
fun();
console.log(a)//报错,因为a是局部变量,访问不到
注意,局部变量和全局变量问题
var a=1;
function fun(){
console.log(a)//1
a=2;
}
fun();
console.log(a)//2
var a=1;
function fun(){
console.log(a)//undefined
var a=2;
}
fun();
console.log(a)//1