JavaScript 系列--JavaScript一些奇淫技能的完成要领(二)数字格式化;类数组转数组

一、媒介

之前写了一篇文章:JavaScript 系列–JavaScript一些奇淫技能的完成要领(一)简短的sleep函数,猎取时刻戳

https://www.mwcxs.top/page/74…

引见了sleep函数和猎取时刻戳的要领。接下来我们来引见数字花样化1234567890 –> 1,234,567,890

二、数字花样化 1234567890 –> 1,234,567,890

1、一般版

// 数字花样化 1234567890 --> 1,234,567,890
function formatNumber(str){
    var arr = [];
    var count = str.length;
    while(count>=3){
        arr.unshift(str.slice(count - 3, count));
        count -= 3;
    }
    // 假如是否是3的倍数就别的追加到上去
    str.length % 3 && arr.unshift(str.slice(0, str.length % 3));
    return arr.toString();
}
formatNumber('1234567890')

长处:自我感觉比网上写的一堆 for轮回 另有 if-else 推断的逻辑越发清楚直白。
瑕玷:太一般

2、进阶版

// 2、进阶版
function formatNumber(str){
    return str.split("").reverse().reduce((prev,next,index) => {
        return ((index%3)? next: (next+',')) + prev;
    })
}
formatNumber("1234567890");

长处:把 JS 的 API 玩的管窥蠡测
瑕玷:不好明白

3、正则版

function formatNumber(str){
    return str.replace(/(?!^)(?=(\d{3})+$)/g,',')
}
formatNumber("1234567890");

我们来看看正则的剖析:

(1)/(?!^)(?=(d{3})+b)/g:婚配的这个位置不能是开首(?!^)

(2)(d{3})+:必需是1个或许多个的3个一连数字

长处:代码少,简约。

瑕玷:正则表达式的位置婚配很主要,能够参考这个:https://www.mwcxs.top/page/58…

4、API版本

(1234567890).toLocaleString('en-us');
(1234567890).toLocaleString();
1234567890..toLocaleString();

你能够还不晓得 JavaScript 的 toLocaleString 还能够这么玩。

123456789..toLocaleString('zh-hans-cn-u-nu-hanidec',{useGrouping: false}); //"一二三四五六七八九"
123456789..toLocaleString('zh-hans-cn-u-nu-hanidec',{useGrouping: true}); //"一二三,四五六,七八九"
new Date().toLocaleString('zh-hans-cn-u-nu-hanidec'); //"二〇一九/五/二九 下昼三:一五:四〇"

还能够运用Intl对象,

Intl 对象是 ECMAScript 国际化 API 的一个定名空间,它供应了准确的字符串对照,数字花样化,日期和时刻花样化。Collator,NumberFormat 和 DateTimeFormat 对象的组织函数是 Intl 对象的属性。

new Intl.NumberFormat().format(1234567890) // 1,234,567,890
长处:简朴粗犷,直接挪用api

瑕玷:Intl兼容性不太好,不过 toLocaleString的话 IE6 都支撑

前端知识点:Intl对象 和 toLocaleString的要领。

三、argruments 对象(类数组)转换成数组

那什么是类数组?就是跟数组很像,然则他是对象,花样像数组所以叫类数组。比方:{0:a,1:b,2:c,length:3},根据数组下标排序的对象,另有一个length的属性,有时刻我们须要这类对象能挪用数组下的一个要领,这时刻就须要把把类数组转化成真正的数组。

1、一般版

var makeArray = function(arr){
    var res = [];
    if(arr != null){
        var i = arr.length;
        if(i == null || typeof arr == "string") res[0] = arr;
        else while(i){res[--i] = arr[i];}
    }
    return res;
};
var obj = {0:'a',1:'b',2:'c',length:3};
makeArray(obj);

长处:通用版本,没有任何兼容性问题
瑕玷:临时没有啥瑕玷

2、进阶版

// 2、进阶版
var arr = Array.prototype.slice.call(arguments);

人人用过最经常使用的要领,至于为何能够这么用,很多人预计也是一孔之见,要搞清为何内里的缘由,我们照样从范例和源码提及。

slice.call 的作用道理就是,应用 call,将 slice 的要领作用于 arrayLike,slice 的两个参数为空,slice 内部剖析使得 arguments.lengt 即是0的时刻 相当于处置惩罚 slice(0) : 即挑选全部数组,slice 要领内部没有强迫推断必需是 Array 范例,slice 返回的是新建的数组(运用轮回取值)”,所以如许就完成了类数组到数组的转化,call 这个奇异的要领、slice 的处置惩罚缺一不可。

直接看 slice 怎样完成的吧。实在就是将 array-like 对象经由过程下标操纵放进了新的 Array 内里,下面是源码

// This will work for genuine arrays, array-like objects, 
    // NamedNodeMap (attributes, entities, notations),
    // NodeList (e.g., getElementsByTagName), HTMLCollection (e.g., childNodes),
    // and will not fail on other DOM objects (as do DOM elements in IE < 9)
    Array.prototype.slice = function(begin, end) {
      // IE < 9 gets unhappy with an undefined end argument
      end = (typeof end !== 'undefined') ? end : this.length;

      // For native Array objects, we use the native slice function
      if (Object.prototype.toString.call(this) === '[object Array]'){
        return _slice.call(this, begin, end); 
      }

      // For array like object we handle it ourselves.
      var i, cloned = [],
        size, len = this.length;

      // Handle negative value for "begin"
      var start = begin || 0;
      start = (start >= 0) ? start : Math.max(0, len + start);

      // Handle negative value for "end"
      var upTo = (typeof end == 'number') ? Math.min(end, len) : len;
      if (end < 0) {
        upTo = len + end;
      }
      // Actual expected size of the slice
      size = upTo - start;
      if (size > 0) {
        cloned = new Array(size);
        if (this.charAt) {
          for (i = 0; i < size; i++) {
            cloned[i] = this.charAt(start + i);
          }
        } else {
          for (i = 0; i < size; i++) {
            cloned[i] = this[start + i];
          }
        }
      }

      return cloned;
    };

长处:最经常使用的版本,兼容性强。

瑕玷:ie 低版本,没法处置惩罚 dom 鸠合的 slice call 转数组。

3、ES6版

运用 Array.from, 值须要对象有 length 属性, 就能够转换成数组。

var arr = Array.from(arguments);

扩大运算符

var args = [...arguments];

ES6 中的扩大运算符…也能将某些数据结构转换成数组,这类数据结构必需有便利器接口。

长处:直接运用内置 API,简朴易保护
瑕玷:兼容性,运用 babel 的 profill 转化能够使代码变多,文件包变大

前端知识点:slice 要领的详细道理

【注:我是saucxs,也叫songEagle,松宝写代码,文章首发于sau交流学习社区(https://www.mwcxs.top),关注我们天天浏览更多精彩内容】

    原文作者:saucxs
    原文地址: https://segmentfault.com/a/1190000019409746
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