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 相关文章推荐
使用jQuery实现dropdownlist的联动效果(sharepoint 2007)
Mar 30 Javascript
JS格式化数字保留两位小数点示例代码
Oct 15 Javascript
js控制当再次点击按钮时的间隔时间
Jun 03 Javascript
jQuery 仿百度输入标签插件附效果图
Jul 04 Javascript
jquery 插件实现瀑布流图片展示实例
Apr 03 Javascript
JavaScript中的parse()方法使用简介
Jun 12 Javascript
详解iframe与frame的区别
Jan 13 Javascript
浅谈DOCTYPE对$(window).height()取值的影响
Jul 21 Javascript
jQuery EasyUI Tab 选项卡问题小结
Aug 16 Javascript
几行js代码实现自适应
Feb 24 Javascript
vue实现可视化可拖放的自定义表单的示例代码
Mar 20 Javascript
JavaScript中条件语句的优化技巧总结
Dec 04 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编写的导航条程序
2006/10/09 PHP
PHP加密解密类实例代码
2016/07/20 PHP
PHP实现留言板功能的详细代码
2017/03/25 PHP
ThinkPHP3.2.3框架实现执行原生SQL语句的方法示例
2019/04/03 PHP
Laravel框架实现抢红包功能示例
2019/10/31 PHP
基于php+MySql实现学生信息管理系统实例
2020/08/04 PHP
JavaScript子窗口ModalDialog中操作父窗口对像
2012/12/11 Javascript
jquery选择器、属性设置用法经验总结
2013/09/08 Javascript
纯js实现重发验证码按钮倒数功能
2015/04/21 Javascript
jQuery实现复选框批量选择与反选的方法
2015/06/17 Javascript
详解AngularJS中module模块的导入导出
2015/12/10 Javascript
JavaScript匿名函数之模仿块级作用域
2015/12/12 Javascript
详解使用Next.js构建服务端渲染应用
2018/07/10 Javascript
JS获取并处理php数组的方法实例分析
2018/09/04 Javascript
详解Vue用cmd创建项目
2019/02/12 Javascript
vue实现分环境打包步骤(给不同的环境配置相对应的打包命令)
2019/06/04 Javascript
原生js实现无缝轮播图
2020/01/11 Javascript
小程序自定义弹框效果
2020/11/16 Javascript
python函数参数*args**kwargs用法实例
2013/12/04 Python
Python SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)
2014/05/06 Python
python issubclass 和 isinstance函数
2019/07/25 Python
Python爬虫学习之翻译小程序
2019/07/30 Python
使用Python实现图像标记点的坐标输出功能
2019/08/14 Python
如何使用python进行pdf文件分割
2019/11/11 Python
Python Web静态服务器非堵塞模式实现方法示例
2019/11/21 Python
keras获得某一层或者某层权重的输出实例
2020/01/24 Python
input file上传文件样式支持html5的浏览器解决方案
2012/11/14 HTML / CSS
俄罗斯最大的消费电子连锁零售商:Mvideo
2017/06/25 全球购物
意大利一家专营包包和配饰的网上商店:Borse Last Minute
2019/08/26 全球购物
Hibernate持久层技术
2013/12/16 面试题
先进德育工作者事迹材料
2014/01/24 职场文书
最新会计专业求职信范文
2014/01/28 职场文书
新闻传媒系求职信范文
2014/04/19 职场文书
2014年教研组工作总结
2014/11/26 职场文书
营销计划书
2015/01/17 职场文书
Mysql效率优化定位较低sql的两种方式
2021/05/26 MySQL