B2BÍøÂçÈí¼þ

 ÕÒ»ØÃÜÂë
 Á¢¼´×¢²á ÉóºËÍøÕ¾ºÅ:QQ:896757558
ËÑË÷
²é¿´: 3|»Ø¸´: 0
´òÓ¡ ÉÏÒ»Ö÷Ìâ ÏÂÒ»Ö÷Ìâ

AIWROK°²×¿Æ»¹ûƽ̨Éè¼ÆµÄʵÓù¤¾ß¿â

[¸´ÖÆÁ´½Ó]

1060

Ö÷Ìâ

1065

Ìû×Ó

7517

»ý·Ö

abc

Rank: 9Rank: 9Rank: 9

»ý·Ö
7517
Ìø×ªµ½Ö¸¶¨Â¥²ã
Â¥Ö÷

AIWROK°²×¿Æ»¹ûƽ̨Éè¼ÆµÄʵÓù¤¾ß¿â
AIWROK°²×¿Æ»¹ûƽ̨Éè¼ÆµÄʵÓù¤¾ß¿â B2BÍøÂçÈí¼þ

AIWROK°²×¿Æ»¹ûƽ̨Éè¼ÆµÄʵÓù¤¾ß¿â B2BÍøÂçÈí¼þ

AIWROK°²×¿Æ»¹ûƽ̨Éè¼ÆµÄʵÓù¤¾ß¿â B2BÍøÂçÈí¼þ





  1. //🍎½»Á÷QQȺ711841924Ⱥһ£¬Æ»¹ûÄÚ²âȺ£¬528816639

  2. /**
  3. * =============================================================================
  4. * AIWROK ºËÐŤ¾ß¿âÍêÕûʾÀý
  5. * =============================================================================
  6. * »ùÓÚ JavaScript ES5 ±ê×¼£¬×¨Îª AIWROK ƽ̨Éè¼ÆµÄʵÓù¤¾ß¿â
  7. * °üº¬£º¶ÔÏó²Ù×÷¡¢Êý×é´¦Àí¡¢×Ö·û´®¹¤¾ß¡¢Êýѧ¼ÆËã¡¢Êý×Ö´¦Àí¡¢Ê±¼ä¹ÜÀí
  8. *
  9. * ¼æÈÝÐÔ£ºRhino ÒýÇæ (ES5)
  10. * ƽ̨£ºAIWROK °²×¿×Ô¶¯»¯Èí¼þ
  11. * °æ±¾£º2.0.0
  12. * =============================================================================
  13. */

  14. // =============================================================================
  15. // µÚÒ»²¿·Ö£º¶ÔÏó²Ù×÷¹¤¾ßÀà (ObjectUtils)
  16. // =============================================================================

  17. /**
  18. * ¶ÔÏó²Ù×÷¹¤¾ßÀà
  19. * Ìṩ¶ÔÏó´´½¨¡¢ºÏ²¢¡¢¿Ë¡¡¢ÊôÐÔ²Ù×÷µÈ¸ß¼¶¹¦ÄÜ
  20. */
  21. var ObjectUtils = {
  22.    
  23.     /**
  24.      * Éî¶ÈºÏ²¢¶à¸ö¶ÔÏó
  25.      * @param {Object} target - Ä¿±ê¶ÔÏó
  26.      * @param {...Object} sources - Ô´¶ÔÏóÁбí
  27.      * @returns {Object} ºÏ²¢ºóµÄ¶ÔÏó
  28.      */
  29.     deepMerge: function(target) {
  30.         var sources = Array.prototype.slice.call(arguments, 1);
  31.         for (var i = 0; i < sources.length; i++) {
  32.             var source = sources[i];
  33.             if (source && typeof source === 'object') {
  34.                 for (var key in source) {
  35.                     if (source.hasOwnProperty(key)) {
  36.                         if (typeof source[key] === 'object' && source[key] !== null && !Array.isArray(source[key])) {
  37.                             target[key] = this.deepMerge(target[key] || {}, source[key]);
  38.                         } else {
  39.                             target[key] = source[key];
  40.                         }
  41.                     }
  42.                 }
  43.             }
  44.         }
  45.         return target;
  46.     },
  47.    
  48.     /**
  49.      * ´´½¨¶ÔÏóµÄÉî¶È¿Ë¡
  50.      * @param {Object} obj - Òª¿Ë¡µÄ¶ÔÏó
  51.      * @returns {Object} ¿Ë¡ºóµÄжÔÏó
  52.      */
  53.     deepClone: function(obj) {
  54.         if (obj === null || typeof obj !== 'object') {
  55.             return obj;
  56.         }
  57.         if (Array.isArray(obj)) {
  58.             var arrCopy = [];
  59.             for (var i = 0; i < obj.length; i++) {
  60.                 arrCopy[i] = this.deepClone(obj[i]);
  61.             }
  62.             return arrCopy;
  63.         }
  64.         var objCopy = {};
  65.         for (var key in obj) {
  66.             if (obj.hasOwnProperty(key)) {
  67.                 objCopy[key] = this.deepClone(obj[key]);
  68.             }
  69.         }
  70.         return objCopy;
  71.     },
  72.    
  73.     /**
  74.      * °²È«»ñȡǶÌ×¶ÔÏóÊôÐÔ
  75.      * @param {Object} obj - Ä¿±ê¶ÔÏó
  76.      * @param {string} path - ÊôÐÔ·¾¶£¬Èç "a.b.c"
  77.      * @param {*} defaultValue - ĬÈÏÖµ
  78.      * @returns {*} ÊôÐÔÖµ»òĬÈÏÖµ
  79.      */
  80.     getSafe: function(obj, path, defaultValue) {
  81.         if (!obj || !path) return defaultValue;
  82.         var keys = path.split('.');
  83.         var current = obj;
  84.         for (var i = 0; i < keys.length; i++) {
  85.             if (current === null || current === undefined || !current.hasOwnProperty(keys[i])) {
  86.                 return defaultValue;
  87.             }
  88.             current = current[keys[i]];
  89.         }
  90.         return current !== undefined ? current : defaultValue;
  91.     },
  92.    
  93.     /**
  94.      * °²È«ÉèÖÃǶÌ×¶ÔÏóÊôÐÔ
  95.      * @param {Object} obj - Ä¿±ê¶ÔÏó
  96.      * @param {string} path - ÊôÐÔ·¾¶
  97.      * @param {*} value - ÒªÉèÖõÄÖµ
  98.      */
  99.     setSafe: function(obj, path, value) {
  100.         if (!obj || !path) return;
  101.         var keys = path.split('.');
  102.         var current = obj;
  103.         for (var i = 0; i < keys.length - 1; i++) {
  104.             if (!current[keys[i]] || typeof current[keys[i]] !== 'object') {
  105.                 current[keys[i]] = {};
  106.             }
  107.             current = current[keys[i]];
  108.         }
  109.         current[keys[keys.length - 1]] = value;
  110.     },
  111.    
  112.     /**
  113.      * ¹ýÂ˶ÔÏóÊôÐÔ
  114.      * @param {Object} obj - Ô´¶ÔÏó
  115.      * @param {Array} keys - Òª±£ÁôµÄ¼üÃûÊý×é
  116.      * @returns {Object} ¹ýÂ˺óµÄ¶ÔÏó
  117.      */
  118.     pick: function(obj, keys) {
  119.         var result = {};
  120.         for (var i = 0; i < keys.length; i++) {
  121.             var key = keys[i];
  122.             if (obj.hasOwnProperty(key)) {
  123.                 result[key] = obj[key];
  124.             }
  125.         }
  126.         return result;
  127.     },
  128.    
  129.     /**
  130.      * Åųý¶ÔÏóÊôÐÔ
  131.      * @param {Object} obj - Ô´¶ÔÏó
  132.      * @param {Array} keys - ÒªÅųýµÄ¼üÃûÊý×é
  133.      * @returns {Object} ´¦ÀíºóµÄ¶ÔÏó
  134.      */
  135.     omit: function(obj, keys) {
  136.         var result = {};
  137.         var excludeMap = {};
  138.         for (var i = 0; i < keys.length; i++) {
  139.             excludeMap[keys[i]] = true;
  140.         }
  141.         for (var key in obj) {
  142.             if (obj.hasOwnProperty(key) && !excludeMap[key]) {
  143.                 result[key] = obj[key];
  144.             }
  145.         }
  146.         return result;
  147.     },
  148.    
  149.     /**
  150.      * ¼ì²é¶ÔÏóÊÇ·ñΪ¿Õ
  151.      * @param {Object} obj - Òª¼ì²éµÄ¶ÔÏó
  152.      * @returns {boolean} ÊÇ·ñΪ¿Õ
  153.      */
  154.     isEmpty: function(obj) {
  155.         if (!obj) return true;
  156.         for (var key in obj) {
  157.             if (obj.hasOwnProperty(key)) return false;
  158.         }
  159.         return true;
  160.     },
  161.    
  162.     /**
  163.      * ½«¶ÔÏóת»»Îª²éѯ×Ö·û´®
  164.      * @param {Object} obj - Ҫת»»µÄ¶ÔÏó
  165.      * @returns {string} ²éѯ×Ö·û´®
  166.      */
  167.     toQueryString: function(obj) {
  168.         var pairs = [];
  169.         for (var key in obj) {
  170.             if (obj.hasOwnProperty(key)) {
  171.                 pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(obj[key]));
  172.             }
  173.         }
  174.         return pairs.join('&');
  175.     },
  176.    
  177.     /**
  178.      * ½«²éѯ×Ö·û´®×ª»»Îª¶ÔÏó
  179.      * @param {string} queryString - ²éѯ×Ö·û´®
  180.      * @returns {Object} ת»»ºóµÄ¶ÔÏó
  181.      */
  182.     fromQueryString: function(queryString) {
  183.         var result = {};
  184.         if (!queryString) return result;
  185.         var pairs = queryString.split('&');
  186.         for (var i = 0; i < pairs.length; i++) {
  187.             var pair = pairs[i].split('=');
  188.             if (pair.length === 2) {
  189.                 result[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);
  190.             }
  191.         }
  192.         return result;
  193.     }
  194. };

  195. // =============================================================================
  196. // µÚ¶þ²¿·Ö£ºÊý×é²Ù×÷¹¤¾ßÀà (ArrayUtils)
  197. // =============================================================================

  198. /**
  199. * Êý×é²Ù×÷¹¤¾ßÀà
  200. * ÌṩÊý×é±éÀú¡¢¹ýÂË¡¢ÅÅÐò¡¢·Ö×éµÈ¸ß¼¶¹¦ÄÜ
  201. */
  202. var ArrayUtils = {
  203.    
  204.     /**
  205.      * Êý×éÈ¥ÖØ
  206.      * @param {Array} arr - Ô´Êý×é
  207.      * @returns {Array} È¥ÖØºóµÄÊý×é
  208.      */
  209.     unique: function(arr) {
  210.         var result = [];
  211.         var seen = {};
  212.         for (var i = 0; i < arr.length; i++) {
  213.             var item = arr[i];
  214.             var key = typeof item + JSON.stringify(item);
  215.             if (!seen[key]) {
  216.                 seen[key] = true;
  217.                 result.push(item);
  218.             }
  219.         }
  220.         return result;
  221.     },
  222.    
  223.     /**
  224.      * ¸ù¾ÝÌõ¼þ¹ýÂËÊý×é
  225.      * @param {Array} arr - Ô´Êý×é
  226.      * @param {Function} predicate - ¹ýÂËÌõ¼þº¯Êý
  227.      * @returns {Array} ¹ýÂ˺óµÄÊý×é
  228.      */
  229.     filter: function(arr, predicate) {
  230.         var result = [];
  231.         for (var i = 0; i < arr.length; i++) {
  232.             if (predicate(arr[i], i, arr)) {
  233.                 result.push(arr[i]);
  234.             }
  235.         }
  236.         return result;
  237.     },
  238.    
  239.     /**
  240.      * Êý×éÓ³Éäת»»
  241.      * @param {Array} arr - Ô´Êý×é
  242.      * @param {Function} mapper - Ó³É亯Êý
  243.      * @returns {Array} ת»»ºóµÄÊý×é
  244.      */
  245.     map: function(arr, mapper) {
  246.         var result = [];
  247.         for (var i = 0; i < arr.length; i++) {
  248.             result.push(mapper(arr[i], i, arr));
  249.         }
  250.         return result;
  251.     },
  252.    
  253.     /**
  254.      * Êý×é¹éÔ¼¼ÆËã
  255.      * @param {Array} arr - Ô´Êý×é
  256.      * @param {Function} reducer - ¹éÔ¼º¯Êý
  257.      * @param {*} initialValue - ³õʼֵ
  258.      * @returns {*} ¹éÔ¼½á¹û
  259.      */
  260.     reduce: function(arr, reducer, initialValue) {
  261.         var accumulator = initialValue;
  262.         var startIndex = 0;
  263.         if (arguments.length < 3) {
  264.             accumulator = arr[0];
  265.             startIndex = 1;
  266.         }
  267.         for (var i = startIndex; i < arr.length; i++) {
  268.             accumulator = reducer(accumulator, arr[i], i, arr);
  269.         }
  270.         return accumulator;
  271.     },
  272.    
  273.     /**
  274.      * ²éÕÒÊý×éÔªËØ
  275.      * @param {Array} arr - Ô´Êý×é
  276.      * @param {Function} predicate - ²éÕÒÌõ¼þ
  277.      * @returns {*} ÕÒµ½µÄÔªËØ»ò undefined
  278.      */
  279.     find: function(arr, predicate) {
  280.         for (var i = 0; i < arr.length; i++) {
  281.             if (predicate(arr[i], i, arr)) {
  282.                 return arr[i];
  283.             }
  284.         }
  285.         return undefined;
  286.     },
  287.    
  288.     /**
  289.      * ¼ì²éÊý×éÊÇ·ñ°üº¬Ä³ÔªËØ
  290.      * @param {Array} arr - Ô´Êý×é
  291.      * @param {*} item - Òª²éÕÒµÄÔªËØ
  292.      * @returns {boolean} ÊÇ·ñ°üº¬
  293.      */
  294.     includes: function(arr, item) {
  295.         for (var i = 0; i < arr.length; i++) {
  296.             if (arr[i] === item) {
  297.                 return true;
  298.             }
  299.         }
  300.         return false;
  301.     },
  302.    
  303.     /**
  304.      * Êý×é±âƽ»¯
  305.      * @param {Array} arr - Ô´Êý×é
  306.      * @param {number} depth - ±âƽ»¯Éî¶È£¬Ä¬ÈÏΪ1
  307.      * @returns {Array} ±âƽ»¯ºóµÄÊý×é
  308.      */
  309.     flatten: function(arr, depth) {
  310.         depth = depth || 1;
  311.         var result = [];
  312.         for (var i = 0; i < arr.length; i++) {
  313.             if (Array.isArray(arr[i]) && depth > 0) {
  314.                 result = result.concat(this.flatten(arr[i], depth - 1));
  315.             } else {
  316.                 result.push(arr[i]);
  317.             }
  318.         }
  319.         return result;
  320.     },
  321.    
  322.     /**
  323.      * Êý×é·Ö¿é
  324.      * @param {Array} arr - Ô´Êý×é
  325.      * @param {number} size - ÿ¿é´óС
  326.      * @returns {Array} ·Ö¿éºóµÄÊý×é
  327.      */
  328.     chunk: function(arr, size) {
  329.         var result = [];
  330.         for (var i = 0; i < arr.length; i += size) {
  331.             var chunk = [];
  332.             for (var j = i; j < i + size && j < arr.length; j++) {
  333.                 chunk.push(arr[j]);
  334.             }
  335.             result.push(chunk);
  336.         }
  337.         return result;
  338.     },
  339.    
  340.     /**
  341.      * Êý×éÅÅÐò£¨Ö§³Ö¶à×Ö¶ÎÅÅÐò£©
  342.      * @param {Array} arr - Ô´Êý×é
  343.      * @param {string|Array} fields - ÅÅÐò×Ö¶Î
  344.      * @param {string|Array} orders - ÅÅÐò·½Ê½ ('asc' »ò 'desc')
  345.      * @returns {Array} ÅÅÐòºóµÄÊý×é
  346.      */
  347.     orderBy: function(arr, fields, orders) {
  348.         if (!Array.isArray(fields)) {
  349.             fields = [fields];
  350.         }
  351.         if (!Array.isArray(orders)) {
  352.             orders = [orders || 'asc'];
  353.         }
  354.         return arr.slice().sort(function(a, b) {
  355.             for (var i = 0; i < fields.length; i++) {
  356.                 var field = fields[i];
  357.                 var order = orders[i] || 'asc';
  358.                 var aVal = a[field];
  359.                 var bVal = b[field];
  360.                 if (aVal < bVal) return order === 'asc' ? -1 : 1;
  361.                 if (aVal > bVal) return order === 'asc' ? 1 : -1;
  362.             }
  363.             return 0;
  364.         });
  365.     },
  366.    
  367.     /**
  368.      * Êý×é·Ö×é
  369.      * @param {Array} arr - Ô´Êý×é
  370.      * @param {Function|string} grouper - ·Ö×éÒÀ¾Ý£¨º¯Êý»òÊôÐÔÃû£©
  371.      * @returns {Object} ·Ö×éºóµÄ¶ÔÏó
  372.      */
  373.     groupBy: function(arr, grouper) {
  374.         var result = {};
  375.         var isFunction = typeof grouper === 'function';
  376.         for (var i = 0; i < arr.length; i++) {
  377.             var key = isFunction ? grouper(arr[i], i, arr) : arr[i][grouper];
  378.             if (!result[key]) {
  379.                 result[key] = [];
  380.             }
  381.             result[key].push(arr[i]);
  382.         }
  383.         return result;
  384.     },
  385.    
  386.     /**
  387.      * ´ÓÊý×éÖÐËæ»úȡһ¸öÔªËØ
  388.      * @param {Array} arr - Ô´Êý×é
  389.      * @returns {*} Ëæ»úÔªËØ
  390.      */
  391.     sample: function(arr) {
  392.         if (arr.length === 0) return undefined;
  393.         return arr[Math.floor(Math.random() * arr.length)];
  394.     },
  395.    
  396.     /**
  397.      * ´òÂÒÊý×é˳Ðò£¨Fisher-YatesËã·¨£©
  398.      * @param {Array} arr - Ô´Êý×é
  399.      * @returns {Array} ´òÂÒºóµÄÊý×é
  400.      */
  401.     shuffle: function(arr) {
  402.         var result = arr.slice();
  403.         for (var i = result.length - 1; i > 0; i--) {
  404.             var j = Math.floor(Math.random() * (i + 1));
  405.             var temp = result[i];
  406.             result[i] = result[j];
  407.             result[j] = temp;
  408.         }
  409.         return result;
  410.     }
  411. };

  412. // =============================================================================
  413. // µÚÈý²¿·Ö£º×Ö·û´®²Ù×÷¹¤¾ßÀà (StringUtils)
  414. // =============================================================================

  415. /**
  416. * ×Ö·û´®²Ù×÷¹¤¾ßÀà
  417. * Ìṩ×Ö·û´®¸ñʽ»¯¡¢ÑéÖ¤¡¢×ª»»µÈ¸ß¼¶¹¦ÄÜ
  418. */
  419. var StringUtils = {
  420.    
  421.     /**
  422.      * ¼ì²é×Ö·û´®ÊÇ·ñΪ¿Õ»ò¿Õ°×
  423.      * @param {string} str - Òª¼ì²éµÄ×Ö·û´®
  424.      * @returns {boolean} ÊÇ·ñΪ¿Õ
  425.      */
  426.     isEmpty: function(str) {
  427.         return !str || str.trim().length === 0;
  428.     },
  429.    
  430.     /**
  431.      * ×Ö·û´®·´×ª
  432.      * @param {string} str - Ô´×Ö·û´®
  433.      * @returns {string} ·´×ªºóµÄ×Ö·û´®
  434.      */
  435.     reverse: function(str) {
  436.         return str.split('').reverse().join('');
  437.     },
  438.    
  439.     /**
  440.      * ½ØÈ¡×Ö·û´®£¨Ö§³Ö¸ºÊýË÷Òý£©
  441.      * @param {string} str - Ô´×Ö·û´®
  442.      * @param {number} start - ¿ªÊ¼Î»ÖÃ
  443.      * @param {number} end - ½áÊøÎ»ÖÃ
  444.      * @returns {string} ½ØÈ¡ºóµÄ×Ö·û´®
  445.      */
  446.     slice: function(str, start, end) {
  447.         var len = str.length;
  448.         start = start < 0 ? Math.max(0, len + start) : Math.min(start, len);
  449.         end = end === undefined ? len : (end < 0 ? Math.max(0, len + end) : Math.min(end, len));
  450.         var result = '';
  451.         for (var i = start; i < end; i++) {
  452.             result += str[i];
  453.         }
  454.         return result;
  455.     },
  456.    
  457.     /**
  458.      * Ìî³ä×Ö·û´®µ½Ö¸¶¨³¤¶È
  459.      * @param {string} str - Ô´×Ö·û´®
  460.      * @param {number} length - Ä¿±ê³¤¶È
  461.      * @param {string} chars - Ìî³ä×Ö·û
  462.      * @param {boolean} left - ÊÇ·ñ×óÌî³ä
  463.      * @returns {string} Ìî³äºóµÄ×Ö·û´®
  464.      */
  465.     pad: function(str, length, chars, left) {
  466.         chars = chars || ' ';
  467.         if (str.length >= length) return str;
  468.         var padLength = length - str.length;
  469.         var padStr = '';
  470.         while (padStr.length < padLength) {
  471.             padStr += chars;
  472.         }
  473.         padStr = this.slice(padStr, 0, padLength);
  474.         return left ? padStr + str : str + padStr;
  475.     },
  476.    
  477.     /**
  478.      * ×óÌî³ä×Ö·û´®
  479.      * @param {string} str - Ô´×Ö·û´®
  480.      * @param {number} length - Ä¿±ê³¤¶È
  481.      * @param {string} chars - Ìî³ä×Ö·û
  482.      * @returns {string} Ìî³äºóµÄ×Ö·û´®
  483.      */
  484.     padStart: function(str, length, chars) {
  485.         return this.pad(str, length, chars, true);
  486.     },
  487.    
  488.     /**
  489.      * ÓÒÌî³ä×Ö·û´®
  490.      * @param {string} str - Ô´×Ö·û´®
  491.      * @param {number} length - Ä¿±ê³¤¶È
  492.      * @param {string} chars - Ìî³ä×Ö·û
  493.      * @returns {string} Ìî³äºóµÄ×Ö·û´®
  494.      */
  495.     padEnd: function(str, length, chars) {
  496.         return this.pad(str, length, chars, false);
  497.     },
  498.    
  499.     /**
  500.      * ÖØ¸´×Ö·û´®
  501.      * @param {string} str - Ô´×Ö·û´®
  502.      * @param {number} count - ÖØ¸´´ÎÊý
  503.      * @returns {string} ÖØ¸´ºóµÄ×Ö·û´®
  504.      */
  505.     repeat: function(str, count) {
  506.         if (count < 0) return '';
  507.         var result = '';
  508.         for (var i = 0; i < count; i++) {
  509.             result += str;
  510.         }
  511.         return result;
  512.     },
  513.    
  514.     /**
  515.      * ½Ø¶Ï×Ö·û´®²¢Ìí¼ÓÊ¡ÂÔºÅ
  516.      * @param {string} str - Ô´×Ö·û´®
  517.      * @param {number} length - ×î´ó³¤¶È
  518.      * @param {string} omission - Ê¡ÂÔ·ûºÅ
  519.      * @returns {string} ½Ø¶ÏºóµÄ×Ö·û´®
  520.      */
  521.     truncate: function(str, length, omission) {
  522.         omission = omission || '...';
  523.         if (str.length <= length) return str;
  524.         return this.slice(str, 0, length - omission.length) + omission;
  525.     },
  526.    
  527.     /**
  528.      * ÍÕ·åÃüÃûתÏ»®ÏßÃüÃû
  529.      * @param {string} str - ÍÕ·åÃüÃû×Ö·û´®
  530.      * @returns {string} Ï»®ÏßÃüÃû×Ö·û´®
  531.      */
  532.     camelToSnake: function(str) {
  533.         return str.replace(/([A-Z])/g, '_$1').toLowerCase().replace(/^_/, '');
  534.     },
  535.    
  536.     /**
  537.      * Ï»®ÏßÃüÃûתÍÕ·åÃüÃû
  538.      * @param {string} str - Ï»®ÏßÃüÃû×Ö·û´®
  539.      * @returns {string} ÍÕ·åÃüÃû×Ö·û´®
  540.      */
  541.     snakeToCamel: function(str) {
  542.         return str.replace(/_([a-z])/g, function(match, letter) {
  543.             return letter.toUpperCase();
  544.         });
  545.     },
  546.    
  547.     /**
  548.      * Ê××Öĸ´óд
  549.      * @param {string} str - Ô´×Ö·û´®
  550.      * @returns {string} ´¦ÀíºóµÄ×Ö·û´®
  551.      */
  552.     capitalize: function(str) {
  553.         if (this.isEmpty(str)) return str;
  554.         return str[0].toUpperCase() + this.slice(str, 1).toLowerCase();
  555.     },
  556.    
  557.     /**
  558.      * ¼ì²é×Ö·û´®ÊÇ·ñÒÔÖ¸¶¨Ç°×º¿ªÍ·
  559.      * @param {string} str - Ô´×Ö·û´®
  560.      * @param {string} prefix - ǰ׺
  561.      * @returns {boolean} ÊÇ·ñÒÔ¸Ãǰ׺¿ªÍ·
  562.      */
  563.     startsWith: function(str, prefix) {
  564.         if (prefix.length > str.length) return false;
  565.         return this.slice(str, 0, prefix.length) === prefix;
  566.     },
  567.    
  568.     /**
  569.      * ¼ì²é×Ö·û´®ÊÇ·ñÒÔÖ¸¶¨ºó׺½áβ
  570.      * @param {string} str - Ô´×Ö·û´®
  571.      * @param {string} suffix - ºó׺
  572.      * @returns {boolean} ÊÇ·ñÒԸúó׺½áβ
  573.      */
  574.     endsWith: function(str, suffix) {
  575.         if (suffix.length > str.length) return false;
  576.         return this.slice(str, str.length - suffix.length) === suffix;
  577.     },
  578.    
  579.     /**
  580.      * ÒÆ³ý×Ö·û´®ÖеĿհ××Ö·û
  581.      * @param {string} str - Ô´×Ö·û´®
  582.      * @returns {string} ´¦ÀíºóµÄ×Ö·û´®
  583.      */
  584.     removeWhitespace: function(str) {
  585.         var result = '';
  586.         for (var i = 0; i < str.length; i++) {
  587.             if (str[i] !== ' ' && str[i] !== '\t' && str[i] !== '\n' && str[i] !== '\r') {
  588.                 result += str[i];
  589.             }
  590.         }
  591.         return result;
  592.     },
  593.    
  594.     /**
  595.      * ͳ¼Æ×Ö·û³öÏÖ´ÎÊý
  596.      * @param {string} str - Ô´×Ö·û´®
  597.      * @param {string} char - Ҫͳ¼ÆµÄ×Ö·û
  598.      * @returns {number} ³öÏÖ´ÎÊý
  599.      */
  600.     countChar: function(str, char) {
  601.         var count = 0;
  602.         for (var i = 0; i < str.length; i++) {
  603.             if (str[i] === char) count++;
  604.         }
  605.         return count;
  606.     },
  607.    
  608.     /**
  609.      * Éú³ÉËæ»ú×Ö·û´®
  610.      * @param {number} length - ×Ö·û´®³¤¶È
  611.      * @param {string} chars - ×Ö·û¼¯
  612.      * @returns {string} Ëæ»ú×Ö·û´®
  613.      */
  614.     random: function(length, chars) {
  615.         chars = chars || 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  616.         var result = '';
  617.         for (var i = 0; i < length; i++) {
  618.             result += chars.charAt(Math.floor(Math.random() * chars.length));
  619.         }
  620.         return result;
  621.     }
  622. };

  623. // =============================================================================
  624. // µÚËIJ¿·Ö£ºÊýѧ¼ÆË㹤¾ßÀà (MathUtils)
  625. // =============================================================================

  626. /**
  627. * Êýѧ¼ÆË㹤¾ßÀà
  628. * ÌṩÊýÖµ¼ÆËã¡¢Ëæ»úÊýÉú³É¡¢¼¸ºÎ¼ÆËãµÈ¸ß¼¶¹¦ÄÜ
  629. */
  630. var MathUtils = {
  631.    
  632.     /**
  633.      * ½Ç¶Èת»¡¶È
  634.      * @param {number} degrees - ½Ç¶ÈÖµ
  635.      * @returns {number} »¡¶ÈÖµ
  636.      */
  637.     toRadians: function(degrees) {
  638.         return degrees * (Math.PI / 180);
  639.     },
  640.    
  641.     /**
  642.      * »¡¶Èת½Ç¶È
  643.      * @param {number} radians - »¡¶ÈÖµ
  644.      * @returns {number} ½Ç¶ÈÖµ
  645.      */
  646.     toDegrees: function(radians) {
  647.         return radians * (180 / Math.PI);
  648.     },
  649.    
  650.     /**
  651.      * ÏÞÖÆÊýÖµÔÚÖ¸¶¨·¶Î§ÄÚ
  652.      * @param {number} value - ÒªÏÞÖÆµÄÊýÖµ
  653.      * @param {number} min - ×îСֵ
  654.      * @param {number} max - ×î´óÖµ
  655.      * @returns {number} ÏÞÖÆºóµÄÊýÖµ
  656.      */
  657.     clamp: function(value, min, max) {
  658.         return Math.min(Math.max(value, min), max);
  659.     },
  660.    
  661.     /**
  662.      * ÏßÐÔ²åÖµ
  663.      * @param {number} start - Æðʼֵ
  664.      * @param {number} end - ½áÊøÖµ
  665.      * @param {number} t - ²åֵϵÊý (0-1)
  666.      * @returns {number} ²åÖµ½á¹û
  667.      */
  668.     lerp: function(start, end, t) {
  669.         return start + (end - start) * t;
  670.     },
  671.    
  672.     /**
  673.      * Á½µã¼ä¾àÀë
  674.      * @param {number} x1 - µÚÒ»µãX×ø±ê
  675.      * @param {number} y1 - µÚÒ»µãY×ø±ê
  676.      * @param {number} x2 - µÚ¶þµãX×ø±ê
  677.      * @param {number} y2 - µÚ¶þµãY×ø±ê
  678.      * @returns {number} ¾àÀë
  679.      */
  680.     distance: function(x1, y1, x2, y2) {
  681.         var dx = x2 - x1;
  682.         var dy = y2 - y1;
  683.         return Math.sqrt(dx * dx + dy * dy);
  684.     },
  685.    
  686.     /**
  687.      * ¼ÆËãÁ½µã¼ä½Ç¶È
  688.      * @param {number} x1 - µÚÒ»µãX×ø±ê
  689.      * @param {number} y1 - µÚÒ»µãY×ø±ê
  690.      * @param {number} x2 - µÚ¶þµãX×ø±ê
  691.      * @param {number} y2 - µÚ¶þµãY×ø±ê
  692.      * @returns {number} ½Ç¶È£¨¶È£©
  693.      */
  694.     angle: function(x1, y1, x2, y2) {
  695.         return this.toDegrees(Math.atan2(y2 - y1, x2 - x1));
  696.     },
  697.    
  698.     /**
  699.      * Éú³ÉÖ¸¶¨·¶Î§ÄÚµÄËæ»úÕûÊý
  700.      * @param {number} min - ×îСֵ£¨°üº¬£©
  701.      * @param {number} max - ×î´óÖµ£¨°üº¬£©
  702.      * @returns {number} Ëæ»úÕûÊý
  703.      */
  704.     randomInt: function(min, max) {
  705.         return Math.floor(Math.random() * (max - min + 1)) + min;
  706.     },
  707.    
  708.     /**
  709.      * Éú³ÉÖ¸¶¨·¶Î§ÄÚµÄËæ»ú¸¡µãÊý
  710.      * @param {number} min - ×îСֵ
  711.      * @param {number} max - ×î´óÖµ
  712.      * @returns {number} Ëæ»ú¸¡µãÊý
  713.      */
  714.     randomFloat: function(min, max) {
  715.         return Math.random() * (max - min) + min;
  716.     },
  717.    
  718.     /**
  719.      * ÅжϵãÊÇ·ñÔÚ¾ØÐÎÄÚ
  720.      * @param {number} px - µãX×ø±ê
  721.      * @param {number} py - µãY×ø±ê
  722.      * @param {number} rx - ¾ØÐÎ×óÉϽÇX×ø±ê
  723.      * @param {number} ry - ¾ØÐÎ×óÉϽÇY×ø±ê
  724.      * @param {number} rw - ¾ØÐοí¶È
  725.      * @param {number} rh - ¾ØÐθ߶È
  726.      * @returns {boolean} ÊÇ·ñÔÚ¾ØÐÎÄÚ
  727.      */
  728.     pointInRect: function(px, py, rx, ry, rw, rh) {
  729.         return px >= rx && px <= rx + rw && py >= ry && py <= ry + rh;
  730.     },
  731.    
  732.     /**
  733.      * ÅжϵãÊÇ·ñÔÚÔ²ÄÚ
  734.      * @param {number} px - µãX×ø±ê
  735.      * @param {number} py - µãY×ø±ê
  736.      * @param {number} cx - Ô²ÐÄX×ø±ê
  737.      * @param {number} cy - Ô²ÐÄY×ø±ê
  738.      * @param {number} radius - Ô²°ë¾¶
  739.      * @returns {boolean} ÊÇ·ñÔÚÔ²ÄÚ
  740.      */
  741.     pointInCircle: function(px, py, cx, cy, radius) {
  742.         return this.distance(px, py, cx, cy) <= radius;
  743.     },
  744.    
  745.     /**
  746.      * ¼ÆËãÆ½¾ùÖµ
  747.      * @param {...number} numbers - ÊýÖµÁбí
  748.      * @returns {number} ƽ¾ùÖµ
  749.      */
  750.     average: function() {
  751.         var sum = 0;
  752.         for (var i = 0; i < arguments.length; i++) {
  753.             sum += arguments[i];
  754.         }
  755.         return sum / arguments.length;
  756.     },
  757.    
  758.     /**
  759.      * ¼ÆËã±ê×¼²î
  760.      * @param {Array} numbers - ÊýÖµÊý×é
  761.      * @returns {number} ±ê×¼²î
  762.      */
  763.     standardDeviation: function(numbers) {
  764.         var avg = this.average.apply(this, numbers);
  765.         var sumSquaredDiff = 0;
  766.         for (var i = 0; i < numbers.length; i++) {
  767.             var diff = numbers[i] - avg;
  768.             sumSquaredDiff += diff * diff;
  769.         }
  770.         return Math.sqrt(sumSquaredDiff / numbers.length);
  771.     },
  772.    
  773.     /**
  774.      * ÅжÏÁ½¸ö¾ØÐÎÊÇ·ñÏཻ
  775.      * @param {Object} rect1 - µÚÒ»¸ö¾ØÐÎ {x, y, width, height}
  776.      * @param {Object} rect2 - µÚ¶þ¸ö¾ØÐÎ {x, y, width, height}
  777.      * @returns {boolean} ÊÇ·ñÏཻ
  778.      */
  779.     rectIntersect: function(rect1, rect2) {
  780.         return !(rect2.x > rect1.x + rect1.width ||
  781.                  rect2.x + rect2.width < rect1.x ||
  782.                  rect2.y > rect1.y + rect1.height ||
  783.                  rect2.y + rect2.height < rect1.y);
  784.     },
  785.    
  786.     /**
  787.      * ¼ÆËã½×³Ë
  788.      * @param {number} n - ·Ç¸ºÕûÊý
  789.      * @returns {number} ½×³Ë½á¹û
  790.      */
  791.     factorial: function(n) {
  792.         if (n < 0) return NaN;
  793.         if (n === 0 || n === 1) return 1;
  794.         var result = 1;
  795.         for (var i = 2; i <= n; i++) {
  796.             result *= i;
  797.         }
  798.         return result;
  799.     },
  800.    
  801.     /**
  802.      * ¼ÆËã×éºÏÊý C(n, k)
  803.      * @param {number} n - ×ÜÊý
  804.      * @param {number} k - ѡȡÊý
  805.      * @returns {number} ×éºÏÊý
  806.      */
  807.     combination: function(n, k) {
  808.         if (k > n) return 0;
  809.         if (k === 0 || k === n) return 1;
  810.         return this.factorial(n) / (this.factorial(k) * this.factorial(n - k));
  811.     }
  812. };

  813. // =============================================================================
  814. // µÚÎ岿·Ö£ºÊý×Ö´¦Àí¹¤¾ßÀà (NumberUtils)
  815. // =============================================================================

  816. /**
  817. * Êý×Ö´¦Àí¹¤¾ßÀà
  818. * ÌṩÊý×Ö¸ñʽ»¯¡¢×ª»»¡¢ÑéÖ¤µÈ¸ß¼¶¹¦ÄÜ
  819. */
  820. var NumberUtils = {
  821.    
  822.     /**
  823.      * ½«Êý×Ö¸ñʽ»¯ÎªÇ§·Öλ×Ö·û´®
  824.      * @param {number} num - Òª¸ñʽ»¯µÄÊý×Ö
  825.      * @param {number} decimals - СÊýλÊý
  826.      * @returns {string} ¸ñʽ»¯ºóµÄ×Ö·û´®
  827.      */
  828.     formatThousands: function(num, decimals) {
  829.         decimals = decimals !== undefined ? decimals : 2;
  830.         var fixed = num.toFixed(decimals);
  831.         var parts = fixed.split('.');
  832.         var integerPart = parts[0];
  833.         var decimalPart = parts[1] || '';
  834.         var result = '';
  835.         var count = 0;
  836.         for (var i = integerPart.length - 1; i >= 0; i--) {
  837.             result = integerPart[i] + result;
  838.             count++;
  839.             if (count % 3 === 0 && i > 0 && integerPart[i - 1] !== '-') {
  840.                 result = ',' + result;
  841.             }
  842.         }
  843.         return decimalPart ? result + '.' + decimalPart : result;
  844.     },
  845.    
  846.     /**
  847.      * ½«×Ö½ÚÊýת»»Îª¿É¶Á¸ñʽ
  848.      * @param {number} bytes - ×Ö½ÚÊý
  849.      * @param {number} decimals - СÊýλÊý
  850.      * @returns {string} ¿É¶Á¸ñʽ×Ö·û´®
  851.      */
  852.     formatBytes: function(bytes, decimals) {
  853.         decimals = decimals !== undefined ? decimals : 2;
  854.         if (bytes === 0) return '0 Bytes';
  855.         var k = 1024;
  856.         var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
  857.         var i = Math.floor(Math.log(bytes) / Math.log(k));
  858.         return parseFloat((bytes / Math.pow(k, i)).toFixed(decimals)) + ' ' + sizes[i];
  859.     },
  860.    
  861.     /**
  862.      * ½«ºÁÃëת»»Îª¿É¶Áʱ¼ä
  863.      * @param {number} ms - ºÁÃëÊý
  864.      * @returns {string} ¿É¶Áʱ¼ä×Ö·û´®
  865.      */
  866.     formatDuration: function(ms) {
  867.         if (ms < 1000) return ms + 'ms';
  868.         var seconds = Math.floor(ms / 1000);
  869.         if (seconds < 60) return seconds + 's';
  870.         var minutes = Math.floor(seconds / 60);
  871.         if (minutes < 60) return minutes + 'm ' + (seconds % 60) + 's';
  872.         var hours = Math.floor(minutes / 60);
  873.         return hours + 'h ' + (minutes % 60) + 'm';
  874.     },
  875.    
  876.     /**
  877.      * ¼ì²éÊÇ·ñΪÕûÊý
  878.      * @param {*} value - Òª¼ì²éµÄÖµ
  879.      * @returns {boolean} ÊÇ·ñΪÕûÊý
  880.      */
  881.     isInteger: function(value) {
  882.         return typeof value === 'number' && isFinite(value) && Math.floor(value) === value;
  883.     },
  884.    
  885.     /**
  886.      * ¼ì²éÊÇ·ñΪÊý×Ö
  887.      * @param {*} value - Òª¼ì²éµÄÖµ
  888.      * @returns {boolean} ÊÇ·ñΪÊý×Ö
  889.      */
  890.     isNumber: function(value) {
  891.         return typeof value === 'number' && isFinite(value);
  892.     },
  893.    
  894.     /**
  895.      * ½«×Ö·û´®×ª»»ÎªÊý×Ö
  896.      * @param {string} str - Ҫת»»µÄ×Ö·û´®
  897.      * @param {*} defaultValue - ת»»Ê§°ÜʱµÄĬÈÏÖµ
  898.      * @returns {number} ת»»ºóµÄÊý×Ö
  899.      */
  900.     toNumber: function(str, defaultValue) {
  901.         var num = parseFloat(str);
  902.         return isNaN(num) ? defaultValue : num;
  903.     },
  904.    
  905.     /**
  906.      * ½«Êý×Öת»»ÎªÖÐÎÄ´óд½ð¶î
  907.      * @param {number} num - Ҫת»»µÄÊý×Ö
  908.      * @returns {string} ÖÐÎÄ´óд½ð¶î
  909.      */
  910.     toChineseMoney: function(num) {
  911.         var units = ['', 'Ê®', '°Ù', 'ǧ'];
  912.         var bigUnits = ['', 'Íò', 'ÒÚ'];
  913.         var digits = ['Áã', 'Ò»', '¶þ', 'Èý', 'ËÄ', 'Îå', 'Áù', 'Æß', '°Ë', '¾Å'];
  914.         
  915.         if (num === 0) return 'Áã';
  916.         if (num < 0) return '¸º' + this.toChineseMoney(-num);
  917.         
  918.         var strNum = Math.floor(num).toString();
  919.         var result = '';
  920.         var zeroCount = 0;
  921.         var bigUnitIndex = 0;
  922.         
  923.         for (var i = strNum.length - 1; i >= 0; i -= 4) {
  924.             var part = '';
  925.             var partZero = true;
  926.             for (var j = 0; j < 4 && i - j >= 0; j++) {
  927.                 var digit = parseInt(strNum[i - j]);
  928.                 if (digit === 0) {
  929.                     zeroCount++;
  930.                 } else {
  931.                     if (zeroCount > 0) {
  932.                         part = digits[0] + part;
  933.                         zeroCount = 0;
  934.                     }
  935.                     part = digits[digit] + units[j] + part;
  936.                     partZero = false;
  937.                 }
  938.             }
  939.             if (!partZero) {
  940.                 result = part + bigUnits[bigUnitIndex] + result;
  941.             }
  942.             bigUnitIndex++;
  943.         }
  944.         
  945.         return result.replace(/Áã+/g, 'Áã').replace(/Áã$/, '');
  946.     },
  947.    
  948.     /**
  949.      * ½«Êý×Öת»»ÎªÂÞÂíÊý×Ö
  950.      * @param {number} num - Ҫת»»µÄÊý×Ö (1-3999)
  951.      * @returns {string} ÂÞÂíÊý×Ö
  952.      */
  953.     toRoman: function(num) {
  954.         if (num < 1 || num > 3999) return '';
  955.         var values = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1];
  956.         var symbols = ['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I'];
  957.         var result = '';
  958.         for (var i = 0; i < values.length; i++) {
  959.             while (num >= values[i]) {
  960.                 result += symbols[i];
  961.                 num -= values[i];
  962.             }
  963.         }
  964.         return result;
  965.     },
  966.    
  967.     /**
  968.      * ½«ÂÞÂíÊý×Öת»»ÎªÊý×Ö
  969.      * @param {string} roman - ÂÞÂíÊý×Ö
  970.      * @returns {number} ת»»ºóµÄÊý×Ö
  971.      */
  972.     fromRoman: function(roman) {
  973.         var values = {I: 1, V: 5, X: 10, L: 50, C: 100, D: 500, M: 1000};
  974.         var result = 0;
  975.         for (var i = 0; i < roman.length; i++) {
  976.             var current = values[roman[i]];
  977.             var next = values[roman[i + 1]];
  978.             if (next && current < next) {
  979.                 result -= current;
  980.             } else {
  981.                 result += current;
  982.             }
  983.         }
  984.         return result;
  985.     },
  986.    
  987.     /**
  988.      * Éú³ÉÖ¸¶¨·¶Î§ÄÚµÄËæ»úÊýÊý×é
  989.      * @param {number} count - Êý×鳤¶È
  990.      * @param {number} min - ×îСֵ
  991.      * @param {number} max - ×î´óÖµ
  992.      * @returns {Array} Ëæ»úÊýÊý×é
  993.      */
  994.     randomArray: function(count, min, max) {
  995.         var result = [];
  996.         for (var i = 0; i < count; i++) {
  997.             result.push(MathUtils.randomInt(min, max));
  998.         }
  999.         return result;
  1000.     }
  1001. };

  1002. // =============================================================================
  1003. // µÚÁù²¿·Ö£ºÊ±¼ä¹ÜÀí¹¤¾ßÀà (TimeUtils)
  1004. // =============================================================================

  1005. /**
  1006. * ʱ¼ä¹ÜÀí¹¤¾ßÀà
  1007. * ÌṩÈÕÆÚʱ¼ä¸ñʽ»¯¡¢¼ÆË㡢ת»»µÈ¸ß¼¶¹¦ÄÜ
  1008. */
  1009. var TimeUtils = {
  1010.    
  1011.     /**
  1012.      * ¸ñʽ»¯ÈÕÆÚʱ¼ä
  1013.      * @param {Date} date - ÈÕÆÚ¶ÔÏó
  1014.      * @param {string} format - ¸ñʽ×Ö·û´® (yyyy-MM-dd HH:mm:ss)
  1015.      * @returns {string} ¸ñʽ»¯ºóµÄ×Ö·û´®
  1016.      */
  1017.     format: function(date, format) {
  1018.         format = format || 'yyyy-MM-dd HH:mm:ss';
  1019.         var year = date.getFullYear();
  1020.         var month = date.getMonth() + 1;
  1021.         var day = date.getDate();
  1022.         var hours = date.getHours();
  1023.         var minutes = date.getMinutes();
  1024.         var seconds = date.getSeconds();
  1025.         var milliseconds = date.getMilliseconds();
  1026.         
  1027.         return format
  1028.             .replace(/yyyy/g, year)
  1029.             .replace(/MM/g, StringUtils.padStart(month.toString(), 2, '0'))
  1030.             .replace(/dd/g, StringUtils.padStart(day.toString(), 2, '0'))
  1031.             .replace(/HH/g, StringUtils.padStart(hours.toString(), 2, '0'))
  1032.             .replace(/mm/g, StringUtils.padStart(minutes.toString(), 2, '0'))
  1033.             .replace(/ss/g, StringUtils.padStart(seconds.toString(), 2, '0'))
  1034.             .replace(/SSS/g, StringUtils.padStart(milliseconds.toString(), 3, '0'));
  1035.     },
  1036.    
  1037.     /**
  1038.      * »ñÈ¡µ±Ç°Ê±¼ä×Ö·û´®
  1039.      * @param {string} format - ¸ñʽ×Ö·û´®
  1040.      * @returns {string} µ±Ç°Ê±¼ä×Ö·û´®
  1041.      */
  1042.     now: function(format) {
  1043.         return this.format(new Date(), format);
  1044.     },
  1045.    
  1046.     /**
  1047.      * »ñÈ¡½ñÌìµÄ¿ªÊ¼Ê±¼ä
  1048.      * @returns {Date} ½ñÌìµÄ¿ªÊ¼Ê±¼ä
  1049.      */
  1050.     startOfDay: function() {
  1051.         var date = new Date();
  1052.         date.setHours(0, 0, 0, 0);
  1053.         return date;
  1054.     },
  1055.    
  1056.     /**
  1057.      * »ñÈ¡½ñÌìµÄ½áÊøÊ±¼ä
  1058.      * @returns {Date} ½ñÌìµÄ½áÊøÊ±¼ä
  1059.      */
  1060.     endOfDay: function() {
  1061.         var date = new Date();
  1062.         date.setHours(23, 59, 59, 999);
  1063.         return date;
  1064.     },
  1065.    
  1066.     /**
  1067.      * Ìí¼Óʱ¼ä
  1068.      * @param {Date} date - Ô­ÈÕÆÚ
  1069.      * @param {number} amount - ÊýÁ¿
  1070.      * @param {string} unit - µ¥Î» (year, month, day, hour, minute, second)
  1071.      * @returns {Date} еÄÈÕÆÚ
  1072.      */
  1073.     add: function(date, amount, unit) {
  1074.         var result = new Date(date);
  1075.         switch (unit) {
  1076.             case 'year':
  1077.                 result.setFullYear(result.getFullYear() + amount);
  1078.                 break;
  1079.             case 'month':
  1080.                 result.setMonth(result.getMonth() + amount);
  1081.                 break;
  1082.             case 'day':
  1083.                 result.setDate(result.getDate() + amount);
  1084.                 break;
  1085.             case 'hour':
  1086.                 result.setHours(result.getHours() + amount);
  1087.                 break;
  1088.             case 'minute':
  1089.                 result.setMinutes(result.getMinutes() + amount);
  1090.                 break;
  1091.             case 'second':
  1092.                 result.setSeconds(result.getSeconds() + amount);
  1093.                 break;
  1094.         }
  1095.         return result;
  1096.     },
  1097.    
  1098.     /**
  1099.      * ¼ÆËãÁ½¸öÈÕÆÚÖ®¼äµÄ²îÖµ
  1100.      * @param {Date} date1 - µÚÒ»¸öÈÕÆÚ
  1101.      * @param {Date} date2 - µÚ¶þ¸öÈÕÆÚ
  1102.      * @param {string} unit - ·µ»Øµ¥Î» (ms, s, m, h, d)
  1103.      * @returns {number} ²îÖµ
  1104.      */
  1105.     diff: function(date1, date2, unit) {
  1106.         var diffMs = date2 - date1;
  1107.         switch (unit) {
  1108.             case 'ms': return diffMs;
  1109.             case 's': return Math.floor(diffMs / 1000);
  1110.             case 'm': return Math.floor(diffMs / (1000 * 60));
  1111.             case 'h': return Math.floor(diffMs / (1000 * 60 * 60));
  1112.             case 'd': return Math.floor(diffMs / (1000 * 60 * 60 * 24));
  1113.             default: return diffMs;
  1114.         }
  1115.     },
  1116.    
  1117.     /**
  1118.      * ÅжÏÊÇ·ñΪÈòÄê
  1119.      * @param {number} year - Äê·Ý
  1120.      * @returns {boolean} ÊÇ·ñΪÈòÄê
  1121.      */
  1122.     isLeapYear: function(year) {
  1123.         return (year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0);
  1124.     },
  1125.    
  1126.     /**
  1127.      * »ñȡԷÝÌìÊý
  1128.      * @param {number} year - Äê·Ý
  1129.      * @param {number} month - ÔÂ·Ý (1-12)
  1130.      * @returns {number} ÌìÊý
  1131.      */
  1132.     daysInMonth: function(year, month) {
  1133.         var days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
  1134.         if (month === 2 && this.isLeapYear(year)) {
  1135.             return 29;
  1136.         }
  1137.         return days[month - 1];
  1138.     },
  1139.    
  1140.     /**
  1141.      * »ñÈ¡ÈÕÆÚÊÇÐÇÆÚ¼¸
  1142.      * @param {Date} date - ÈÕÆÚ
  1143.      * @returns {string} ÐÇÆÚ¼¸
  1144.      */
  1145.     dayOfWeek: function(date) {
  1146.         var days = ['ÐÇÆÚÈÕ', 'ÐÇÆÚÒ»', 'ÐÇÆÚ¶þ', 'ÐÇÆÚÈý', 'ÐÇÆÚËÄ', 'ÐÇÆÚÎå', 'ÐÇÆÚÁù'];
  1147.         return days[date.getDay()];
  1148.     },
  1149.    
  1150.     /**
  1151.      * »ñÈ¡ÈÕÆÚÊÇÒ»ÄêÖеĵڼ¸Ìì
  1152.      * @param {Date} date - ÈÕÆÚ
  1153.      * @returns {number} µÚ¼¸Ìì
  1154.      */
  1155.     dayOfYear: function(date) {
  1156.         var start = new Date(date.getFullYear(), 0, 0);
  1157.         var diff = date - start;
  1158.         return Math.floor(diff / (1000 * 60 * 60 * 24));
  1159.     },
  1160.    
  1161.     /**
  1162.      * »ñÈ¡ÈÕÆÚËùÔÚÖܵįðʼÈÕÆÚ
  1163.      * @param {Date} date - ÈÕÆÚ
  1164.      * @returns {Date} ÖÜÆðʼÈÕÆÚ£¨ÖÜÒ»£©
  1165.      */
  1166.     startOfWeek: function(date) {
  1167.         var result = new Date(date);
  1168.         var day = result.getDay();
  1169.         var diff = result.getDate() - day + (day === 0 ? -6 : 1);
  1170.         result.setDate(diff);
  1171.         result.setHours(0, 0, 0, 0);
  1172.         return result;
  1173.     },
  1174.    
  1175.     /**
  1176.      * µ¹¼ÆÊ±¸ñʽ»¯
  1177.      * @param {number} seconds - Ê£ÓàÃëÊý
  1178.      * @returns {string} ¸ñʽ»¯ºóµÄµ¹¼ÆÊ±
  1179.      */
  1180.     countdown: function(seconds) {
  1181.         var hours = Math.floor(seconds / 3600);
  1182.         var minutes = Math.floor((seconds % 3600) / 60);
  1183.         var secs = seconds % 60;
  1184.         return StringUtils.padStart(hours.toString(), 2, '0') + ':' +
  1185.                StringUtils.padStart(minutes.toString(), 2, '0') + ':' +
  1186.                StringUtils.padStart(secs.toString(), 2, '0');
  1187.     },
  1188.    
  1189.     /**
  1190.      * »ñÈ¡Ïà¶Ôʱ¼äÃèÊö
  1191.      * @param {Date} date - ÈÕÆÚ
  1192.      * @returns {string} Ïà¶Ôʱ¼äÃèÊö
  1193.      */
  1194.     fromNow: function(date) {
  1195.         var now = new Date();
  1196.         var diff = Math.floor((now - date) / 1000);
  1197.         
  1198.         if (diff < 60) return '¸Õ¸Õ';
  1199.         if (diff < 3600) return Math.floor(diff / 60) + '·ÖÖÓǰ';
  1200.         if (diff < 86400) return Math.floor(diff / 3600) + 'Сʱǰ';
  1201.         if (diff < 604800) return Math.floor(diff / 86400) + 'Ììǰ';
  1202.         return this.format(date, 'yyyy-MM-dd');
  1203.     },
  1204.    
  1205.     /**
  1206.      * ½âÎöÈÕÆÚ×Ö·û´®
  1207.      * @param {string} str - ÈÕÆÚ×Ö·û´®
  1208.      * @returns {Date} ÈÕÆÚ¶ÔÏó
  1209.      */
  1210.     parse: function(str) {
  1211.         return new Date(str);
  1212.     },
  1213.    
  1214.     /**
  1215.      * »ñȡʱ¼ä´Á
  1216.      * @param {Date} date - ÈÕÆÚ¶ÔÏó£¬Ä¬ÈÏΪµ±Ç°Ê±¼ä
  1217.      * @returns {number} ʱ¼ä´Á
  1218.      */
  1219.     timestamp: function(date) {
  1220.         return (date || new Date()).getTime();
  1221.     },
  1222.    
  1223.     /**
  1224.      * ÐÝÃßÖ¸¶¨ºÁÃëÊý£¨×èÈûʽ£©
  1225.      * @param {number} ms - ºÁÃëÊý
  1226.      */
  1227.     sleep: function(ms) {
  1228.         var start = new Date().getTime();
  1229.         while (new Date().getTime() - start < ms) {
  1230.             // ×èÈûµÈ´ý
  1231.         }
  1232.     },
  1233.    
  1234.     /**
  1235.      * Éú³Éʱ¼ä·¶Î§Êý×é
  1236.      * @param {Date} start - ¿ªÊ¼ÈÕÆÚ
  1237.      * @param {Date} end - ½áÊøÈÕÆÚ
  1238.      * @param {string} unit - ²½½øµ¥Î» (day, week, month)
  1239.      * @returns {Array} ÈÕÆÚÊý×é
  1240.      */
  1241.     range: function(start, end, unit) {
  1242.         var result = [];
  1243.         var current = new Date(start);
  1244.         var endDate = new Date(end);
  1245.         
  1246.         while (current <= endDate) {
  1247.             result.push(new Date(current));
  1248.             switch (unit) {
  1249.                 case 'day':
  1250.                     current.setDate(current.getDate() + 1);
  1251.                     break;
  1252.                 case 'week':
  1253.                     current.setDate(current.getDate() + 7);
  1254.                     break;
  1255.                 case 'month':
  1256.                     current.setMonth(current.getMonth() + 1);
  1257.                     break;
  1258.             }
  1259.         }
  1260.         return result;
  1261.     }
  1262. };

  1263. // =============================================================================
  1264. // µÚÆß²¿·Ö£º×ÛºÏÑÝʾº¯Êý
  1265. // =============================================================================

  1266. /**
  1267. * ÑÓ³Ùº¯Êý - ºÁÃë
  1268. */
  1269. function delay(ms) {
  1270.     var start = new Date().getTime();
  1271.     while (new Date().getTime() - start < ms) {}
  1272. }

  1273. /**
  1274. * ÔËÐÐËùÓй¤¾ßÀàµÄÑÝʾ
  1275. */
  1276. function runAllDemos() {
  1277.     printl('');
  1278.     printl('¨X¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨[');
  1279.     printl('¨U           AIWROK ºËÐŤ¾ß¿âÍêÕûʾÀý v2.0                      ¨U');
  1280.     printl('¨^¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨a');
  1281.     printl('');
  1282.     delay(800);
  1283.    
  1284.     demoObjectUtils();
  1285.     delay(500);
  1286.     demoArrayUtils();
  1287.     delay(500);
  1288.     demoStringUtils();
  1289.     delay(500);
  1290.     demoMathUtils();
  1291.     delay(500);
  1292.     demoNumberUtils();
  1293.     delay(500);
  1294.     demoTimeUtils();
  1295.    
  1296.     printl('');
  1297.     printl('¨X¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨[');
  1298.     printl('¨U                   ✓ ËùÓÐÑÝʾÒÑÍê³É£¡                          ¨U');
  1299.     printl('¨^¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨a');
  1300.     printl('');
  1301. }

  1302. /**
  1303. * ¶ÔÏó²Ù×÷¹¤¾ßÀàÑÝʾ
  1304. */
  1305. function demoObjectUtils() {
  1306.     printl('©°©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©´');
  1307.     printl('©¦  ObjectUtils - ¶ÔÏó²Ù×÷¹¤¾ßÀà                                  ©¦');
  1308.     printl('©¸©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¼');
  1309.     printl('');
  1310.     delay(400);
  1311.    
  1312.     printl('▶ 1. Éî¶ÈºÏ²¢ - ºÏ²¢¶à¸ö¶ÔÏ󣨰üº¬Ç¶Ì×¶ÔÏó£©');
  1313.     delay(300);
  1314.     var obj1 = { a: 1, b: { c: 2 } };
  1315.     var obj2 = { b: { d: 3 }, e: 4 };
  1316.     var merged = ObjectUtils.deepMerge({}, obj1, obj2);
  1317.     printl('   Ô´¶ÔÏó1: ' + JSON.stringify(obj1));
  1318.     delay(200);
  1319.     printl('   Ô´¶ÔÏó2: ' + JSON.stringify(obj2));
  1320.     delay(200);
  1321.     printl('   ºÏ²¢½á¹û: ' + JSON.stringify(merged));
  1322.     delay(500);
  1323.    
  1324.     printl('▶ 2. Éî¶È¿Ë¡ - ÍêÕû¸´ÖƶÔÏ󣨰üº¬Ç¶Ì×¶ÔÏó£©');
  1325.     delay(300);
  1326.     var original = { x: 1, y: { z: 2 } };
  1327.     var cloned = ObjectUtils.deepClone(original);
  1328.     printl('   Ô­¶ÔÏó: ' + JSON.stringify(original));
  1329.     delay(200);
  1330.     printl('   ¿Ë¡: ' + JSON.stringify(cloned));
  1331.     delay(500);
  1332.    
  1333.     printl('▶ 3. °²È«»ñÈ¡ - »ñȡǶÌ×ÊôÐÔ£¬±ÜÃⱨ´í');
  1334.     delay(300);
  1335.     var data = { user: { profile: { name: 'ÕÅÈý' } } };
  1336.     var name = ObjectUtils.getSafe(data, 'user.profile.name', 'δ֪');
  1337.     printl('   Êý¾Ý: { user: { profile: { name: "ÕÅÈý" } } }');
  1338.     delay(200);
  1339.     printl('   ¶ÁÈ¡ user.profile.name: ' + name);
  1340.     delay(200);
  1341.     var noExist = ObjectUtils.getSafe(data, 'user.profile.age', 'ĬÈÏÖµ');
  1342.     printl('   ¶ÁÈ¡ user.profile.age£¨²»´æÔÚ£©: ' + noExist);
  1343.     delay(500);
  1344.    
  1345.     printl('▶ 4. ¶ÔÏóת²éѯ×Ö·û´®');
  1346.     delay(300);
  1347.     var params = { name: 'ÕÅÈý', age: 25 };
  1348.     var query = ObjectUtils.toQueryString(params);
  1349.     printl('   ¶ÔÏó: ' + JSON.stringify(params));
  1350.     delay(200);
  1351.     printl('   ²éѯ×Ö·û´®: ' + query);
  1352.     delay(500);
  1353.    
  1354.     printl('▶ 5. ²éѯ×Ö·û´®×ª¶ÔÏó');
  1355.     delay(300);
  1356.     var parsed = ObjectUtils.fromQueryString(query);
  1357.     printl('   ½âÎö½á¹û: ' + JSON.stringify(parsed));
  1358.     delay(500);
  1359.    
  1360.     printl('');
  1361. }

  1362. /**
  1363. * Êý×é²Ù×÷¹¤¾ßÀàÑÝʾ
  1364. */
  1365. function demoArrayUtils() {
  1366.     printl('©°©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©´');
  1367.     printl('©¦  ArrayUtils - Êý×é²Ù×÷¹¤¾ßÀà                                  ©¦');
  1368.     printl('©¸©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¼');
  1369.     printl('');
  1370.     delay(400);
  1371.    
  1372.     printl('▶ 1. Êý×éÈ¥ÖØ - ÒÆ³ýÖØ¸´ÔªËØ');
  1373.     delay(300);
  1374.     var arr1 = [1, 2, 2, 3, 3, 3, 4, 4, 5];
  1375.     printl('   Ô­Ê¼Êý×é: ' + JSON.stringify(arr1));
  1376.     delay(200);
  1377.     var unique = ArrayUtils.unique(arr1);
  1378.     printl('   È¥Öؽá¹û: ' + JSON.stringify(unique));
  1379.     delay(500);
  1380.    
  1381.     printl('▶ 2. Êý×é¹ýÂË - °´Ìõ¼þɸѡ');
  1382.     delay(300);
  1383.     var arr2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
  1384.     printl('   Ô­Ê¼Êý×é: ' + JSON.stringify(arr2));
  1385.     delay(200);
  1386.     var filtered = ArrayUtils.filter(arr2, function(x) { return x > 5; });
  1387.     printl('   ¹ýÂËÌõ¼þ: x > 5');
  1388.     printl('   ¹ýÂ˽á¹û: ' + JSON.stringify(filtered));
  1389.     delay(500);
  1390.    
  1391.     printl('▶ 3. Êý×éÓ³Éä - ת»»Ã¿¸öÔªËØ');
  1392.     delay(300);
  1393.     printl('   Ô­Ê¼Êý×é: ' + JSON.stringify(arr2));
  1394.     delay(200);
  1395.     var mapped = ArrayUtils.map(arr2, function(x) { return x * 2; });
  1396.     printl('   Ó³É乿Ôò: x * 2');
  1397.     printl('   Ó³Éä½á¹û: ' + JSON.stringify(mapped));
  1398.     delay(500);
  1399.    
  1400.     printl('▶ 4. Êý×é·Ö¿é - ½«Êý×é·Ö³É¶à¸öС¿é');
  1401.     delay(300);
  1402.     var arr3 = [1, 2, 3, 4, 5, 6];
  1403.     printl('   Ô­Ê¼Êý×é: ' + JSON.stringify(arr3));
  1404.     delay(200);
  1405.     var chunked = ArrayUtils.chunk(arr3, 2);
  1406.     printl('   ·Ö¿é´óС: 2');
  1407.     printl('   ·Ö¿é½á¹û: ' + JSON.stringify(chunked));
  1408.     delay(500);
  1409.    
  1410.     printl('▶ 5. Êý×éËæ»úÈ¡Ñù - Ëæ»ú³éÈ¡ÔªËØ');
  1411.     delay(300);
  1412.     var arr4 = ['Æ»¹û', 'Ïã½¶', '³È×Ó', 'ÆÏÌÑ', 'Î÷¹Ï'];
  1413.     printl('   Ë®¹ûÁбí: ' + JSON.stringify(arr4));
  1414.     delay(200);
  1415.     var sample = ArrayUtils.sample(arr4);
  1416.     printl('   Ëæ»ú³éÈ¡: ' + sample + ' &#127881;');
  1417.     delay(500);
  1418.    
  1419.     printl('');
  1420. }

  1421. /**
  1422. * ×Ö·û´®²Ù×÷¹¤¾ßÀàÑÝʾ
  1423. */
  1424. function demoStringUtils() {
  1425.     printl('©°©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©´');
  1426.     printl('©¦  StringUtils - ×Ö·û´®²Ù×÷¹¤¾ßÀà                                ©¦');
  1427.     printl('©¸©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¼');
  1428.     printl('');
  1429.     delay(400);
  1430.    
  1431.     printl('▶ 1. ×Ö·û´®Ìî³ä - ²¹ÆëλÊý');
  1432.     delay(300);
  1433.     var padded = StringUtils.padStart('42', 5, '0');
  1434.     printl('   Ô­×Ö·û´®: "42"');
  1435.     printl('   Ä¿±ê³¤¶È: 5, Ìî³ä×Ö·û: "0"');
  1436.     printl('   Ìî³ä½á¹û: "' + padded + '"');
  1437.     delay(500);
  1438.    
  1439.     printl('▶ 2. ×Ö·û´®½Ø¶Ï - ÏÞÖÆ³¤¶È');
  1440.     delay(300);
  1441.     var longText = 'ÕâÊÇÒ»¶Î·Ç³£³¤µÄ×Ö·û´®£¬ÐèÒª½Ø¶ÏÏÔʾ';
  1442.     printl('   Ô­ÎÄ: ' + longText);
  1443.     delay(200);
  1444.     var truncated = StringUtils.truncate(longText, 15);
  1445.     printl('   ½Ø¶Ï³¤¶È: 15');
  1446.     printl('   ½Ø¶Ï½á¹û: ' + truncated);
  1447.     delay(500);
  1448.    
  1449.     printl('▶ 3. ÍÕ·åתÏ»®Ïß - ÃüÃû·ç¸ñת»»');
  1450.     delay(300);
  1451.     var camel = 'userNameAndPassword';
  1452.     printl('   ÍÕ·åÃüÃû: ' + camel);
  1453.     delay(200);
  1454.     var snake = StringUtils.camelToSnake(camel);
  1455.     printl('   Ï»®Ïß: ' + snake);
  1456.     delay(500);
  1457.    
  1458.     printl('▶ 4. Ê××Öĸ´óд');
  1459.     delay(300);
  1460.     var text = 'hello world';
  1461.     printl('   Ô­ÎÄ: ' + text);
  1462.     delay(200);
  1463.     var capitalized = StringUtils.capitalize(text);
  1464.     printl('   Ê××Öĸ´óд: ' + capitalized);
  1465.     delay(500);
  1466.    
  1467.     printl('▶ 5. Éú³ÉËæ»ú×Ö·û´®');
  1468.     delay(300);
  1469.     var random = StringUtils.random(12);
  1470.     printl('   Ëæ»ú×Ö·û´®(12λ): ' + random);
  1471.     delay(500);
  1472.    
  1473.     printl('');
  1474. }

  1475. /**
  1476. * Êýѧ¼ÆË㹤¾ßÀàÑÝʾ
  1477. */
  1478. function demoMathUtils() {
  1479.     printl('©°©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©´');
  1480.     printl('©¦  MathUtils - Êýѧ¼ÆË㹤¾ßÀà                                   ©¦');
  1481.     printl('©¸©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¼');
  1482.     printl('');
  1483.     delay(400);
  1484.    
  1485.     printl('▶ 1. ½Ç¶ÈÓ뻡¶Èת»»');
  1486.     delay(300);
  1487.     var degrees = 180;
  1488.     printl('   ½Ç¶È: ' + degrees + '¡ã');
  1489.     delay(200);
  1490.     var radians = MathUtils.toRadians(degrees);
  1491.     printl('   »¡¶È: ' + radians.toFixed(4));
  1492.     delay(500);
  1493.    
  1494.     printl('▶ 2. ÊýÖµ·¶Î§ÏÞÖÆ');
  1495.     delay(300);
  1496.     var testValue = 150;
  1497.     printl('   ²âÊÔÖµ: ' + testValue);
  1498.     delay(200);
  1499.     var clamped = MathUtils.clamp(testValue, 0, 100);
  1500.     printl('   ÏÞÖÆ·¶Î§: 0-100');
  1501.     printl('   ÏÞÖÆ½á¹û: ' + clamped);
  1502.     delay(500);
  1503.    
  1504.     printl('▶ 3. Á½µã¾àÀë¼ÆËã');
  1505.     delay(300);
  1506.     var x1 = 0, y1 = 0, x2 = 3, y2 = 4;
  1507.     printl('   µãA: (' + x1 + ', ' + y1 + ')');
  1508.     printl('   µãB: (' + x2 + ', ' + y2 + ')');
  1509.     delay(200);
  1510.     var distance = MathUtils.distance(x1, y1, x2, y2);
  1511.     printl('   ¾àÀë: ' + distance);
  1512.     delay(500);
  1513.    
  1514.     printl('▶ 4. Ëæ»úÕûÊýÉú³É');
  1515.     delay(300);
  1516.     var min = 1, max = 100;
  1517.     printl('   ·¶Î§: ' + min + ' - ' + max);
  1518.     delay(200);
  1519.     var randomInt = MathUtils.randomInt(min, max);
  1520.     printl('   Ëæ»úÕûÊý: ' + randomInt);
  1521.     delay(500);
  1522.    
  1523.     printl('▶ 5. ¼ÆËãÆ½¾ùÖµ');
  1524.     delay(300);
  1525.     var nums = [10, 20, 30, 40, 50];
  1526.     printl('   Êý×ÖÁбí: ' + JSON.stringify(nums));
  1527.     delay(200);
  1528.     var avg = MathUtils.average.apply(null, nums);
  1529.     printl('   Æ½¾ùÖµ: ' + avg);
  1530.     delay(500);
  1531.    
  1532.     printl('');
  1533. }

  1534. /**
  1535. * Êý×Ö´¦Àí¹¤¾ßÀàÑÝʾ
  1536. */
  1537. function demoNumberUtils() {
  1538.     printl('©°©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©´');
  1539.     printl('©¦  NumberUtils - Êý×Ö´¦Àí¹¤¾ßÀà                                 ©¦');
  1540.     printl('©¸©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¼');
  1541.     printl('');
  1542.     delay(400);
  1543.    
  1544.     printl('▶ 1. ǧ·Öλ¸ñʽ»¯ - ½ð¶îÏÔʾ');
  1545.     delay(300);
  1546.     var amount = 1234567.89;
  1547.     printl('   Ô­Ê¼½ð¶î: ' + amount);
  1548.     delay(200);
  1549.     var formatted = NumberUtils.formatThousands(amount);
  1550.     printl('   ¸ñʽ»¯ºó: ¥' + formatted);
  1551.     delay(500);
  1552.    
  1553.     printl('▶ 2. ×Ö½Ú´óС¸ñʽ»¯ - Îļþ´óС');
  1554.     delay(300);
  1555.     var fileSize = 1536000;
  1556.     printl('   Ô­Ê¼×Ö½Ú: ' + fileSize + ' bytes');
  1557.     delay(200);
  1558.     var bytes = NumberUtils.formatBytes(fileSize);
  1559.     printl('   ¸ñʽ»¯ºó: ' + bytes);
  1560.     delay(500);
  1561.    
  1562.     printl('▶ 3. ʱ³¤¸ñʽ»¯ - ÏÔʾÓѺõÄʱ¼ä');
  1563.     delay(300);
  1564.     var ms = 3661000;
  1565.     printl('   Ô­Ê¼ºÁÃë: ' + ms);
  1566.     delay(200);
  1567.     var duration = NumberUtils.formatDuration(ms);
  1568.     printl('   ¸ñʽ»¯ºó: ' + duration);
  1569.     delay(500);
  1570.    
  1571.     printl('▶ 4. Êý×ÖתÖÐÎÄ´óд - ½ð¶îÏÔʾ');
  1572.     delay(300);
  1573.     var money = 12345;
  1574.     printl('   Ô­Ê¼Êý×Ö: ' + money);
  1575.     delay(200);
  1576.     var chinese = NumberUtils.toChineseMoney(money);
  1577.     printl('   ÖÐÎÄ´óд: ' + chinese);
  1578.     delay(500);
  1579.    
  1580.     printl('▶ 5. Êý×ÖתÂÞÂíÊý×Ö');
  1581.     delay(300);
  1582.     var year = 2024;
  1583.     printl('   Ô­Ê¼Êý×Ö: ' + year);
  1584.     delay(200);
  1585.     var roman = NumberUtils.toRoman(year);
  1586.     printl('   ÂÞÂíÊý×Ö: ' + roman);
  1587.     delay(500);
  1588.    
  1589.     printl('');
  1590. }

  1591. /**
  1592. * ʱ¼ä¹ÜÀí¹¤¾ßÀàÑÝʾ
  1593. */
  1594. function demoTimeUtils() {
  1595.     printl('©°©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©´');
  1596.     printl('©¦  TimeUtils - ʱ¼ä¹ÜÀí¹¤¾ßÀà                                    ©¦');
  1597.     printl('©¸©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¼');
  1598.     printl('');
  1599.     delay(400);
  1600.    
  1601.     printl('▶ 1. ʱ¼ä¸ñʽ»¯ - ×Ô¶¨Òå¸ñʽÏÔʾ');
  1602.     delay(300);
  1603.     var now = new Date();
  1604.     printl('   µ±Ç°Ê±¼ä: ' + TimeUtils.format(now, 'yyyy-MM-dd HH:mm:ss'));
  1605.     delay(200);
  1606.     printl('   ¼ò½à¸ñʽ: ' + TimeUtils.format(now, 'MM/dd HH:mm'));
  1607.     delay(500);
  1608.    
  1609.     printl('▶ 2. »ñÈ¡ÐÇÆÚ¼¸');
  1610.     delay(300);
  1611.     printl('   ½ñÌì: ' + TimeUtils.dayOfWeek(now));
  1612.     delay(500);
  1613.    
  1614.     printl('▶ 3. ½ñÄêµÚ¼¸Ìì');
  1615.     delay(300);
  1616.     printl('   ½ñÌìÊǽñÄêµÚ ' + TimeUtils.dayOfYear(now) + ' Ìì');
  1617.     delay(500);
  1618.    
  1619.     printl('▶ 4. µ¹¼ÆÊ±ÏÔʾ');
  1620.     delay(300);
  1621.     var countdownSeconds = 3665;
  1622.     printl('   Ô­Ê¼ÃëÊý: ' + countdownSeconds);
  1623.     delay(200);
  1624.     var countdown = TimeUtils.countdown(countdownSeconds);
  1625.     printl('   µ¹¼ÆÊ±: ' + countdown);
  1626.     delay(500);
  1627.    
  1628.     printl('▶ 5. ÈÕÆÚ¼Ó¼õ¼ÆËã');
  1629.     delay(300);
  1630.     printl('   ½ñÌìÊÇ: ' + TimeUtils.format(now, 'yyyy-MM-dd'));
  1631.     delay(200);
  1632.     var future = TimeUtils.add(now, 7, 'day');
  1633.     printl('   7Ììºó: ' + TimeUtils.format(future, 'yyyy-MM-dd'));
  1634.     delay(200);
  1635.     var past = TimeUtils.add(now, -3, 'day');
  1636.     printl('   3Ììǰ: ' + TimeUtils.format(past, 'yyyy-MM-dd'));
  1637.     delay(500);
  1638.    
  1639.     printl('');
  1640. }

  1641. // Ö÷º¯ÊýÈë¿Ú£¨ÓÉ start.js µ÷Óã©
  1642. function runMainDemo() {
  1643.     runAllDemos();
  1644. }

  1645. // ×¢Ò⣺²»ÔÚ´Ë´¦×Ô¶¯ÔËÐУ¬ÓÉ start.js ¿ØÖƵ÷ÓÃʱ»ú
  1646. // ÈçÐèÖ±½ÓÔËÐд˽ű¾£¬È¡ÏûÏÂÃæÒ»ÐеÄ×¢ÊÍ
  1647. runMainDemo();
