zoukankan      html  css  js  c++  java
  • javascript实现string.format函数补遗

    上一篇中,自谦懒人的咚锵留言指出楼猪改写的format函数在参数输入11个后不起作用了,又重新阅读了一遍Andrew的原文,在原文下面的评论中,赫然发现也有人早提出参数个数的问题,同样懒惰的楼猪直接拷贝原文评论答复了一下,同时还发现说漏了很重要的一个注意点Array.prototype.slice。下面统一补充说明一下:

    1、string.format的参数个数
    在Andrew的原文中,已经有人指出:

    eric d. Hi, thanks for that brilliant article. Made a lot of things a lot clearer!
    Note: new RegExp("%([1-" + arguments.length + "])", "g"); will fail passed 9 arguments (the regexp would be "%([1-10])" so it will only match %0 and %1).

    I think an easy fix would be something like:
    function format(string) { var args = arguments; var pattern = new RegExp("%([0-9]+)", "g"); return String(string).replace(pattern, function(match, index) { if (index == 0 || index >= args.length) throw "Invalid index in format string"; return args[index]; }); };
    (Sorry for nitpicking, I understand it was only an example and brevety is the main objective, but its a great function to have)

    Posted on: January 20th 2009, 12:01 am

    这个留言的家伙给足了作者面子,称“I understand it was only an example and brevety is the main objective, but its a great function to have”。原来,原文中定义的正则表达式能够验证的数字范围是...原来如此啊,哈哈,楼猪心虚的笑了。

    2、Array.prototype.slice     
    将arguments转换成Array的方法是通过Array.prototype.slice.call(arguments);方式转换的,也就是说类数组方式的对象都可以通过slice的方式实现到Array的转换,说到类数组对象的转换,真的很有必要重新记录总结一下Array的原型方法slice。
    (1)、常见用法
    楼猪在早前的这篇里通过一段代码一带而过介绍过slice方法:slice(start,end):返回数组对象的一个子集,索引从start开始(包括 start),到end结束(不包括end),原有数组不受影响。其实我们可以大胆猜测slice函数内部应该是定义了一个数组变量,然后通过循环,将数组对应索引值push进变量,最后return这个Array变量。
    (2)、“不是Array,我们也想要变成Array”
     不是Array,但是有length属性,可以根据索引取值,比如本文中的arguments,我们可以通过下面的方式转换为真实数组:

    function test() {
    var args = Array.prototype.slice.call(arguments);
    alert(args.length);
    args.push("jeff"); //push
    args.push("wong");
    alert(args.length); //2
    alert(args.pop()); //pop
    alert(args.length); //1
    }
    test();

    我们看到push和pop方法都起作用了。同样,Nodelist也有类似特性。怎么样将NodeList转换成Array?看过楼猪原文的读者可能会觉得这都是陈词滥调,还是多说一句,在IE下,Array.prototype.slice.call(nodelist)就不是那么回事了,最后再贴一次将NodeList转换为Array并且兼容ie和其他浏览器的方法结束本文:

    var nodelist =something;//一个NodeList变量
    var arr = null; //数组
    try { //ie
    arr = new Array();
    for (var i = 0; i < nodelist.length; i++) {
    arr.push(nodelist[i]);
    }
    } catch (e) {//其他浏览器
    arr = Array.prototype.slice.call(nodelist);
    }
  • 相关阅读:
    JAVA中的SimpleDateFormat yyyy和YYYY的区别
    Mysql的MVCC
    SELECT语句中的for update的用法(锁的运用)
    今天简单说一下cdc 的使用
    sqlserver cdc用法
    JAVA | Java对象的内存分配过程是如何保证线程安全的?
    物联网(莹石云)WIFI一键配置原理分析(zz)
    Dell xps 13 9350待机时总是关机的处理方法
    Vue系列:在vux的popup组件中使用百度地图遇到显示不全的问题
    如何通过百度地图将经纬度转换为地址信息
  • 原文地址:https://www.cnblogs.com/jeffwongishandsome/p/1805529.html
Copyright © 2011-2022 走看看