改变this指向的三个方式
var obj1={
name:"obj1",
grtName:function(){
console.log("getName1",)
}}
obj1.getName()
第一种:call()
var obj1={
name:"obj1",
grtName:function(){
console.log("getName1",)
}}
obj1.getName()
var obj2={
name:"obj2",
grtName:function(){
console.log("getName2",)
}}
obj1.getName.call(obj2,1,2,3,...,N) //可以传递N个参数
第二种:apply()
obj1.getName.apply(obj2,[1,2,3...,N]) //只支持两个,且第二个参数是一个数组
第三种:bind()
//改变this指向为函数的第一个参数,不会自动执行函数
var newFun=obj1.getName.bind(obj2,1,2,3,....)
console.log(newFun)
newFun() //手动执行
let和var的区别
(1)let不能在未定义前使用,var可以。
(2)let不能重复定义,var可以。
(3)let是块级作用域,而var的作用域更广
const也和var有这三点的不同
const和let的区别
(1)const定义的是常量,let定义的是变量
箭头函数
//原始
var test1=function(){
console.log("11111")
}
//箭头函数
var test2=()=>{
console.log(2222)
}
test1()
test2()
箭头函数的特点
1.()可以省略,但是在只有一个形参参数的情况下
//省略写法
var test = a =>{
console.log(111,a)}
//原始
var test = (a) =>{
console.log(111,a)}
2.{}可以省略,只有一句代码的时候(只有返回值)
var test = a =>{
return 100*a
}
//省略写法
var test = a => 100*a
var list=["aaa","bbb","ccc"]
var newlist=list.map(function(item){
return `<li>${item}</li>`})
console.log(newlist.join(""))
//省略写法
var list=["aaa","bbb","ccc"]
var newlist=list.map(item=> `<li>${item}</li>`)
console.log(newlist.join(""))
3.没有arguments(伪数组)
var test=function(){
console.log(arguments[0],arguments[1],arguments[2])
}
test(1,2,3)
//伪数组转换
Array.from(arguments)
4.箭头函数没有this,
箭头函数this是父级作用域的
ES6的解构赋值
var arr=["xiaoming","zhangsan","lisi"]
let[x,y]=arr
console.log(x,y)
//不能直接拿最后一个值,而是以占位的形式依次取值
//交换两个变量的值
var a=10
var b=20
var[b,a]=[a,b]
console.log(a,b) //交换后a=20,b=10
//多维数组的获取
var arr2=[1,2,[3,4,[5]]]
var[q,w,[e,r,[t]]]=arr2
console.log(t) //5
var obj={
name:"zhangsan",
age"15",
place:"dongbei"
}
let{name,age,place:myplace}=obj
document.write(name)
document.write(age)
document.write(myplace)
var obj2={
name:"zhangsan",
age:"15",
place:{
province:"beijing",
city:"China"},
hobby:[1,2,3]
}
var {
name,
age,
place:{
province,
city},
hobby:[m,n,l]
}=obj2
console.log(name,age,province,city,m,n,l)