es6let和const跟var的区别?
1.变量提升问题
- 在es5中var存在变量提升的问题(将变量提升到作用域的最顶部)。即变量可以在生病之前调用值问未定义(undefined)
- let和const不存在变量提升。即它们所声明的变量一定在声明后使用,否则报ReferenceError的粗
2.暂时性死区
let和const都存在暂时性死区。即只要块级作用域内存在let命令,它所声明的变量就“绑定”这个区域不受外部的影响。
在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上称为“暂时性死区”。
总之,暂时性死区的本质就是,只要进入当前作用域,所要使用的变量就已经存在了,但是不可获取。
3.不能重复声明
- var允许重复声明变量
- let和const不能重复声明变量
4.作用域不同
什么是块级作用域:
ES5中作用域有:全局作用域、函数作用域。没有块作用域的概念。因此也有一系列的问题。
- var 不存在块级作用域
- let和const存在块级作用域
5.修改变量
- var和let可以。
- const声明一个只读的常量。一旦声明,常量的值就不能改变。const声明的变量不得改变值,这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值。
一、箭头函数和普通函数的区别
1.箭头函数是匿名函数,不能作为构造函数,不能使用new
let fun =()=>{
console.log("我是箭头函数")
}
function fun(){
consloe.log("我是普通函数")
}
箭头函数相当于匿名函数,并且简化了函数定义。箭头函数有两种格式:一种只包含一个表达式,连{ … }和return都省略掉。还有一种可以包含多条语句,这时候就不能省略{ … }和return。
不能作为构造函数,不能使用new
二、箭头函数内没有arguments,可以用展开运算符…解决
function A(a){
console.log(arguments)
}
A(1,2,3,4,5)
let B=(b)=>{
console.log(arguments)
}
B(2,5,64,4,6)
let c=(...c)=>{
console.log(c)
}
c(2,569,5,56,54,21,23)
虽然arguments对象并不是一个数组(类数组),但是访问单个参数的方式与访问数组元素的方式相同
三、箭头函数的this,始终指向父级上下文(箭头函数的this取决于定义位置父级的上下文,跟使用位置没关系,普通函数this指向调用的那个对象)
var a=200
let obj={
a:100,
fn:function(){
console.log(this.a);//es5 谁调用this指向谁
},
foo:()=>{
console.log(this.a);//es6箭头函数的this指向父级(obj)上下文
}
}
obj.fn()
obj.foo()
四、箭头函数不能通过call() 、 apply() 、bind()方法直接修改它的this指向。(call、aaply、bind会默认忽略第一个参数,但是可以正常传参)
let obj={
a:10
b:function(n){
let f=(n)=> n+this.a;
return f(n)
},
c:function(n){
let f=(n)=> n+this.a;
let m={
a:20
};
return f.call(m,n)
},
};
console.log(obj.b(1));//11
console.log(obj.c(1));//因为call无法改变this指向所以还是11
五、箭头函数没有原型属性
箭头函数里面没有prototype;