色尼玛亚洲综合影院,亚洲3atv精品一区二区三区,麻豆freexxxx性91精品,欧美在线91

JavaScript 字符串乘法

原文地址:http://www.davidflanagan.com/2009/08/string-multipli.html
原作者:David Flanagan
在Ruby中,“*”操作符用一個(gè)字符串作為左邊參數(shù),一個(gè)數(shù)字作為右邊參數(shù),來實(shí)現(xiàn)字符串重復(fù)。例如,"Ruby" * 2 的值為 "RubyRuby"。這僅在少數(shù)地方有用(例如,生成一張由連字符等ASCII 碼字符構(gòu)成的表格),但是非常簡潔。而且好過寫一個(gè)循環(huán)來連接n次字符串――這樣顯得很沒效率。

我剛剛發(fā)現(xiàn)在JavaScript中有個(gè)聰明的技巧來實(shí)現(xiàn)字符串的乘法:

復(fù)制代碼 代碼如下:
String.prototype.times = function(n) {
return Array.prototype.join.call({length:n+1}, this);
};
"js".times(5) // => "jsjsjsjsjs"


這個(gè)方法是調(diào)用一個(gè)由元素全為“undefined”的數(shù)組的Array.join()行為。但是它并沒有真正創(chuàng)建一個(gè)包含 n+1 個(gè)“undefined”元素的數(shù)組。它利用一個(gè)包含 length 屬性的匿名對(duì)象,依靠 Array 對(duì)象的原型函數(shù) join()。因?yàn)?“Object” 不是數(shù)組,不能直接調(diào)用 join(),因此不得不通過原型的 call() 來實(shí)現(xiàn)。下面給出一個(gè)同樣效果的簡單版本:

復(fù)制代碼 代碼如下:
String.prototype.times = function(n) { return (new Array(n+1)).join(this);};

當(dāng)我們調(diào)用 Array 的帶一個(gè)參數(shù)的構(gòu)造器時(shí),僅僅是設(shè)置了數(shù)組的長度,實(shí)際上并沒有創(chuàng)建數(shù)組的元素。

我僅在 Firefox 下對(duì)其做了測(cè)試,我估計(jì)它會(huì)比普通的循環(huán)更加有效,但我并沒有進(jìn)行基準(zhǔn)測(cè)試。

作者簡介
David Flanagan 是一個(gè)醉心于Java寫作的計(jì)算機(jī)程序員,他的大部分時(shí)間都致力于編寫Java相關(guān)圖書。David 在麻省理工學(xué)院獲得了計(jì)算機(jī)科學(xué)于工程學(xué)位。他生活在地處西雅圖和溫哥華之間的美國太平洋西北海岸。他在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》等。

我的評(píng)論
如果要考慮效率的話,對(duì)循環(huán)迭代稍作優(yōu)化可能效率更高。比如下面這段遞歸調(diào)用,算法復(fù)雜度是O(log2n)。在Google Chrome下測(cè)試結(jié)果是比 David 的方法執(zhí)行更快,但不得不承認(rèn)他的方法很優(yōu)雅!
復(fù)制代碼 代碼如下:
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 采納了我的建議,他又為我們寫了一段非遞歸的版本。請(qǐng)參看他的博客原文:http://www.davidflanagan.com/2009/08/good-algorithms.html
聯(lián)系方式
我的郵箱,歡迎來信(redraiment@gmail.com)

JavaScript技術(shù)JavaScript 字符串乘法,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 固始县| 霍林郭勒市| 永清县| 略阳县| 马关县| 县级市| 文安县| 江门市| 临汾市| 保康县| 普格县| 赫章县| 沐川县| 大新县| 个旧市| 平原县| 茂名市| 周宁县| 兴城市| 小金县| 景德镇市| 芜湖县| 古浪县| 鲁甸县| 齐河县| 射阳县| 延边| 平武县| 广西| 临漳县| 桃源县| 双流县| 井研县| 乌拉特中旗| 兴仁县| 油尖旺区| 商城县| 新津县| 安徽省| 沙河市| 雅安市|