Array.prototype.concat不是通用方法反驳[译]


Posted in Javascript onSeptember 20, 2012

ECMAScript 5.1规范§15.4.4.4 中说到:

concat函数是有意设计成通用的;它并不要求它的this值必须得是个Array对象.因此,它可以被转移到其它类型的对象上作为方法来调用.

本文中的代码都使用了[]来作为Array.prototype的快捷方式.这已经是很常用的技巧了,虽然可读性差点:你通过一个对象实例访问到了Array.prototype上的方法.但是,这样的访问方式在现代的JavaScript引擎中非常之快,以至于我怀疑,说不定在这种调用方式下,这些JavaScript引擎可能已经不再创建数组实例了.本文中所有的例子都在Firefox和V8中尝试运行过.

让我们看一下concat到底是不是个通用方法:如果它是一个通用方法,则不管this的值是一个真实数组还是个类数组对象(拥有length属性,能通过索引访问每个元素),方法的返回结果都应该是一样的.我们首先尝试在数组上调用concat方法:

> ["hello"].concat(["world"]) 
["hello", "world"] > [].concat.call(["hello"], ["world"]) // 和上面的一样 
["hello", "world"]

然后,我们使用一个类数组对象来进行上面的连接操作.结果应该是一样的.

> [].concat.call({ 0: "hello", length: 1 }, ["world"]) 
[ { '0': 'hello', length: 1 }, 'world' ]

特殊变量arguments也是一个类数组对象.结果仍然不是我们所期望的:
> function f() { return [].concat.call(arguments, ["world"]) } 
> f("hello") 
[ { '0': 'hello' }, 'world' ]

真正的通用方法应该是这样的Array.prototype.push:

> var arrayLike = { 0: "hello", length: 1 }; 
> [].push.call(arrayLike, "world") 
2 
> arrayLike 
{ '0': 'hello', '1': 'world', length: 2 }

译者注:浏览器只是按照标准来实现,所以并不存在bug的问题.

Javascript 相关文章推荐
js 获取屏幕各种宽高的方法(浏览器兼容)
May 15 Javascript
javascript 闭包详解
Feb 15 Javascript
EasyUI的doCellTip实现鼠标放到单元格上提示单元格内容
Aug 24 Javascript
基于angularjs实现图片放大镜效果
Aug 31 Javascript
BootStrap实现文件上传并带有进度条效果
Sep 11 Javascript
angular2 ng2 @input和@output理解及示例
Oct 10 Javascript
JavaScript数据结构之优先队列与循环队列实例详解
Oct 27 Javascript
Vue中v-for的数据分组实例
Mar 07 Javascript
优雅的处理vue项目异常实战记录
Jun 05 Javascript
js实现指定时间倒计时效果
Aug 26 Javascript
vue中js判断长时间不操作界面自动退出登录(推荐)
Jan 22 Javascript
js实现随机点名
Jan 19 Javascript
JavaScript 用Node.js写Shell脚本[译]
Sep 20 #Javascript
一个简单的网站访问JS计数器 刷新1次加1次访问
Sep 20 #Javascript
javascript分页代码(当前页码居中)
Sep 20 #Javascript
javascript获取作用在元素上面的样式属性代码
Sep 20 #Javascript
一个基于jquery的文本框记数器
Sep 19 #Javascript
html中的input标签的checked属性jquery判断代码
Sep 19 #Javascript
基于jquery打造的百分比动态色彩条插件
Sep 19 #Javascript
You might like
查找php配置文件php.ini所在路径的二种方法
2014/05/26 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
2017/07/21 PHP
php 使用expat方式解析xml文件操作示例
2019/11/26 PHP
学习ExtJS Panel常用方法
2009/10/07 Javascript
window.location.hash 属性使用说明
2010/03/20 Javascript
JQuery中的$.getJSON 使用说明
2011/03/10 Javascript
用JS将搜索的关键字高亮显示实现代码
2013/11/08 Javascript
Javascript中获取对象的原型对象的方法小结
2015/02/25 Javascript
JavaScript 实现完美兼容多浏览器的复制功能代码
2015/04/28 Javascript
详解JavaScript数组和字符串中去除重复值的方法
2016/03/07 Javascript
详解js中==与===的区别
2017/01/08 Javascript
微信小程序实现获取自己所处位置的经纬度坐标功能示例
2017/11/30 Javascript
vue获取当前激活路由的方法
2018/03/17 Javascript
jQuery简单实现根据日期计算星期几的方法
2019/01/09 jQuery
Electron 调用命令行(cmd)
2019/09/23 Javascript
layui下拉列表select实现可输入查找的方法
2019/09/28 Javascript
Python运维自动化之nginx配置文件对比操作示例
2018/08/29 Python
python 使用pygame工具包实现贪吃蛇游戏(多彩版)
2019/10/30 Python
python使用正则来处理各种匹配问题
2019/12/22 Python
Python scrapy增量爬取实例及实现过程解析
2019/12/24 Python
Pytorch Tensor的统计属性实例讲解
2019/12/30 Python
Python如何解除一个装饰器
2020/08/07 Python
Python tkinter之Bind(绑定事件)的使用示例
2021/02/05 Python
莫斯科隐形眼镜网上商店:Linzi
2019/07/22 全球购物
高级护理专业毕业生推荐信
2013/12/25 职场文书
教学大赛获奖感言
2014/01/15 职场文书
售后服务承诺书
2014/03/26 职场文书
学校班班通实施方案
2014/06/11 职场文书
运动会演讲稿50字
2014/08/25 职场文书
个人汇报材料范文
2014/12/30 职场文书
2015年学雷锋活动总结
2015/02/06 职场文书
2015年农村党员公开承诺事项
2015/04/28 职场文书
2016高考寄语集锦
2015/12/04 职场文书
《思路决定出路》读后感3篇
2019/12/11 职场文书
利用For循环遍历Python字典的三种方法实例
2022/03/25 Python
Win11局域网共享权限在哪里设置? Win11高级共享的设置技巧
2022/04/05 数码科技