function f(s, n) { // 保留20位以内的小数位 n = n > 0 && n <= 20 ? n : 2; // 这里 +'' 的含义是把数字转化为字符串, 正则里面的 \. \- 表示小数点和负号 // 删除掉s中非数字小数点或负号的字符 s = parseFloat((s + "").replace(/[^\d\.-]/g, "")).toFixed(n) + ""; // split('.') 作用以小数点把数字拆分为整数部分和小数部分 // l 是浮点数的左边部分也就是整数部分,r 为小数部分 // 比如 s = -123456.789; s.split('.') => ['-123456', '789'] // split('') 作用是将字符串拆分为单个字符的数组 // '-123456.789'.split('.')[0].split('') => ['-','1','2','3','4','5','6'] // .reverse() 颠倒顺序 ['-','1','2','3','4','5','6'].reverse() => ['6','5','4','3','2','1','-'] var l = s.split(".")[0].split("").reverse(), r = s.split(".")[1]; // '789' // .indexOf() 判断字符串中是否包含某个字符串, 如果不包含则返回-1 // 此处判断数字中是否有负号 有负号就说明整数部分数字的长度要减一 // 上例 l.length = 7 但是有负号 所以 len = 6 var len = (s.indexOf("-")!= -1) ? l.length - 1 : l.length; t = ""; // for (i = 0; i < len; i++) { // l = ['6','5','4','3','2','1','-'] // 此处通过对 i + 1 做余数运算来判断插入逗号的位置 // (i + 1) % 3 == 0 每三位插入一个逗号 // (i + 1) != len 数字最开头不用打逗号 // 结果:t = '654,321' t += l[i] + ((i + 1) % 3 == 0 && (i + 1) != len ? "," : ""); //没看懂呀 并且这两个条件 举个例子 } // 有负号就在开头加上负号 // 然后把顺序颠倒回来 把小数部分连接回来 // '-123,456.789' return ((s.indexOf("-")!= -1) ? "-" : "") + t.split("").reverse().join("") + "." + r; //这个返回 举个例子 没懂呀 }