JavaScript字符串乘法
复制代码代码如下:
String.prototype.times = function(n) {
return Array.prototype.join.call({length:n+1}, this);
};
"js".times(5) // => "jsjsjsjsjs"
这个⽅法是调⽤⼀个由元素全为“undefined”的数组的Array.join()⾏为。但是它并没有真正创建⼀个包含 n+1 个“undefined”元素的数组。它利⽤⼀个包含 length 属性的匿名对象,依靠 Array 对象的原型函数 join()。因为 “Object” 不是数组,不能直接调⽤ join(),因此不得不通过原型的 call() 来实现。下⾯给出⼀个同样效果的简单版本:
复制代码代码如下:
String.prototype.times = function(n) { return (new Array(n+1)).join(this);};
当我们调⽤ Array 的带⼀个参数的构造器时,仅仅是设置了数组的长度,实际上并没有创建数组的元素。
字符串函数的length属性我仅在 Firefox 下对其做了测试,我估计它会⽐普通的循环更加有效,但我并没有进⾏基准测试。
作者简介
David Flanagan 是⼀个醉⼼于Java写作的计算机程序员,他的⼤部分时间都致⼒于编写Java相关图书。David 在⿇省理⼯学院获得了计算机科学于⼯程学位。他⽣活在地处西雅图和温哥华之间的美国太平洋西北海岸。他在O'Reilly出版的畅销书有《Java in a Nutshell》、《Java Foundation Classes in a Nutshell》、《Java Enterprise in a Nutshell》、《JavaScript: The Definitive Guide》、《JavaScript Pocket Reference》以及《The Ruby Programming Language》等。
我的评论
如果要考虑效率的话,对循环迭代稍作优化可能效率更⾼。⽐如下⾯这段递归调⽤,算法复杂度是O(log2n)。在Google Chrome下测试结果是⽐ David 的⽅法执⾏更快,但不得不承认他的⽅法很优雅!
复制代码代码如下:
String.prototype.times = function(n) {
if ( n == 1 ) {
return this;
}
var midRes = this.times(Math.floor(n/2));
midRes += midRes;
if ( n % 2 ) {
midRes += this;
}
return midRes;
}
后记
David 采纳了我的建议,他⼜为我们写了⼀段⾮递归的版本。请参看他的博客原⽂:
www.davidflanagan/2009/08/good-algorithms.html
联系⽅式
我的邮箱,欢迎来信(redraiment@gmail)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论