此篇文章前半部分都在介绍真伪数组转换的涉及的相关js方法,原理。
想要直接看真伪数组转化的具体方法可以直接看文章的最后一节“总结真伪数组的转换”。
注意:文章内所有的arr均为真数组的命名,obj及res为伪数组的命名。
this:谁调用就是谁
例如:
function test() {
console.log(this);//打印window。this是谁调用就是谁.此时this是window
}
test();
var arr = [1, 3, 5, 7, 9];//真数组
var likeArr = {0:"1", 1:"edr", 3:"adsf", length:3};//伪数组
console.log(typeof arr);//object
console.log(typeof likeArr );//打印数组类型object
console.log(arr.toString());//真数组会拼接为一个元素返回
console.log(likeArr .toString());//打印[object object]
console.log(({}).toString.apply(arr));//{}:代表对象;找到对象的toString,将对象toString中的this改为arr 结果为[object Array]
function test() {
console.log(this);//打印obj。this是谁调用就是谁
}
var obj = {"name":"lnj" };
window.test.apply(obj);//打印 {"name":"lnj" }
window.test.call(obj);//打印 {"name":"lnj" }
function sum(a, b) {
console.log(this);
console.log(a + b);
}
window.sum.call(obj, 1, 2);//打印 {"name":"lnj" } 3
window.sum.apply(obj, [3, 5]);;//打印 {"name":"lnj" } 8
var arr2 = [1, 3, 5, 7, 9];
var res1 = arr2.slice();//[1, 3, 5, 7, 9];
var res2 = arr2.slice(2);//从脚标2开始截取,结果为5,7,9
var res3 = arr2.slice(2, 4);//从脚标2开始截取,到脚标4为止,不包括脚标4,结果为5, 7
###
var arr = [];
arr.push(1);//将1添加到arr数组中
console.log(arr);
var arr = [1, 3, 5, 7, 9];
var obj = {}
[].push.apply(obj, arr);//将arr中的数字依次取出来push给obj
console.log(obj);//{ 0:1,1:3,2:5,3:7,4:9,length:5 }
我是div
我是div
我是div
var res = document.querySelectorAll("div");//找到界面上所有的div,返回的对象res就是系统自带的伪数组。
console.log(res);//系统自带的伪数组
var obj = {0:"lnj", 1:"33", length:2};
var res = document.querySelectorAll("div");//系统自带的伪数组
var obj = {0:"lnj", 1:"33", length:2};//自定义伪数组
var arr = [];//先定义一个真数组
[].push.apply(arr, res);//系统自带伪数组转换为真数组
[].push.apply(arr, obj);//自定义的伪数组转换为真数组,IE8以下的浏览器不可以(解决办法:IE8以下浏览器使用slice方法,并且不传参数)
var obj = {0:"lnj", 1:"33", length:2};
var arr3 = [].slice.call(obj);//将内部的this改为自定义的伪数组obj,slice:将this中的每一个元素放到一个新的数组中原样返回
伪数组快速转换为真数组:[].slice.call(obj);
真数组快读转换为伪数组:[].push.apply(obj , arr);