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引用对象的方法代码
Aug 13 Javascript
用Javascript实现锚点(Anchor)间平滑跳转
Sep 08 Javascript
Javascript面向对象扩展库代码分享
Mar 27 Javascript
JS 各种网页尺寸判断实例方法
Apr 18 Javascript
jquery表单验证需要做些什么
Nov 17 Javascript
bootstrap paginator分页前后台用法示例
Jun 17 Javascript
vue综合组件间的通信详解
Nov 06 Javascript
javascript Function函数理解与实战
Dec 01 Javascript
Vue Echarts实现可视化世界地图代码实例
May 07 Javascript
bootstrap-table+treegrid实现树形表格
Jul 26 Javascript
JS正则表达式常见函数与用法小结
Apr 13 Javascript
js实现文章目录索引导航(table of content)
May 10 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
php 操作符与控制结构
2012/03/07 PHP
[原创]php实现数组按拼音顺序排序的方法
2017/05/03 PHP
PHP CURL实现模拟登陆并上传文件操作示例
2020/01/02 PHP
javascript 模拟点击广告
2010/01/02 Javascript
javascript中的undefined 与 null 的区别  补充篇
2010/03/17 Javascript
关于js中alert弹出窗口文本换行问题简单详细说明
2012/12/11 Javascript
详细分析JavaScript函数定义
2015/07/16 Javascript
如何解决ligerUI布局时Center中的Tab高度大小
2015/11/24 Javascript
js仿腾讯QQ的web登陆界面
2016/08/19 Javascript
原生js实现弹出层登录拖拽功能
2016/12/05 Javascript
SVG动画vivus.js库使用小结(实例代码)
2017/09/14 Javascript
最实用的JS数组函数整理
2017/12/05 Javascript
浅析js中mvvm模式实现的原理
2018/10/06 Javascript
Vue.js 中的 v-model 指令及绑定表单元素的方法
2018/12/03 Javascript
Sublime Text3 配置 NodeJs 环境的方法
2020/05/20 NodeJs
python脚本实现查找webshell的方法
2014/07/31 Python
python+selenium实现京东自动登录及秒杀功能
2017/11/18 Python
使用Python获取网段IP个数以及地址清单的方法
2018/11/01 Python
python Matplotlib底图中鼠标滑过显示隐藏内容的实例代码
2019/07/31 Python
Python字符串和正则表达式中的反斜杠('\')问题详解
2019/09/03 Python
numpy.array 操作使用简单总结
2019/11/08 Python
Python并发爬虫常用实现方法解析
2020/11/19 Python
css3动画效果小结(推荐)
2016/07/25 HTML / CSS
日本高端护肤品牌:Tatcha
2016/08/29 全球购物
Unineed旗下时尚轻奢网站:FABHunt
2019/05/13 全球购物
Bluebella德国官网:英国性感内衣和睡衣品牌
2019/11/08 全球购物
介绍一下你对SOA的认识
2016/04/24 面试题
社区母亲节活动记录
2014/03/06 职场文书
干部鉴定材料
2014/05/18 职场文书
优秀班主任经验交流材料
2014/06/02 职场文书
霸气押韵的班级口号
2014/06/09 职场文书
医院保洁服务方案
2014/06/11 职场文书
2014大学生党员评议个人总结
2014/09/22 职场文书
2015年学生管理工作总结
2015/05/26 职场文书
redis使用不当导致应用卡死bug的过程解析
2021/07/01 Redis
SpringBoot中HttpSessionListener的简单使用方式
2022/03/17 Java/Android