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 相关文章推荐
使用js判断当前时区TimeZone是否是夏令时
Feb 23 Javascript
JS兼容浏览器的导出Excel(CSV)文件的方法
May 03 Javascript
jquery实现表格本地排序的方法
Mar 11 Javascript
jquery+css实现绚丽的横向二级下拉菜单-附源码下载
Aug 23 Javascript
JS判断元素是否在数组内的实现代码
Mar 30 Javascript
使用jQuery UI库开发Web界面的简单入门指引
Apr 22 Javascript
Vue2路由动画效果的实现代码
Jul 10 Javascript
ES6新增的math,Number方法
Aug 06 Javascript
老生常谈JavaScript面向对象基础与this指向问题
Oct 16 Javascript
js blob类型url的视频下载问题的解决
Nov 29 Javascript
在VUE style中使用data中的变量的方法
Jun 19 Javascript
vuejs element table 表格添加行,修改,单独删除行,批量删除行操作
Jul 18 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函数array_flip()在重复数组元素删除中的作用
2013/06/27 PHP
php生成扇形比例图实例
2013/11/06 PHP
调试PHP程序的多种方法介绍
2014/11/06 PHP
php实现上传图片保存到数据库的方法
2015/02/11 PHP
PHP表单提交后引号前自动加反斜杠的原因及三种办法关闭php魔术引号
2015/09/30 PHP
PHP中类的自动加载的方法
2017/03/17 PHP
使用PHPWord生成word文档的方法详解
2019/06/06 PHP
javascript nextSibling 与 getNextElement(node) 使用介绍
2011/10/13 Javascript
基于JavaScript实现继承机制之构造函数+原型链混合方式的使用详解
2013/05/07 Javascript
javascript与jquery中跳出循环的区别总结
2013/11/04 Javascript
Bootstrap 设置datetimepicker在屏幕上面弹出设置方法
2017/03/21 Javascript
JScript实现地址选择功能
2017/08/15 Javascript
ES6 javascript中Class类继承用法实例详解
2017/10/30 Javascript
jQuery选择器选中最后一个元素,倒数第二个元素操作示例
2018/12/10 jQuery
[01:29]Ti4循环赛第三日精彩回顾
2014/07/13 DOTA
新手入门Python编程的8个实用建议
2019/07/12 Python
python hash每次调用结果不同的原因
2019/11/21 Python
python3 webp转gif格式的实现示例
2019/12/10 Python
python实现局域网内实时通信代码
2019/12/22 Python
Python面向对象封装操作案例详解 II
2020/01/02 Python
tensorflow 只恢复部分模型参数的实例
2020/01/06 Python
python如何求圆的面积
2020/07/01 Python
pycharm 2020 1.1的安装流程
2020/09/29 Python
YOOX美国官方网站:全球著名的多品牌时尚网络概念店
2016/09/11 全球购物
SheIn沙特阿拉伯:女装在线
2020/03/23 全球购物
EJB的几种类型
2012/08/15 面试题
财务人员个人求职信范文
2013/12/04 职场文书
小学运动会表扬稿
2014/01/19 职场文书
教师节促销活动方案
2014/02/14 职场文书
品牌转让协议书
2014/08/20 职场文书
2014迎接教师节演讲稿
2014/09/10 职场文书
先进个人推荐材料
2014/12/29 职场文书
大学团日活动总结书
2015/05/11 职场文书
主持人大赛开场白
2015/05/29 职场文书
亮剑观后感
2015/06/05 职场文书
python opencv旋转图片的使用方法
2021/06/04 Python