很不解为啥很多地方都写成slice.call(arr)而不是arr.slice呢? 难道call这种调用是普通调用的更靠近底层的调用方式? 还是有效率上的提升或者其他什么的?
当a没有slice的方法时,就显式地call,相当于套用一个函数;
效率上前者要慢4倍以上
就是说slice.call(a)的时候,如果a没有该方法不会报错而a.slice会报错? 我看一些框架什么的源码很多都用XXX.call的形式,我以为效率会高呢,反而慢啊?
@shinka 当然会慢的啊~~~~~
{0:1,1:1,2:1} 这是个对象,没有slice方法要用前者
[1,1,1] 这个就直接用后者了
@seasonx4 哦哦 谢啦
做个测试比较下好了,比如下面这个站点 http://jsperf.com/test-call-vs-apply/3
谢啦 早上自己也稍微做过测试了 小数据量是直接调用性能较好 下午突然被告知要学ruby了…
var o={ 'xx':'xx', 'yy':'yy' } var ao=[] ao.push.call(o,'one','two','three','four'); //var o2=o.slice(1,3) Error! var o2=ao.slice.call(o,1,3) console.log(o2)//['two','three']
这段代码是不是相当于给o对象加了一个数组属性,然后如果调用数组的方法来操作o的话,只会影响到里面的那个数组属性而不会影响到键值对?
function t1 (obj) { obj.a = '123123' } function t2 () { this.a = '123123' } console.time('1') for (let i = 0; i < 100000000; ++i) { t1({}) } console.timeEnd('1') console.time('2') for (let i = 0; i < 100000000; ++i) { t2.call({}) } console.timeEnd('2')
简单对比了一下 call 和直接赋值的性能,从运行结果上可以看出 t1 的性能会比 t2 的性能高出差不多1倍,但整体上差距不大,感觉这个还是要结合实际的项目,更多的是考虑项目的结构上的问题吧,采用更加清晰的写法
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
当a没有slice的方法时,就显式地call,相当于套用一个函数;
效率上前者要慢4倍以上
就是说slice.call(a)的时候,如果a没有该方法不会报错而a.slice会报错? 我看一些框架什么的源码很多都用XXX.call的形式,我以为效率会高呢,反而慢啊?
@shinka 当然会慢的啊~~~~~
{0:1,1:1,2:1} 这是个对象,没有slice方法要用前者
[1,1,1] 这个就直接用后者了
@seasonx4 哦哦 谢啦
做个测试比较下好了,比如下面这个站点 http://jsperf.com/test-call-vs-apply/3
谢啦 早上自己也稍微做过测试了 小数据量是直接调用性能较好 下午突然被告知要学ruby了…
这段代码是不是相当于给o对象加了一个数组属性,然后如果调用数组的方法来操作o的话,只会影响到里面的那个数组属性而不会影响到键值对?
简单对比了一下 call 和直接赋值的性能,从运行结果上可以看出 t1 的性能会比 t2 的性能高出差不多1倍,但整体上差距不大,感觉这个还是要结合实际的项目,更多的是考虑项目的结构上的问题吧,采用更加清晰的写法