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动态创建div
Sep 25 Javascript
网页中的图片的处理方法与代码
Nov 26 Javascript
JQERY limittext 插件0.2版(长内容限制显示)
Aug 27 Javascript
jQuery使用append在html元素后同时添加多项内容的方法
Mar 26 Javascript
jQuery实现鼠标悬停显示提示信息窗口的方法
Apr 30 Javascript
TypeScript入门-接口
Mar 30 Javascript
微信小程序微信支付接入开发实例详解
Apr 12 Javascript
微信小程序实现瀑布流布局与无限加载的方法详解
May 12 Javascript
基于JS开发微信网页录音功能的实例代码
Apr 30 Javascript
使用Vue.js中的过滤器实现幂方求值的方法
Aug 27 Javascript
JS数组push、unshift、pop、shift方法的实现与使用方法示例
Apr 29 Javascript
JavaScript Image对象实现原理实例解析
Aug 26 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
ThinkPHP实现更新数据实例详解(demo)
2016/06/29 PHP
PHP面向对象程序设计类的定义与用法简单示例
2016/12/27 PHP
php自定义函数br2nl实现将html中br换行符转换为文本输入中换行符的方法【与函数nl2br功能相反】
2017/02/17 PHP
PHP 扩展Memcached命令用法实例总结
2020/06/04 PHP
event.keyCode键码值表 附只能输入特定的字符串代码
2009/05/15 Javascript
javascript使用call调用微信API
2014/12/15 Javascript
简单谈谈javascript代码复用模式
2015/01/28 Javascript
iframe里使用JavaScript控制主页转向的方法
2015/04/03 Javascript
jQuery蓝色风格滑动导航栏代码分享
2015/08/19 Javascript
js正则表达式验证邮件地址
2015/11/12 Javascript
Vue.js实现移动端短信验证码功能
2017/03/29 Javascript
利用node.js+mongodb如何搭建一个简单登录注册的功能详解
2017/07/30 Javascript
mpvue+vuex搭建小程序详细教程(完整步骤)
2018/09/30 Javascript
vue-router 前端路由之路由传值的方式详解
2019/04/30 Javascript
9种python web 程序的部署方式小结
2014/06/30 Python
使用Python中的cookielib模拟登录网站
2015/04/09 Python
Centos Python2 升级到Python3的简单实现
2016/06/21 Python
python爬取NUS-WIDE数据库图片
2016/10/05 Python
我就是这样学习Python中的列表
2019/06/02 Python
python使用 request 发送表单数据操作示例
2019/09/25 Python
Python打包工具PyInstaller的安装与pycharm配置支持PyInstaller详细方法
2020/02/27 Python
Spring http服务远程调用实现过程解析
2020/06/11 Python
Windows下PyCharm配置Anaconda环境(超详细教程)
2020/07/31 Python
超级实用的8个Python列表技巧
2020/08/24 Python
vue.js刷新当前页面的实例讲解
2020/12/29 Python
Html5之title吸顶功能
2018/06/04 HTML / CSS
雅虎笔试题(字符串操作)
2015/03/24 面试题
运动会入场词200字
2014/02/15 职场文书
满月酒主持词
2014/03/27 职场文书
建房协议书
2014/04/11 职场文书
兵马俑的导游词
2015/02/02 职场文书
统计员岗位职责
2015/02/11 职场文书
幼儿园安全工作总结2015
2015/04/20 职场文书
Django程序的优化技巧
2021/04/29 Python
redis使用不当导致应用卡死bug的过程解析
2021/07/01 Redis
zabbix 代理服务器的部署与 zabbix-snmp 监控问题
2022/07/15 Servers