函数
arguments没有形参接收时,在函数体内部可接受所有传入的实参,以数组形式存储
<script>
let a=()=>{
console.log(arguments); //会报错,ES6箭头函数没有arguments
}
var func=()=>{
console.log(this) //箭头函数里没有this对象,此时的this是外层的this对象,即window
}
</script>
SetTimeout和=>箭头函数都指向window
<script>
func:function(){ //function()指向自身,若写的是=>则指向W
}
</script>
this尽量不要在.addEventListener 使用箭头函数=>,会取不到元素,尽量用function
箭头函数的特性
- 不绑定arguments,用rest参数…解决
- 本身没有this概念,捕获其所在上下文的this值,作为自己的this值,this指向全局
- 箭头函数不能使用new(会报错)
- 箭头函数没有原型属性(prototype)
- 箭头函数不能当做Generator函数,不能使用yield关键字
- 箭头函数不能换行
- 箭头函数可以立即执行
- 箭头函数有constructor , length属性
改变this指向方式
- 使用SetTimeout
- 在指定位置定义this存为变量
- 箭头函数=>
- 使用call()方法
<script>
obj.myFun.call();//添加方式,不能添加数组
</script>
- 使用bind()方法
<script>
obj.myFun.bind(obj1,[" " , " "] , " ");//添加方式,可以添加数组
</script>
- 使用apply()方法
call , apply , bind区别
- apply、call、bind他们三个都能改变函数this的指向问题
- apply、call这两个方法的主动调用,bind返回的是改变this指向后的新函数
- 传参的问题区别,call和bind都是直接传递参数,apply传递的是数组
ES6对象
深拷贝
A 红色, B红色 , C蓝色。修改C , A改变B不改变
浅拷贝
A 红色, B红色 , C蓝色。修改C , A和B都一起改变
浅拷贝新方法
<script>
Object.assign(目标对象.源对象,{ })
</script>
<script>
Array.isArray(obj) //判断是数组或对象
</script>
<script>
//递归
function deepClone(obj){
let objClone = Array.isArray(obj)?[]:{};
if(obj && typeof obj==="object"){
for(key in obj){
if(obj.hasOwnProperty(key)){
//判断ojb子元素是否为对象,如果是,递归复制
if(obj[key]&&typeof obj[key] ==="object"){
objClone[key] = deepClone(obj[key]);
}else{
//如果不是,简单复制
objClone[key] = obj[key];
}
}
}
}
return objClone;
}
let a=[1,2,3,4],
b=deepClone(a);
a[0]=2;
console.log(a,b);
let arr = [1,2,3];
let arr1 = arr;
console.log(arr==arr1);
arr[0] = 99;
console.log(arr1);
console.log(arr==arr1);
</script>