这数组为什么不能直接push而要调用push.apply来调用?

MikeDDT009 2019-03-11 06:08:40
照例啰嗦前言:
必须说,最近看《JavaScript高级程序设计》,基本从4章的作用域链开始就大脑就开始进入浆糊状态,于是不纠结跳过一部分打算先看看后续内容先大致过一遍吧,必须说,JS给我的感觉精华都是主要集中在了Function类型,也就是方法,这类型如果能完全搞明白的话基本这门语言就能非常轻松的学习了,当然目前看着是真的头大,非常非常的绕。

大概过到构造函数这部分看到一段构造函数的例子,里面对一个数组进行push方法的apply绕一下的调用,然后自己测试了下直接按照常理该走的调用,结果就是错误的,直接就完全迷糊,干脆走DEBUG打算看看内部到底发生了什么,然而push方法是本地方法,无法看到具体的实现,也就没法观察下this到底发生了什么,只能发出弱鸡的惊呼”什么鬼啊“。下面先贴上代码


function SpecialArray(){
//创建数组
var values = new Array();
//赋值----------这里就是疑惑的地方
values.push.apply(values,arguments);
//添加方法
values.toPipedString = function(){
return this.join("|");

};
//返回数组
return values;

}
var colors = new SpecialArray("red","blue","green");
alert(colors.toPipedString());

为什么非得通过push方法的apply方法来调用,为什么不是values.push(参数),必须说这样说着方法的方法感觉略别扭
...全文
600 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
風灬雲 2019-03-12
  • 打赏
  • 举报
回复 1
这里是利用了apply和call的区别,比如说 new SpecialArray("red","blue","green");执行这个方法; "red","blue","green"这些参数存在数量的不确定性;那么想要全部获取这些参数,arguments当然是最好的选择;但是arguments是一个类数组,如果直接push(arguments),就变成了把所有参数都放在一个数组里面,返回结果会是这样[arguments]==>[["red","blue","green"]] 但是values.push.apply(values,arguments)的结果相当于values.push("red","blue","green")==>["red","blue","green"]
Hello World, 2019-03-12
  • 打赏
  • 举报
回复
arguments代表传递给函数的参数集合,是一个数组,但是push不支持数据,只能是单个或者多个参数,使用apply可以巧妙的将数组应用于push。call和apply的区别,一个是接受单个数,一个接收数组,更多的可以了解:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/apply
南风吹过去 2019-03-11
  • 打赏
  • 举报
回复
push方法参数为一个或多个元素,当然如果这本书发生在es6以后 就可以优雅的写成 values.push(...arguments) 但是如果没有es6 那么常规写法必须遍历arguments 一个一个把参数push进来 因此按照书中写法比较简洁优雅

87,993

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