javascript - 类数组对象,call()方法
巴扎黑
巴扎黑 2017-04-11 10:37:33
[JavaScript讨论组]

类数组var a={

'0':'a',
'1':'b',
'2':'c',
length:3

};
为什么使用
Array.prototype.join.call(a,'+'); //"a+b+c"就可以调用数组的join方法?
又如s='javascript';Array.prototype.join.call(s,'-');

巴扎黑
巴扎黑

全部回复(3)
ringa_lee

因为call这个方法是在 js 中 Function.prototype上定义的。

Function.prototype.call第一个参数接受一个修正后的this.

所以任何函数都可以调用call方法来修正this。当然也包括Array.prototype.join这个方法了。


同意 @zp1996 的看法,也感谢他的提醒。

写一个Array.prototype.joinpollyfill 吧。虽然实际并不需要 pollyfill

Array.prototype.join = function (str) {
    var hyphen = (str && typeof str === 'string') ? str : ',';
    var result = '';
    for (var i = 0, l = this.length; i < l - 1; i++) {
        result += this[i] + hyphen;
    }
    result += this[i];
    return result;
}

上面的代码重写了Array.prototype.join,只是简单阐述原理。可以看到,内部this实际上只使用了this.length,也就是说只要有length属性的Array或者Object或者其他任何,都可以通过修正this进行join方法的调用。

PHP中文网

其实原因很简单,看看V8源码就很轻松的知道,还可以知道为什么join不传入参数时会默认采用,来进行连接:
顺着这个顺序来看:

ArrayJoin -> InnerArrayJoin -> Join -> DoJoin

字符串能够调用的原因就是,join过程利用的是for,而字符串也可以利用for进行遍历,也含有length可以用[i]下标获得相应的位置,所以字符串也可以调用Array.prototype.join方法。

黄舟

你在控制台输出一下Array.prototype.join,再看一下call的用法,就知道了。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号