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但是实现结果不一样滴!
只是我个人的理解 希望对大家有帮助
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 ...
- 数组方法 Array.prototype
Object.prototype 数组的值是有序的集合,每一个值叫做元素,每一个元素在数组中都有数字位置编号,也就是索引,js中数组是弱类型的,数组中可以含有不同类型的元素.数组元素甚至可以是对象或者 ...
- Array.prototype
Array.prototype 属性表示 Array 构造函数的原型,并允许您向所有Array对象添加新的属性和方法. /* 如果JavaScript本身不提供 first() 方法, 添加一个返回 ...
- [转] 理解 JavaScript 中的 Array.prototype.slice.apply(arguments)
假如你是一个 JavaScript 开发者,你可能见到过 Array.prototype.slice.apply(arguments) 这样的用法,然后你会问,这么写是什么意思呢? 这个语法其实不难理 ...
- Function.prototype.bind、call与apply
学习Function.prototype.bind.call与apply时,看到一篇博客,学到一些内容,但由于博客时间太久,根据官方文档对内容进行一些修正:下文为修正过内容 前言 前段时间面试遇见一题 ...
- JS - caller,callee,call,apply [transfer] aA ==> apply uses an array [] as the second argument. call uses different argument.
在提到上述的概念之前,首先想说说javascript中函数的隐含参数:arguments Arguments : 该对象代表正在执行的函数和调用它的函数的参数. [function.]argument ...
- javascript 一些函数的实现 Function.prototype.bind, Array.prototype.map
* Function.prototype.bind Function.prototype.bind = function() { var self = this, context = [].shift ...
- (转)Array.prototype.slice.call自解
很多框架或者库里面都会有这句的使用,最多的还是通过Array.prototype.slice.call(arguments,0)把arguments这个伪数组转换为真正的数组.但为什么可以这么做,却一 ...
- 详解 Array.prototype.slice.call(arguments)
首先,slice有两个用法,一个是String.slice,一个是Array.slice,第一个返回的是字符串,第二个返回的是数组 在这里我们看第二个方法 1.在JS里Array是一个类 slice是 ...
随机推荐
- CMDB服务器管理系统【s5day88】:采集资产-文件配置(一)
django中间件工作原理 整体流程: 在接受一个Http请求之前的准备 启动一个支持WSGI网关协议的服务器监听端口等待外界的Http请求,比如Django自带的开发者服务器或者uWSGI服务器. ...
- Spark源码剖析 - SparkContext的初始化(一)
1. SparkContext概述 注意:SparkContext的初始化剖析是基于Spark2.1.0版本的 Spark Driver用于提交用户应用程序,实际可以看作Spark的客户端.了解Spa ...
- 第三节:总结.Net下后端的几种请求方式(WebClient、WebRequest、HttpClient)
一. 前言 前端调用有Form表单提交,ajax提交,ajax一般是用Jquery的简化写法,在这里不再过多介绍: 后端调用大约有这些:WebCient.WebRequest.Httpclient.W ...
- Generator和Coroutine学习
简单的生产者消费者模型 #!/usr/bin/python2.7 def consumer(): while True: newn = yield print 'Consumer : {}'.form ...
- [物理学与PDEs]第5章习题3 第二 Piola 应力张量的对称性
试证明: 在物质描述下, 动量矩守恒定律等价于第二 Piola 应力张量的对称性. 证明: 由 $$\beex \bea \int_{G_t}\rho\sex{{\bf y}\times\cfrac{ ...
- jquery 倒计时效果
function daojishi(){ var starttime = new Date("2017-09-30 01:06:11"); //date的格式也可以写成:" ...
- COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误: 80070005 拒绝访问。最新解决方案
检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误: 80070005 拒绝访问. (异常来自 HRE ...
- win10设置vscode的终端为管理员权限
右击vscode 点击属性选择兼容性,勾选 “以管理员身份运行此程序” 确定即可!
- Java 自定义hashmap和hashtable的key注意哪些问题
- Chrome 远程代码执行漏洞CVE-2019-5786-EXP
0x01 漏洞原理 CVE-2019-5786是位于FileReader中的UAF漏洞,由Google's Threat Analysis Group的Clement Lecigne于2019-02- ...