Array,prototype.concat.apply与[].conat.apply.

一直都知道JS数组Array内置对象有一个concat方法,但是也没怎么研究过,今天偶然就看了看

concat是连接一个或多个数组

返回的是连接后数组的一个副本

var oldArr=[];

var arr=[[1,2,3],[4,5,6],[7,8,9],[10,11,12]];

var newArr=oldArr.conat(arr);

console.log(newArr);

console.log(oldArr);//[]  没有改变

于是乎 我又想到把数组的每一项都当成数组与oldArr连接

这就需要apply方法了 将数组变成参数列表传参

console.log(Array.prototype.concat.apply(Array,arr));

//结果很奇怪

没有得到想到的结果

箭头地方是什么鬼???

想了想

Array.prototype.concat.apply(Array,arr);

不就是Array调用了Array.prototype上的concat然后传入参数arr

把Array 换成Number String 等 不就是 借用Array.prototype上的concat方法罢了

然后把调用者添加到数组的0位置

我感觉就是 arr.unshift(Array);

其他情况的话就会 push 了

看下面的图就明白了吧

console.log(Array.prototype.concat.apply(Number,arr));

console.log(Array.prototype.concat.apply(String,arr));

console.log(Array.prototype.concat.apply(RegExp,arr));

好像是这么回事

所以 把aplly里面的参数改成[]不就好了

console.log(Array.prototype.concat.apply([],arr));

可以简单点写[].concat.apply([],arr);

数组不仅可以连接数组  数组还可以连接字符串  数字  对象  等

console.log([].concat({a:2,b:3,c:3}));

他会把对象放在数组里,这里就不能说连接了吧 我中有你嘛

console.log([].concat("123"}));

根据这些我总结出了  如果 concat传入的参数不是数组 就不会遍历 直接暴力添加到数组项

而参数是数组的话就会遍历

需要注意的是  千万不要傻傻的 用String.concat(); Number.concat()等

上面的是用apply方法改变this指向借用的

它本身没有concat

String.prototype里面有concat但是实现结果不一样滴!

只是我个人的理解 希望对大家有帮助

原文地址:https://www.cnblogs.com/liveoutfun/p/9195927.html

时间: 2024-11-10 14:16:47

Array,prototype.concat.apply与[].conat.apply.的相关文章

Array.prototype.push.apply(a,b)和Array.prototype.slice.call(arguments)

Array.prototype.push.apply(a,b) 时常看到在操作数组的时候有这样的写法: var a = [1,2,3]; var b = [4,5,6]; a.push.apply(a, b); console.log(a) //[1,2,3,4,5,6] 其实这样的写法等价于: var a = [1,2,3]; var b = [4,5,6]; Array.prototype.push.apply(a, b); console.log(a) //[1,2,3,4,5,6] 这样

数组方法 Array.prototype

Object.prototype 数组的值是有序的集合,每一个值叫做元素,每一个元素在数组中都有数字位置编号,也就是索引,js中数组是弱类型的,数组中可以含有不同类型的元素.数组元素甚至可以是对象或者其他数组 长度范围:1====2的23方-1 new Array(100)//undifind*100 arr[5]=10; arr.length//6 push() unshift() shift() pop() var Arr=[1,true,undifind,{x:1},[1,2,3]]; A

Array.prototype.push.apply

Array.prototype.push.apply(a,b) || a.push.apply(a,b);var a=[1,2,3],b=[4,5,6];Array.prototype.push.apply(a,b) a===[1, 2, 3, 4, 5, 6]b===[4, 5, 6] http://blog.csdn.net/maoguiyou/article/details/51433551

理解 Array.prototype.slice.apply

1. 首先,我们都理解在js中改变this引用有三种方法,call(), apply(), bind(): 2. bind方法是改变函数内this引用,简单不再描述; 3. 至于 call() 和 apply() 两个方法,区别在于,前者是不定长的入参,后者是一个数组:下边重点说apply方法使用; 原理: 我们知道js中存在一种类数组对象,比如 {0:1,length:1}    或者 DOM 对象,或者 arguments 对象: 数组只是一种特殊的对象,数组的特殊性体现在,它的键默认是按次

函数的属性length、prototype和方法call()、apply()

length指的是该函数所期望传递进来的参数个数. function fun0(){}             //0 function fun1(num1){}         //1 function fun2(num1,num2){}    //2 //prototype function MyObject(name, size)  { this.name = name; this.size = size; } var obj = new MyObject(); MyObject.prot

对数组的操作Array.prototype.sort 方法--alert( [1, 3, 9, 2].sort() )

1.   数组的 sort 方法 远远没有被充分利用,而且可能比开发者们想像的更加强大.很多开发者可能觉得 sort 方法可以用来做这种事情: [1, 3, 9, 2].sort(); // 返回 [1, 2, 3, 9] alert( [1, 3, 9, 2].sort() ) ……这没错,但它还有更强大的用法,比如这样: [ { name: "Robin Van PurseStrings", age: 30 }, { name: "Theo Walcott",

(转)Array.prototype.slice.call自解

很多框架或者库里面都会有这句的使用,最多的还是通过Array.prototype.slice.call(arguments,0)把arguments这个伪数组转换为真正的数组.但为什么可以这么做,却一直是半懂不懂的.昨天晚上看了mootools的源码,google了一下,终于彻底明白了. call方法的作用就不用多说了,Array.prototype.slice.call(arguments,0)就类似于arguments.slice(0),但因为arguments不是真正的Array,所以它没

理解Array.prototype.slice.call(arguments)

在很多时候经常看到Array.prototype.slice.call()方法,比如Array.prototype.slice.call(arguments),下面讲一下其原理: 1.基本讲解 1.在js里Array是一个类 slice是此类里的一个方法 ,那么使用此方法应该Array.prototype.slice这么去用 slice从字面上的意思很容易理解就是截取(当然你不是英肓的话) 这方法如何使用呢? arrayObj.slice(start, [end]) 很显然是截取数组的一部分.

【js】一些小技巧(1),关于Array.prototype.push,Array.prototype.slice的用法

阅读源码的时候会看到这样操作: 1.Array.prototype.push的介绍 var push = Array.prototype.push; push.apply(args, arguments); 为什么会用push.apply,而不是直接push呢? //push.apply var a = [1,2,3] , b = [4,5,6],push = Array.prototype.push; push.apply(a,b) ; console.log(a)  // [1, 2, 3,