所謂的數字千分位形式,即從個位數起,每三位之間加一個逗號。例如“10,000”。針對這個需求,我起初寫了這樣一個函數:
// 方法一
function toThousands(num) {
var result = [ ], counter = 0;
num = (num || 0).toString().split('');
for (var i = num.length - 1; i >= 0; i--) {
counter ;
result.unshift(num[i]);
if (!(counter % 3) && i != 0) { result.unshift(','); }
}
return result.join('');
}
方法一的執行過程就是把數字轉換成字串後,打散為數組,再從最後開始,逐一把數組中的元素插入到新數組(result)的開頭。每插入一個元素,counter就計一次數(加1),當counter為3的倍數時,就插入一個逗號,但是要注意開頭(i為0時)不需要逗號。最後透過呼叫新數組的join方法得出結果。
方法一比較清晰易懂,也在專案中用了一段時間。但是直覺告訴我,它的表現並不好。
方法二-方法一的字串版
// 方法二
function toThousands(num) {
var result = '', counter = 0;
num = (num || 0).toString();
for (var i = num.length - 1; i >= 0; i--) {
counter ;
result = num.charAt(i) result;
if (!(counter % 3) && i != 0) { result = ',' result; }
}
return result;
}
方法二是方法一的改良版,不把字串打散為數組,始終對字串運算。
方法三——循環匹配末尾的三個數字
// 方法三
function toThousands(num) {
var num = (num || 0).toString(), re = /d{3}$/, result = '';
while ( re.test(num) ) {
result = RegExp.lastMatch result;
if (num !== RegExp.lastMatch) {
result = ',' result;
num = RegExp.leftContext;
} else {
num = '';
break;
}
}
if (num) { result = num result; }
return result;
}
方法三是完全不同的演算法,透過正規表示式循環匹配末尾的三個數字,每匹配一次,就把逗號和匹配到的內容插入到結果字串的開頭,然後把匹配目標(num)賦值為還沒符合的內容(RegExp.leftContext)。另外,也要注意:
1.如果數字的位數是3的倍數時,最後一次匹配到的內容肯定是三個數字,但是最前面的三個數字前不需要加逗號;
2.如果數字的位數不是3的倍數,那num變數最後一定會剩下1到2個數字,循環過後,要把剩餘的數字插入到結果字串的開頭。
雖然方法三減少了循環次數(一次循環處理三個字元),但由於用到了正則表達式,一定程度上增加了消耗。
方法四-方法三的字串版
// 方法四
function toThousands(num) {
var num = (num || 0).toString(), result = '';
while (num.length > 3) {
result = ',' num.slice(-3) result;
num = num.slice(0, num.length - 3);
}
if (num) { result = num result; }
return result;
}
事實上,截取末尾三個字元的函數可以透過字串類型的slice、substr或substring方法來做到。這樣就可以避免使用正規表示式。
方法五-分組合併法
// 方法五
function toThousands(num) {
var num = (num || 0).toString(), temp = num.length % 3;
switch (temp) {
case 1:
num = '00' num;
break;
case 2:
num = '0' num;
break;
}
return num.match(/d{3}/g).join(',').replace(/^0 /, '');
}
先把數字的位數補足為3的倍數,透過正規表示式,將其切割成每三個數字一個分組,再透過join方法加上逗號,最後還要把補的0移除。
方法六-懶人法
// 方法六
function toThousands(num) {
return (num || 0).toString().replace(/(d)(?=(?:d{3}) $)/g, '$1,');
}
一直覺得這個格式化是可以透過一條正規表示式替換做出來的,但是需要用到斷言等寫法,無奈自己對這部分不太熟。 Google了一下,還真找到了這麼一條正規表示式,這估計是程式碼最短的實作。
測試結果
数字 | 执行5000次消耗的时间(ms) | |||||
---|---|---|---|---|---|---|
方法一 | 方法二 | 方法三 | 方法四 | 方法五 | 方法六 | |
1 | 4 | 1 | 3 | 1 | 14 | 2 |
10 | 14 | 1 | 3 | 0 | 7 | 2 |
100 | 12 | 1 | 2 | 4 | 5 | 3 |
1000 | 13 | 2 | 3 | 2 | 9 | 5 |
10000 | 21 | 4 | 3 | 1 | 6 | 3 |
100000 | 21 | 3 | 2 | 1 | 5 | 6 |
方法一和方法二的強烈對比表明,字串操作的效率比數組操作的效率要高得多;方法六的測試結果告訴我們,代碼長短跟性能高低沒有關係。方法四的綜合性能是最好的(但為何num為100的時候,性能有所降低呢,這個實在不解),主要原因是:
1.對比方法一、二,每次操作3個字符而不是1個字符,減少循環次數;
2.對比方法三、五、六,沒有使用正規表示式,減少了消耗。
最後,我選擇了方法四作為最終的最佳化方案。各位讀者如有較好的實作方法或改良意見,可以發表評論。

