JavaScript 字符串乘法
原文地址:http://www.davidflanagan.com/2009/08/string-multipli.html
原作者:David Flanagan
在Ruby中,“*”操作符用一個字符串作為左邊參數(shù),一個數(shù)字作為右邊參數(shù),來實(shí)現(xiàn)字符串重復(fù)。例如,"Ruby" * 2 的值為 "RubyRuby"。這僅在少數(shù)地方有用(例如,生成一張由連字符等ASCII 碼字符構(gòu)成的表格),但是非常簡潔。而且好過寫一個循環(huán)來連接n次字符串——這樣顯得很沒效率。
我剛剛發(fā)現(xiàn)在JavaScript中有個聰明的技巧來實(shí)現(xiàn)字符串的乘法:
String.prototype.times = function(n) {
return Array.prototype.join.call({length:n+1}, this);
};
"js".times(5) // => "jsjsjsjsjs"
這個方法是調(diào)用一個由元素全為“undefined”的數(shù)組的Array.join()行為。但是它并沒有真正創(chuàng)建一個包含 n+1 個“undefined”元素的數(shù)組。它利用一個包含 length 屬性的匿名對象,依靠 Array 對象的原型函數(shù) join()。因?yàn)?“Object” 不是數(shù)組,不能直接調(diào)用 join(),因此不得不通過原型的 call() 來實(shí)現(xiàn)。下面給出一個同樣效果的簡單版本:
String.prototype.times = function(n) { return (new Array(n+1)).join(this);};
當(dāng)我們調(diào)用 Array 的帶一個參數(shù)的構(gòu)造器時,僅僅是設(shè)置了數(shù)組的長度,實(shí)際上并沒有創(chuàng)建數(shù)組的元素。
我僅在 Firefox 下對其做了測試,我估計(jì)它會比普通的循環(huán)更加有效,但我并沒有進(jìn)行基準(zhǔn)測試。
作者簡介
David Flanagan 是一個醉心于Java寫作的計(jì)算機(jī)程序員,他的大部分時間都致力于編寫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》等。
我的評論
如果要考慮效率的話,對循環(huán)迭代稍作優(yōu)化可能效率更高。比如下面這段遞歸調(diào)用,算法復(fù)雜度是O(log2n)。在Google Chrome下測試結(jié)果是比 David 的方法執(zhí)行更快,但不得不承認(rèn)他的方法很優(yōu)雅!
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
聯(lián)系方式
我的郵箱,歡迎來信(redraiment@gmail.com)
- 解決JS中乘法的浮點(diǎn)錯誤的方法
- javascript和jquery分別實(shí)現(xiàn)的九九乘法表代碼
- javascript(js)的小數(shù)點(diǎn)乘法除法問題詳解
- jsp/javascript打印九九乘法表代碼
- JS實(shí)現(xiàn)上下左右對稱的九九乘法表
- JavaScript實(shí)現(xiàn)99乘法表及隔行變色實(shí)例代碼
- JavaScript實(shí)現(xiàn)九九乘法表的簡單實(shí)例
- 基于javascript實(shí)現(xiàn)九九乘法表
- jsp輸出九九乘法表的簡單實(shí)例
- JavaScript九九乘法口訣表的簡單實(shí)現(xiàn)
相關(guān)文章
javascript 緩沖效果 實(shí)現(xiàn)代碼
非常漂亮的緩沖效果代碼,大家可以看看下。2009-06-06Electron點(diǎn)擊穿透不規(guī)則窗體的透明區(qū)域的實(shí)現(xiàn)
本文主要介紹了Electron點(diǎn)擊穿透不規(guī)則窗體的透明區(qū)域的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09three.js中文文檔學(xué)習(xí)之通過模塊導(dǎo)入
這篇文章主要給大家介紹了關(guān)于three.js中文文檔學(xué)習(xí)之通過模塊導(dǎo)入的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或使用three.js具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11JS隨拖拽速度設(shè)置傾斜角度的實(shí)現(xiàn)代碼
這篇文章主要給大家介紹了JS如何隨拖拽速度設(shè)置傾斜角度,文中有詳細(xì)的代碼講解,對大家的學(xué)習(xí)或工作有一定的幫助,感興趣的小伙伴可以自己動手嘗試一下2023-09-09js實(shí)現(xiàn)網(wǎng)頁的兩個input標(biāo)簽內(nèi)的數(shù)值加減(示例代碼)
下面小編就為大家?guī)硪黄猨s實(shí)現(xiàn)網(wǎng)頁的兩個input標(biāo)簽內(nèi)的數(shù)值加減(示例代碼)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08談?wù)凧avaScript異步函數(shù)發(fā)展歷程
對大部分JavaScript開發(fā)者而言,async函數(shù)仍是新鮮事物,其發(fā)展經(jīng)歷了漫長的旅程。本文將梳理總結(jié)JavaScript異步函數(shù)的發(fā)展歷程,并表示未來async函數(shù)將成為實(shí)現(xiàn)異步的主要方式。2015-09-09jQuery右下角旋轉(zhuǎn)環(huán)狀菜單特效代碼
jquery實(shí)現(xiàn)右下角旋轉(zhuǎn)環(huán)形菜單特效代碼,是固定在頁面右下角位置,當(dāng)用戶點(diǎn)擊了主菜單按鈕后,子菜單項(xiàng)會以環(huán)狀旋轉(zhuǎn)進(jìn)入頁面,并使用animate.css制作動畫效果,有需要的朋友可以參考下2015-08-08vite打包優(yōu)化vite-plugin-compression的使用示例詳解
這篇文章主要介紹了vite打包優(yōu)化vite-plugin-compression的使用,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-09-09JavaScript加強(qiáng)之自定義event事件
event事件在本文以自定義的方式出現(xiàn),感興趣的朋友可以參考下,希望對大家有所幫助2013-09-09JS,Jquery獲取select,dropdownlist,checkbox下拉列表框的值(示例代碼)
本篇文章主要是對JS,Jquery獲取select,dropdownlist,checkbox下拉列表框的值(示例代碼)進(jìn)行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-01-01