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控制图片的hover效果(smartRollover.js)
Mar 18 Javascript
javascript正则表达式中的replace方法详解
Apr 20 Javascript
javascript设计模式之module(模块)模式
Aug 19 Javascript
js实现的在线调色板功能完整实例
Dec 21 Javascript
微信小程序商城项目之商品属性分类(4)
Apr 17 Javascript
addeventlistener监听scroll跟touch(实例讲解)
Aug 04 Javascript
微信小程序中setInterval的使用方法
Sep 29 Javascript
vue2.0 和 animate.css的结合使用
Dec 12 Javascript
JS实现监控微信小程序的原理
Jun 15 Javascript
Layui弹出层 加载 做编辑页面的方法
Sep 16 Javascript
JavaScript Array对象使用方法解析
Sep 24 Javascript
vue 验证两次输入的密码是否一致的方法示例
Sep 29 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获得url参数中具有&的值的方法
2014/03/05 PHP
一个显示效果非常不错的PHP错误、异常处理类
2014/03/21 PHP
Yii框架扩展CGridView增加导出CSV功能的方法
2017/05/24 PHP
Laravel框架实现文件上传的方法分析
2019/09/29 PHP
JQuery 动态扩展对象之另类视角
2010/05/25 Javascript
基于jQuery的输入框在光标位置插入内容, 并选中
2011/10/29 Javascript
20行代码实现的一个CSS覆盖率测试脚本
2013/07/07 Javascript
JavaScript的继承的封装介绍
2013/10/15 Javascript
jquery列表拖动排列(由项目提取相当好用)
2014/06/17 Javascript
判断访客终端类型集锦
2015/06/05 Javascript
canvas学习之API整理笔记(一)
2016/12/29 Javascript
ExtJs整合Echarts的示例代码
2018/02/27 Javascript
VUEX-action可以修改state吗
2019/11/19 Javascript
JavaScript this关键字指向常用情况解析
2020/09/02 Javascript
[01:03:18]DOTA2-DPC中国联赛 正赛 RNG vs Dynasty BO3 第一场 1月29日
2021/03/11 DOTA
Python实现句子翻译功能
2017/11/14 Python
python交易记录整合交易类详解
2019/07/03 Python
django中瀑布流写法实例代码
2019/10/14 Python
Python实现数值积分方式
2019/11/20 Python
使用 django orm 写 exists 条件过滤实例
2020/05/20 Python
python3.6中anaconda安装sklearn踩坑实录
2020/07/28 Python
如何用python 操作zookeeper
2020/12/28 Python
html5使用Drag事件编辑器拖拽上传图片的示例代码
2017/08/22 HTML / CSS
办公室前台的岗位职责
2013/12/20 职场文书
五一家具促销方案
2014/01/10 职场文书
培训专员岗位职责
2014/02/26 职场文书
追悼会主持词
2014/03/20 职场文书
护理目标管理责任书
2014/07/25 职场文书
流动人口婚育证明
2014/10/19 职场文书
2014年民政工作总结
2014/11/26 职场文书
财政局个人年终总结
2015/03/03 职场文书
煤矿百日安全活动总结
2015/05/07 职场文书
2015年圣诞节寄语
2015/08/17 职场文书
24句精辟的现实社会语录,句句扎心,道尽人性
2019/08/29 职场文书
Mysql表数据比较大情况下修改添加字段的方法实例
2022/06/28 MySQL
服务器nginx权限被拒绝解决案例
2022/09/23 Servers