类数组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,'-');
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
因为
call这个方法是在 js 中Function.prototype上定义的。Function.prototype.call第一个参数接受一个修正后的this.所以任何函数都可以调用
call方法来修正this。当然也包括Array.prototype.join这个方法了。同意 @zp1996 的看法,也感谢他的提醒。
写一个
Array.prototype.join的pollyfill吧。虽然实际并不需要pollyfill上面的代码重写了
Array.prototype.join,只是简单阐述原理。可以看到,内部this实际上只使用了this.length,也就是说只要有length属性的Array或者Object或者其他任何,都可以通过修正this进行join方法的调用。其实原因很简单,看看V8源码就很轻松的知道,还可以知道为什么
join不传入参数时会默认采用,来进行连接:顺着这个顺序来看:
字符串能够调用的原因就是,
join过程利用的是for,而字符串也可以利用for进行遍历,也含有length可以用[i]下标获得相应的位置,所以字符串也可以调用Array.prototype.join方法。你在控制台输出一下Array.prototype.join,再看一下call的用法,就知道了。