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 中关于CSS操作部分使用说明
Jun 10 Javascript
国外Lightbox v2.03.3 最新版 下载
Oct 17 Javascript
Jquery判断IE6等浏览器的代码
Apr 05 Javascript
javascript获取url上某个参数的方法
Nov 08 Javascript
对之前写的jquery分页做下升级
Jun 19 Javascript
JS实现生成会变大变小的圆环实例
Aug 05 Javascript
jQuery网页右侧广告跟随滚动代码分享
Apr 20 Javascript
浅谈JavaScript的全局变量与局部变量
Jun 10 Javascript
Input文本框随着输入内容多少自动延伸的实现
Feb 15 Javascript
一步一步的了解webpack4的splitChunk插件(小结)
Sep 17 Javascript
vue动画之点击按钮往上渐渐显示出来的实例
Sep 29 Javascript
Vue slot用法(小结)
Oct 22 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实现的随机广告显示代码
2007/06/14 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(二)
2014/06/23 PHP
PHP实现货币换算的方法
2014/11/29 PHP
PHP设计模式之状态模式定义与用法详解
2018/04/02 PHP
excel操作之Add Data to a Spreadsheet Cell
2007/06/12 Javascript
firefox浏览器下javascript 拖动层效果与原理分析代码
2007/12/04 Javascript
JQUERY获取form表单值的代码
2010/07/17 Javascript
使用按钮控制以何种方式打开新窗口的属性介绍
2012/12/17 Javascript
js日期相关函数总结分享
2013/10/15 Javascript
浅谈jquery的html方法里包含特殊字符的处理
2016/11/30 Javascript
ES2015 Symbol 一种绝不重复的值
2016/12/25 Javascript
利用Jasmine对Angular进行单元测试的方法详解
2017/06/12 Javascript
详解如何构建Angular项目目录结构
2017/07/13 Javascript
vue2.0 兄弟组件(平级)通讯的实现代码
2018/01/15 Javascript
小程序click-scroll组件设计
2019/06/18 Javascript
JS实现移动端点击按钮复制文本内容
2019/07/28 Javascript
浅谈TypeScript的类型保护机制
2020/02/23 Javascript
vue搜索页开发实例代码详解(热门搜索,历史搜索,淘宝接口演示)
2020/04/11 Javascript
[33:39]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第二局
2016/02/27 DOTA
[45:32]Liquid vs LGD 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
实践Python的爬虫框架Scrapy来抓取豆瓣电影TOP250
2016/01/20 Python
Python模拟简单电梯调度算法示例
2018/08/20 Python
pygame游戏之旅 创建游戏窗口界面
2018/11/20 Python
Pycharm设置utf-8自动显示方法
2019/01/17 Python
django中ORM模型常用的字段的使用方法
2019/03/05 Python
对PyQt5中树结构的实现方法详解
2019/06/17 Python
在python中使用pymysql往mysql数据库中插入(insert)数据实例
2020/03/02 Python
keras 指定程序在某块卡上训练实例
2020/06/22 Python
python使用建议与技巧分享(一)
2020/08/17 Python
详解CSS3 Media Queries中媒体属性的使用
2016/02/29 HTML / CSS
中国首家奢侈品O2O网购平台:第五大道奢侈品网
2017/12/14 全球购物
介绍一下RMI的基本概念
2016/12/17 面试题
2014年党务工作总结
2014/11/25 职场文书
毕业论文指导教师评语
2014/12/30 职场文书
Apache Hudi集成Spark SQL操作hide表
2022/03/31 Servers
Django框架中表单的用法
2022/06/10 Python