javascript實現string.format函數補遺

來源:互聯網
上載者:User
在上一篇中,自謙懶人的咚鏘留言指出樓豬改寫的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”。原來,原文中定義的Regex能夠驗證的數字範圍是...原來如此啊,哈哈,樓豬心虛的笑了。

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"); //pushargs.push("wong");alert(args.length); //2alert(args.pop()); //popalert(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 { //iearr = new Array();for (var i = 0; i < nodelist.length; i++) {arr.push(nodelist[i]);}} catch (e) {//其他瀏覽器arr = Array.prototype.slice.call(nodelist);}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.