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 相关文章推荐
浅谈tudou土豆网首页图片延迟加载的效果
Jun 23 Javascript
JS 操作符整理[推荐收藏]
Nov 15 Javascript
jquery控制表单输入框显示默认值的方法
May 22 Javascript
基于Bootstrap实现Material Design风格表单插件 附源码下载
Apr 18 Javascript
学习AngularJs:Directive指令用法(完整版)
Apr 26 Javascript
JS Attribute属性操作详解
May 19 Javascript
Vue.js学习示例分享
Feb 05 Javascript
JS中的数组转变成JSON格式字符串的方法
May 09 Javascript
weui框架实现上传、预览和删除图片功能代码
Aug 24 Javascript
vue加载自定义的js文件方法
Mar 13 Javascript
vue-cli 2.*中导入公共less文件的方法步骤
Nov 22 Javascript
JS module的导出和导入的实现代码
Feb 25 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
在线增减.htpasswd内的用户
2006/10/09 PHP
Linux下手动编译安装PHP扩展的例子分享
2014/07/15 PHP
PHP实现163邮箱自动发送邮件
2016/03/29 PHP
PHP的Yii框架中View视图的使用进阶
2016/03/29 PHP
tp5 sum某个字段相加得到总数的例子
2019/10/18 PHP
用js来定义浏览器中一个左右浮动元素相对于页面主体宽度的位置的函数
2012/01/21 Javascript
基于jquery的用鼠标画出可移动的div
2012/09/06 Javascript
js Map List 遍历使用示例
2013/07/10 Javascript
jQuery多个input求和的实现方法
2015/02/12 Javascript
学习JavaScript设计模式之责任链模式
2016/01/18 Javascript
移动端点击态处理的三种实现方式
2017/01/12 Javascript
JavaScript中的 new 命令
2019/05/22 Javascript
js刷新页面location.reload()用法详解
2019/12/09 Javascript
[15:09]DOTA2国际邀请赛采访专栏:Loda
2013/08/06 DOTA
[58:12]Ti4第二日主赛事败者组 LGD vs iG 3
2014/07/21 DOTA
[52:02]DOTA2-DPC中国联赛 正赛 Phoenix vs Dragon BO3 第二场 2月26日
2021/03/11 DOTA
Python 专题二 条件语句和循环语句的基础知识
2017/03/19 Python
利用python模拟sql语句对员工表格进行增删改查
2017/07/05 Python
Django中间件工作流程及写法实例代码
2018/02/06 Python
详谈Numpy中数组重塑、合并与拆分方法
2018/04/17 Python
让Django支持Sql Server作后端数据库的方法
2018/05/29 Python
Django 多环境配置详解
2019/05/14 Python
Ranorex通过Python将报告发送到邮箱的方法
2020/01/12 Python
Python定时从Mysql提取数据存入Redis的实现
2020/05/03 Python
HTML5混合开发二维码扫描以及调用本地摄像头
2017/12/27 HTML / CSS
盛大二次面试题
2016/11/18 面试题
公司董事长职责
2013/12/12 职场文书
新郎新娘婚礼答谢词
2014/01/11 职场文书
大型晚会策划方案
2014/02/06 职场文书
秸秆管理实施方案
2014/03/15 职场文书
2015年高考寄语或鼓励的话
2015/03/23 职场文书
企业财务人员岗位职责
2015/04/14 职场文书
2015年村计划生育工作总结
2015/04/28 职场文书
撤诉申请书法院范本
2015/05/18 职场文书
PHP获取学生成绩的方法
2021/11/17 PHP
SQL基础查询和LINQ集成化查询
2022/01/18 MySQL