¸´ÖÆ´úÂë


»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

±¾°æ»ý·Ö¹æÔò

¹Ø±Õ

QQ|»ÓªÏúÈí¼þ×ÛºÏÌÖÂÛ|»ÓªÏúÈí¼þÓÐÎʱشð|»ÓªÏúÈí¼þ½Ì³Ì×¨Çø|»ÓªÏúÈí¼þPOST½Å±¾·ÖÏí|»ÓªÏúÈí¼þÆÕͨ½Å±¾·ÖÏí|»ÓªÏúÈí¼þÈí¼þ×ÊѶ|»ÓªÏúÈí¼þ¾«Æ·Èí¼þ|»ÓªÏúÈí¼þ¸üй«¸æ|ÓªÏúÈí¼þ|B2BÈí¼þ|B2BÍøÂçÈí¼þ ( ¾©ICP±¸09078825ºÅ )±¾ÍøÕ¾¿ª·¢µÄÓªÏúÈí¼þÊÇÒ»¿îеÄÍøÂçÓªÏúÈí¼þ£¬Õâ¿îÓªÏú¿ÉÒÔÈ¥ÍøÕ¾Èí¼þ£¬²©¿ÍÈí¼þ£¬B2BÈí¼þ£¬·ÖÀàÐÅÏ¢Íø·¢Ìù£¬¿ÉÒÔÇÀɳ·¢£¬¿ÉÒÔµ½°Ù¶ÈÎÄ¿âÉÏ´«WORDÎĵµ£¬¿ÉÒÔµ½Ò»Ð©ÊÇÏà²áÍøÕ¾×Ô¶¯ÉÏ´«Í¼Æ¬£¬Õâ¸ö×Ô¶¯·¢ÌûÈí¼þ×Ô´øÔÆÖ©Ö룬¼Ó¿ìÊÕ¼£¬ÓÐ6ÖÖ¶Ô½Ó´òÂë½Ó¿Ú£¬·½±ã£¬Ð§Âʸߣ¬Ëٶȿ죬¶øÇÒ¶ÔÍ϶¯µÄÑéÖ¤ÂëÈ«ÍøµÚÒ»¼Ò¶À¼ÒÖ§³Ö£¬È«²¿Ô­´´¼¼Êõ£¬¶À¼ÒÑз¢£¬Õý°æÔ­´´´ø°æÈ¨Èí¼þ¡£Ñ¡ÔñÍòÄÜÓªÏúÈí¼þ£¬¾ÍÑ¡ÔñÁËÒ»ÖÖ׬ǮµÄЧÂÊ£¬´ÓûÓб»³¬Ô½¹ý£¬Ò»Ö±ÔÚŬÁ¦Ñз¢Ð¼¼Êõ¡£·Å·ÉÃÎÏ룬½â·ÅË«ÊÖ£¬À´µã´´Ò⣬³É¾ÍÄãµÄÃÎÏ룬¾ÍÔÚÍòÄÜÓªÏúÈí¼þ¿ªÊ¼

map2

GMT+8, 2026-3-17 10:05 , Processed in 0.328285 second(s), 34 queries .

¿ìËٻظ´ ·µ»Ø¶¥²¿ ·µ»ØÁбí