如何使用JS和百度地图实现地图平移功能百度地图是一款广泛使用的地图服务平台,在Web开发中经常用于展示地理信息、定位等功能。本文将介绍如何使用JS和百度地图API实现地图平移功能,并提供具体的代码示例。一、准备工作使用百度地图API前,首先需要在百度地图开放平台(http://lbsyun.baidu.com/)上申请一个开发者账号,并创建一个应用。创建完成

如何使用JS和百度地图实现地图热力图功能简介:随着互联网和移动设备的迅速发展,地图成为了一种普遍的应用场景。而热力图作为一种可视化的展示方式,能够帮助我们更直观地了解数据的分布情况。本文将介绍如何使用JS和百度地图API来实现地图热力图的功能,并提供具体的代码示例。准备工作:在开始之前,你需要准备以下事项:一个百度开发者账号,并创建一个应用,获取到相应的AP

js字符串转数组的方法:1、使用“split()”方法,可以根据指定的分隔符将字符串分割成数组元素;2、使用“Array.from()”方法,可以将可迭代对象或类数组对象转换成真正的数组;3、使用for循环遍历,将每个字符依次添加到数组中;4、使用“Array.split()”方法,通过调用“Array.prototype.forEach()”将一个字符串拆分成数组的快捷方式。

如何使用JS和百度地图实现地图多边形绘制功能在现代网页开发中,地图应用已经成为常见的功能之一。而地图上绘制多边形,可以帮助我们将特定区域进行标记,方便用户进行查看和分析。本文将介绍如何使用JS和百度地图API实现地图多边形绘制功能,并提供具体的代码示例。首先,我们需要引入百度地图API。可以利用以下代码在HTML文件中导入百度地图API的JavaScript

js中new操作符做了:1、创建一个空对象,这个新对象将成为函数的实例;2、将新对象的原型链接到构造函数的原型对象,这样新对象就可以访问构造函数原型对象中定义的属性和方法;3、将构造函数的作用域赋给新对象,这样新对象就可以通过this关键字来引用构造函数中的属性和方法;4、执行构造函数中的代码,构造函数中的代码将用于初始化新对象的属性和方法;5、如果构造函数中没有返回等等。

这篇文章主要为大家详细介绍了js实现打字小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

php在特定情况下可以读js内部的数组。其方法是:1、在JavaScript中,创建一个包含需要传递给PHP的数组的变量;2、使用Ajax技术将该数组发送给PHP脚本。可以使用原生的JavaScript代码或者使用基于Ajax的JavaScript库如jQuery等;3、在PHP脚本中,接收传递过来的数组数据,并进行相应的处理即可。

js全称JavaScript,是一种具有函数优先的轻量级,直译式、解释型或即时编译型的高级编程语言,是一种属于网络的高级脚本语言;JavaScript基于原型编程、多范式的动态脚本语言,并且支持面向对象、命令式和声明式,如函数式编程。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

Dreamweaver Mac版
視覺化網頁開發工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能