JavaScript 字符串乘法 |
本文标签:字符串,乘法 原文地址:http://www.davidflanagan.com/2009/08/string-multipli.html 复制代码 代码如下: 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 的带一个参数的构造器时,仅仅是设置了数组的长度,实际上并没有创建数组的元素 。 我仅在 Firefox 下对其做了测试,我估计它会比普通的循环更加有效,但我并没有进行基准测试 。 作者简介 David Flanagan 是一个醉心于Java写作的计算机程序员,他的大部分时间都致力于编写Java相关图书 。David 在麻省理工学院获得了计算机科学于工程学位 。他生活在地处西雅图和温哥华之间的美国太平洋西北海岸 。他在OReilly出版的畅销书有《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 采纳了我的建议,他又为我们写了一段非递归的版本 。请参看他的博客原文:http://www.davidflanagan.com/2009/08/good-algorithms.html 联系方式 我的邮箱,欢迎来信(redraiment@gmail.com) |