一:真数组转换为伪数组建议用push方法
push
是数组原型链上的方法,哪个数组调用,push
的this
就指向谁,apply
改变了this
,指向obj
,obj
上面是没有push
的
1:通过[].push找到数组中的push方法(就是因为obj没有push方法,所以才找[]调用push方法,再把目标指向obj)
2:通过apply(obj)将找到的push方法内部的this修改为自定义的对象obj
3:将传入数组中的元素依次取出,传递给形参
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script>
var arr=[1,3,4];
var obj={};
/*
push是数组原型链上的方法,哪个数组调用,push的this就指向谁,apply改变了this,指向obj,obj上面是没有push的
1:通过[].push找到数组中的push方法(就是因为obj没有push方法,所以才找[]调用Push方法,再把目标指向obj)
2:通过apply(obj)将找到的push方法内部的this修改为自定义的对象obj
3:将传入数组中的元素依次取出,传递给形参
*/
[].push.apply(obj,arr);
console.log(obj);
</script>
</head>
<body>
</body>
</html>
二:伪数组转换为真数组建议用slice方法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script>
window.onload = function (ev) {
//系统自带的伪数组
var res = document.querySelectorAll('div');
// console.log(res);
//自定义的伪数组
var obj = {
0: 'x',
1: 's',
length: 2
};
var arr = []; //真数组
[].push.apply(arr, res);
// console.log(arr);
//如果浏览器版本低,则可用slice方法,不传参数
//如果slice方法什么参数都没有传递,会将数组中的元素放到一个新的数组中原样返回
var arr2 = [1, 3, 5, 7];
var res2 = arr2.slice();
// console.log(res2);
var arr3 = [].slice.apply(obj); //先将slice方法内部的this修改为自定义的对象obj, slice里没有传参
console.log(arr3);
}
</script>
</head>
<body>
<div>我是div</div>
<div>我是div</div>
<div>我是div</div>
</body>
</html>