前端面试题总结二(js)

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值