JavaScript 字符串乘法


Posted in Javascript onAugust 20, 2009

原文地址:http://www.davidflanagan.com/2009/08/string-multipli.html
原作者:David Flanagan
在Ruby中,“*”操作符用一个字符串作为左边参数,一个数字作为右边参数,来实现字符串重复。例如,"Ruby" * 2 的值为 "RubyRuby"。这仅在少数地方有用(例如,生成一张由连字符等ASCII 码字符构成的表格),但是非常简洁。而且好过写一个循环来连接n次字符串——这样显得很没效率。

我刚刚发现在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 的带一个参数的构造器时,仅仅是设置了数组的长度,实际上并没有创建数组的元素。

我仅在 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 采纳了我的建议,他又为我们写了一段非递归的版本。请参看他的博客原文:http://www.davidflanagan.com/2009/08/good-algorithms.html
联系方式
我的邮箱,欢迎来信(redraiment@gmail.com)
Javascript 相关文章推荐
javascript中字符串拼接需注意的问题
Jul 13 Javascript
使用js检测浏览器的实现代码
May 14 Javascript
jquery+php随机生成红包金额数量代码分享
Aug 27 Javascript
功能强大的Bootstrap使用手册(一)
Aug 02 Javascript
微信小程序 教程之小程序配置
Oct 17 Javascript
seajs模块之间依赖的加载以及模块的执行
Oct 21 Javascript
Angular2 PrimeNG分页模块学习
Jan 14 Javascript
BootStrap 弹出层代码
Feb 09 Javascript
浅谈JS如何实现真正的对象常量
Jun 25 Javascript
vue2.0与bootstrap3实现列表分页效果
Nov 28 Javascript
详解vue开发中调用微信jssdk的问题
Apr 16 Javascript
el-table树形表格表单验证(列表生成序号)
May 31 Javascript
javascript 短路法代码精简
Aug 20 #Javascript
斜45度寻路实现函数
Aug 20 #Javascript
javascript 多级checkbox选择效果
Aug 20 #Javascript
调用js时ie6和ie7,ff的区别
Aug 19 #Javascript
jquery 入门教程 [翻译] 推荐
Aug 17 #Javascript
jQuery select控制插件
Aug 17 #Javascript
javascript 无提示关闭窗口脚本
Aug 17 #Javascript
You might like
WAR3重制版DOTA 5V5初体验
2020/04/09 DOTA
IIS下配置Php+Mysql+zend的图文教程
2006/12/08 PHP
PHP使用反向Ajax技术实现在线客服系统详解
2019/07/01 PHP
JavaScript 组件之旅(一)分析和设计
2009/10/28 Javascript
在chrome中window.onload事件的一些问题
2010/03/01 Javascript
JQuery1.4+ Ajax IE8 内存泄漏问题
2010/10/15 Javascript
angularjs中的e2e测试实例
2014/12/06 Javascript
jquery获取checkbox的值并post提交
2015/01/14 Javascript
详解JavaScript函数
2015/12/01 Javascript
jquery实现简单的全选和反选功能
2016/01/02 Javascript
微信小程序中单位rpx和rem的使用
2016/12/06 Javascript
详解如何实现一个简单的Node.js脚手架
2017/12/04 Javascript
Javasript设计模式之链式调用详解
2018/04/26 Javascript
[59:15]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第一场 11.20
2020/11/20 DOTA
python 从远程服务器下载东西的代码
2013/02/10 Python
python数据结构之二叉树的建立实例
2014/04/29 Python
python中split方法用法分析
2015/04/17 Python
深入解析Python中的urllib2模块
2015/11/13 Python
python中range()与xrange()用法分析
2016/09/21 Python
windows下ipython的安装与使用详解
2016/10/20 Python
详解python使用turtle库来画一朵花
2019/03/21 Python
python使用BeautifulSoup与正则表达式爬取时光网不同地区top100电影并对比
2019/04/15 Python
使用wxpy实现自动发送微信消息功能
2020/02/28 Python
Python pexpect模块及shell脚本except原理解析
2020/08/03 Python
使用html2canvas.js实现页面截图并显示或上传的示例代码
2018/12/18 HTML / CSS
阿拉伯世界最大的电子商务网站:Souq沙特阿拉伯
2016/10/28 全球购物
社团活动策划书范文
2014/01/09 职场文书
物业招聘计划书
2014/01/10 职场文书
总经理的岗位职责
2014/02/23 职场文书
教师一岗双责责任书
2014/04/16 职场文书
网络技术专业求职信
2014/05/02 职场文书
2015年成本会计工作总结
2015/10/14 职场文书
2016全国“质量月”活动标语口号
2015/12/26 职场文书
CSS中em的正确打开方式详解
2021/04/08 HTML / CSS
Springboot如何同时装配两个相同类型数据库
2021/11/17 Java/Android
Python字符串格式化方式
2022/04/07 Python