注册 登录
发贴工具
查看: 6|回复: 0
打印 上一主题 下一主题

[24小时收录超级好的网站] AIWROK软件运算符封装库示例

[复制链接]

2463

主题

2511

帖子

1万

积分

积分
14980
跳转到指定楼层
楼主
AIWROK软件运算符封装库示例
AIWROK软件运算符封装库示例 群发软件发帖工具

AIWROK软件运算符封装库示例 群发软件发帖工具
  1. /*
  2. 🍎AIwork运算符的高级封装和用法
  3. 🍎交流QQ群711841924群一,苹果内测群,528816639
  4.   JavaScript 运算符封装库示例
  5. */

  6. // 日志窗口配置(如需使用请取消注释)
  7. logWindow.show()
  8. logWindow.clear()
  9. logWindow.setHeight(2500)
  10. logWindow.setWidth(1500)
  11. logWindow.setNoClickModel()

  12. var OperatorUtils = {};

  13. OperatorUtils.version = '1.0.0';

  14. OperatorUtils.MathEngine = function() {
  15.     this.history = [];
  16.     this.variables = {};
  17. };

  18. OperatorUtils.MathEngine.prototype = {
  19.     calculate: function(expression) {
  20.         var keys = [];
  21.         for (var key in this.variables) {
  22.             if (this.variables.hasOwnProperty(key)) {
  23.                 keys.push(key);
  24.             }
  25.         }
  26.         var values = [];
  27.         for (var i = 0; i < keys.length; i++) {
  28.             values.push(this.variables[keys[i]]);
  29.         }
  30.         var funcArgs = keys.join(',');
  31.         var funcBody = 'return ' + expression;
  32.         var func = new Function(funcArgs, funcBody);
  33.         var result = func.apply(null, values);
  34.         this.history.push({
  35.             expression: expression,
  36.             result: result,
  37.             timestamp: new Date().getTime()
  38.         });
  39.         return result;
  40.     },

  41.     setVariable: function(name, value) {
  42.         this.variables[name] = value;
  43.         return this;
  44.     },

  45.     getVariable: function(name) {
  46.         return this.variables[name];
  47.     },

  48.     getHistory: function() {
  49.         return this.history;
  50.     },

  51.     clearHistory: function() {
  52.         this.history = [];
  53.         return this;
  54.     }
  55. };

  56. OperatorUtils.Arithmetic = {
  57.     add: function() {
  58.         var result = 0;
  59.         for (var i = 0; i < arguments.length; i++) {
  60.             var num = Number(arguments[i]);
  61.             if (isNaN(num)) {
  62.                 throw new TypeError('参数必须是数字');
  63.             }
  64.             result += num;
  65.         }
  66.         return result;
  67.     },

  68.     subtract: function(a, b) {
  69.         a = Number(a);
  70.         b = Number(b);
  71.         if (isNaN(a) || isNaN(b)) {
  72.             throw new TypeError('参数必须是数字');
  73.         }
  74.         return a - b;
  75.     },

  76.     multiply: function() {
  77.         var result = 1;
  78.         for (var i = 0; i < arguments.length; i++) {
  79.             var num = Number(arguments[i]);
  80.             if (isNaN(num)) {
  81.                 throw new TypeError('参数必须是数字');
  82.             }
  83.             result *= num;
  84.         }
  85.         return result;
  86.     },

  87.     divide: function(a, b) {
  88.         a = Number(a);
  89.         b = Number(b);
  90.         if (isNaN(a) || isNaN(b)) {
  91.             throw new TypeError('参数必须是数字');
  92.         }
  93.         if (b === 0) {
  94.             throw new Error('除数不能为零');
  95.         }
  96.         return a / b;
  97.     },

  98.     modulo: function(a, b) {
  99.         a = Number(a);
  100.         b = Number(b);
  101.         if (isNaN(a) || isNaN(b)) {
  102.             throw new TypeError('参数必须是数字');
  103.         }
  104.         if (b === 0) {
  105.             throw new Error('除数不能为零');
  106.         }
  107.         return a % b;
  108.     },

  109.     increment: function(value, prefix) {
  110.         value = Number(value);
  111.         if (isNaN(value)) {
  112.             throw new TypeError('参数必须是数字');
  113.         }
  114.         if (prefix) {
  115.             return ++value;
  116.         }
  117.         var original = value;
  118.         value++;
  119.         return original;
  120.     },

  121.     decrement: function(value, prefix) {
  122.         value = Number(value);
  123.         if (isNaN(value)) {
  124.             throw new TypeError('参数必须是数字');
  125.         }
  126.         if (prefix) {
  127.             return --value;
  128.         }
  129.         var original = value;
  130.         value--;
  131.         return original;
  132.     },

  133.     power: function(base, exponent) {
  134.         base = Number(base);
  135.         exponent = Number(exponent);
  136.         if (isNaN(base) || isNaN(exponent)) {
  137.             throw new TypeError('参数必须是数字');
  138.         }
  139.         var result = 1;
  140.         for (var i = 0; i < exponent; i++) {
  141.             result *= base;
  142.         }
  143.         return result;
  144.     },

  145.     sqrt: function(value) {
  146.         value = Number(value);
  147.         if (isNaN(value)) {
  148.             throw new TypeError('参数必须是数字');
  149.         }
  150.         if (value < 0) {
  151.             throw new Error('不能计算负数的平方根');
  152.         }
  153.         return Math.sqrt(value);
  154.     },

  155.     abs: function(value) {
  156.         value = Number(value);
  157.         if (isNaN(value)) {
  158.             throw new TypeError('参数必须是数字');
  159.         }
  160.         return value < 0 ? -value : value;
  161.     },

  162.     round: function(value, decimals) {
  163.         value = Number(value);
  164.         if (isNaN(value)) {
  165.             throw new TypeError('参数必须是数字');
  166.         }
  167.         decimals = decimals || 0;
  168.         var factor = Math.pow(10, decimals);
  169.         return Math.round(value * factor) / factor;
  170.     },

  171.     sum: function(arr) {
  172.         if (Object.prototype.toString.call(arr) !== '[object Array]') {
  173.             throw new TypeError('参数必须是数组');
  174.         }
  175.         var total = 0;
  176.         for (var i = 0; i < arr.length; i++) {
  177.             total += Number(arr[i]) || 0;
  178.         }
  179.         return total;
  180.     },

  181.     average: function(arr) {
  182.         if (Object.prototype.toString.call(arr) !== '[object Array]') {
  183.             throw new TypeError('参数必须是数组');
  184.         }
  185.         if (arr.length === 0) {
  186.             return 0;
  187.         }
  188.         return this.sum(arr) / arr.length;
  189.     },

  190.     max: function(arr) {
  191.         if (Object.prototype.toString.call(arr) !== '[object Array]') {
  192.             throw new TypeError('参数必须是数组');
  193.         }
  194.         if (arr.length === 0) {
  195.             throw new Error('数组不能为空');
  196.         }
  197.         var maxVal = arr[0];
  198.         for (var i = 1; i < arr.length; i++) {
  199.             if (arr[i] > maxVal) {
  200.                 maxVal = arr[i];
  201.             }
  202.         }
  203.         return maxVal;
  204.     },

  205.     min: function(arr) {
  206.         if (Object.prototype.toString.call(arr) !== '[object Array]') {
  207.             throw new TypeError('参数必须是数组');
  208.         }
  209.         if (arr.length === 0) {
  210.             throw new Error('数组不能为空');
  211.         }
  212.         var minVal = arr[0];
  213.         for (var i = 1; i < arr.length; i++) {
  214.             if (arr[i] < minVal) {
  215.                 minVal = arr[i];
  216.             }
  217.         }
  218.         return minVal;
  219.     },

  220.     range: function(start, end, step) {
  221.         start = Number(start);
  222.         end = Number(end);
  223.         step = step || 1;
  224.         step = Number(step);
  225.         
  226.         if (isNaN(start) || isNaN(end) || isNaN(step)) {
  227.             throw new TypeError('参数必须是数字');
  228.         }
  229.         if (step === 0) {
  230.             throw new Error('步长不能为零');
  231.         }
  232.         
  233.         var result = [];
  234.         var current = start;
  235.         if (step > 0) {
  236.             while (current <= end) {
  237.                 result.push(current);
  238.                 current += step;
  239.             }
  240.         } else {
  241.             while (current >= end) {
  242.                 result.push(current);
  243.                 current += step;
  244.             }
  245.         }
  246.         return result;
  247.     }
  248. };

  249. OperatorUtils.Assignment = {
  250.     assign: function(obj, key, value) {
  251.         if (typeof obj !== 'object' || obj === null) {
  252.             throw new TypeError('第一个参数必须是对象');
  253.         }
  254.         obj[key] = value;
  255.         return obj;
  256.     },

  257.     addAssign: function(obj, key, value) {
  258.         if (typeof obj !== 'object' || obj === null) {
  259.             throw new TypeError('第一个参数必须是对象');
  260.         }
  261.         obj[key] = (obj[key] || 0) + value;
  262.         return obj;
  263.     },

  264.     subtractAssign: function(obj, key, value) {
  265.         if (typeof obj !== 'object' || obj === null) {
  266.             throw new TypeError('第一个参数必须是对象');
  267.         }
  268.         obj[key] = (obj[key] || 0) - value;
  269.         return obj;
  270.     },

  271.     multiplyAssign: function(obj, key, value) {
  272.         if (typeof obj !== 'object' || obj === null) {
  273.             throw new TypeError('第一个参数必须是对象');
  274.         }
  275.         obj[key] = (obj[key] || 0) * value;
  276.         return obj;
  277.     },

  278.     divideAssign: function(obj, key, value) {
  279.         if (typeof obj !== 'object' || obj === null) {
  280.             throw new TypeError('第一个参数必须是对象');
  281.         }
  282.         if (value === 0) {
  283.             throw new Error('除数不能为零');
  284.         }
  285.         obj[key] = (obj[key] || 0) / value;
  286.         return obj;
  287.     },

  288.     moduloAssign: function(obj, key, value) {
  289.         if (typeof obj !== 'object' || obj === null) {
  290.             throw new TypeError('第一个参数必须是对象');
  291.         }
  292.         if (value === 0) {
  293.             throw new Error('除数不能为零');
  294.         }
  295.         obj[key] = (obj[key] || 0) % value;
  296.         return obj;
  297.     },

  298.     merge: function(target) {
  299.         if (typeof target !== 'object' || target === null) {
  300.             throw new TypeError('第一个参数必须是对象');
  301.         }
  302.         for (var i = 1; i < arguments.length; i++) {
  303.             var source = arguments[i];
  304.             if (typeof source === 'object' && source !== null) {
  305.                 for (var key in source) {
  306.                     if (source.hasOwnProperty(key)) {
  307.                         target[key] = source[key];
  308.                     }
  309.                 }
  310.             }
  311.         }
  312.         return target;
  313.     },

  314.     deepClone: function(obj) {
  315.         if (obj === null || typeof obj !== 'object') {
  316.             return obj;
  317.         }
  318.         if (Object.prototype.toString.call(obj) === '[object Array]') {
  319.             var arrCopy = [];
  320.             for (var i = 0; i < obj.length; i++) {
  321.                 arrCopy[i] = this.deepClone(obj[i]);
  322.             }
  323.             return arrCopy;
  324.         }
  325.         var objCopy = {};
  326.         for (var key in obj) {
  327.             if (obj.hasOwnProperty(key)) {
  328.                 objCopy[key] = this.deepClone(obj[key]);
  329.             }
  330.         }
  331.         return objCopy;
  332.     }
  333. };

  334. OperatorUtils.StringOps = {
  335.     concat: function() {
  336.         var result = '';
  337.         for (var i = 0; i < arguments.length; i++) {
  338.             result += String(arguments[i] || '');
  339.         }
  340.         return result;
  341.     },

  342.     join: function(sep) {
  343.         sep = sep || '';
  344.         var result = '';
  345.         for (var i = 0; i < arguments.length; i++) {
  346.             if (i > 0) {
  347.                 result += sep;
  348.             }
  349.             result += String(arguments[i] || '');
  350.         }
  351.         return result;
  352.     },

  353.     repeat: function(str, count) {
  354.         str = String(str);
  355.         count = Number(count) || 0;
  356.         var result = '';
  357.         for (var i = 0; i < count; i++) {
  358.             result += str;
  359.         }
  360.         return result;
  361.     },

  362.     padLeft: function(str, length, char) {
  363.         str = String(str);
  364.         char = char || ' ';
  365.         while (str.length < length) {
  366.             str = char + str;
  367.         }
  368.         return str;
  369.     },

  370.     padRight: function(str, length, char) {
  371.         str = String(str);
  372.         char = char || ' ';
  373.         while (str.length < length) {
  374.             str = str + char;
  375.         }
  376.         return str;
  377.     },

  378.     truncate: function(str, length, suffix) {
  379.         str = String(str);
  380.         suffix = suffix || '...';
  381.         if (str.length <= length) {
  382.             return str;
  383.         }
  384.         return str.substring(0, length - suffix.length) + suffix;
  385.     },

  386.     capitalize: function(str) {
  387.         str = String(str);
  388.         if (str.length === 0) return str;
  389.         return str.charAt(0).toUpperCase() + str.slice(1);
  390.     },

  391.     camelCase: function(str) {
  392.         str = String(str);
  393.         var words = str.split(/[\s_-]+/);
  394.         var result = words[0].toLowerCase();
  395.         for (var i = 1; i < words.length; i++) {
  396.             result += this.capitalize(words[i].toLowerCase());
  397.         }
  398.         return result;
  399.     },

  400.     kebabCase: function(str) {
  401.         str = String(str);
  402.         return str.replace(/([a-z])([A-Z])/g, '$1-$2')
  403.                   .replace(/[\s_]+/g, '-')
  404.                   .toLowerCase();
  405.     },

  406.     snakeCase: function(str) {
  407.         str = String(str);
  408.         return str.replace(/([a-z])([A-Z])/g, '$1_$2')
  409.                   .replace(/[\s-]+/g, '_')
  410.                   .toLowerCase();
  411.     },

  412.     reverse: function(str) {
  413.         str = String(str);
  414.         var result = '';
  415.         for (var i = str.length - 1; i >= 0; i--) {
  416.             result += str.charAt(i);
  417.         }
  418.         return result;
  419.     },

  420.     contains: function(str, search) {
  421.         str = String(str);
  422.         search = String(search);
  423.         return str.indexOf(search) !== -1;
  424.     },

  425.     startsWith: function(str, prefix) {
  426.         str = String(str);
  427.         prefix = String(prefix);
  428.         return str.indexOf(prefix) === 0;
  429.     },

  430.     endsWith: function(str, suffix) {
  431.         str = String(str);
  432.         suffix = String(suffix);
  433.         return str.slice(-suffix.length) === suffix;
  434.     },

  435.     stripTags: function(str) {
  436.         str = String(str);
  437.         return str.replace(/<[^>]*>/g, '');
  438.     },

  439.     escapeHtml: function(str) {
  440.         str = String(str);
  441.         var htmlEntities = {
  442.             '&': '&',
  443.             '<': '<',
  444.             '>': '>',
  445.             '"': '"',
  446.             "'": '''
  447.         };
  448.         return str.replace(/[&<>"']/g, function(match) {
  449.             return htmlEntities[match];
  450.         });
  451.     },

  452.     unescapeHtml: function(str) {
  453.         str = String(str);
  454.         var htmlEntities = {
  455.             '&': '&',
  456.             '<': '<',
  457.             '>': '>',
  458.             '"': '"',
  459.             ''': "'"
  460.         };
  461.         return str.replace(/&(amp|lt|gt|quot|#39);/g, function(match) {
  462.             return htmlEntities[match];
  463.         });
  464.     },

  465.     wordCount: function(str) {
  466.         str = String(str);
  467.         var trimmed = str.replace(/^\s+|\s+$/g, '');
  468.         var words = trimmed.split(/\s+/);
  469.         return trimmed === '' ? 0 : words.length;
  470.     },

  471.     countChars: function(str, char) {
  472.         str = String(str);
  473.         char = String(char);
  474.         var count = 0;
  475.         for (var i = 0; i < str.length; i++) {
  476.             if (str.charAt(i) === char) {
  477.                 count++;
  478.             }
  479.         }
  480.         return count;
  481.     },

  482.     format: function(str) {
  483.         str = String(str);
  484.         var args = arguments;
  485.         return str.replace(/\{(\d+)\}/g, function(match, index) {
  486.             var idx = parseInt(index, 10);
  487.             return args[idx + 1] !== undefined ? String(args[idx + 1]) : match;
  488.         });
  489.     },

  490.     template: function(str, data) {
  491.         str = String(str);
  492.         return str.replace(/\{\{(\w+)\}\}/g, function(match, key) {
  493.             return data[key] !== undefined ? String(data[key]) : match;
  494.         });
  495.     }
  496. };

  497. OperatorUtils.TypeCoercion = {
  498.     smartAdd: function(a, b) {
  499.         var numA = Number(a);
  500.         var numB = Number(b);
  501.         
  502.         if (!isNaN(numA) && !isNaN(numB) &&
  503.             String(a).replace(/^\s+|\s+$/g, '') !== '' && String(b).replace(/^\s+|\s+$/g, '') !== '') {
  504.             return numA + numB;
  505.         }
  506.         return String(a) + String(b);
  507.     },

  508.     smartConcat: function() {
  509.         var hasNumber = false;
  510.         var hasString = false;
  511.         var numbers = [];
  512.         var strings = [];
  513.         
  514.         for (var i = 0; i < arguments.length; i++) {
  515.             var val = arguments[i];
  516.             var num = Number(val);
  517.             
  518.             if (!isNaN(num) && String(val).replace(/^\s+|\s+$/g, '') !== '' &&
  519.                 !isNaN(parseFloat(val)) && isFinite(val)) {
  520.                 numbers.push(num);
  521.                 hasNumber = true;
  522.             } else {
  523.                 strings.push(String(val));
  524.                 hasString = true;
  525.             }
  526.         }
  527.         
  528.         if (hasNumber && !hasString) {
  529.             var sum = 0;
  530.             for (var j = 0; j < numbers.length; j++) {
  531.                 sum += numbers[j];
  532.             }
  533.             return sum;
  534.         }
  535.         
  536.         var result = '';
  537.         for (var k = 0; k < arguments.length; k++) {
  538.             result += String(arguments[k]);
  539.         }
  540.         return result;
  541.     },

  542.     toNumber: function(value, defaultValue) {
  543.         var num = Number(value);
  544.         return isNaN(num) ? (defaultValue || 0) : num;
  545.     },

  546.     toInt: function(value, defaultValue) {
  547.         var num = parseInt(value, 10);
  548.         return isNaN(num) ? (defaultValue || 0) : num;
  549.     },

  550.     toFloat: function(value, defaultValue) {
  551.         var num = parseFloat(value);
  552.         return isNaN(num) ? (defaultValue || 0) : num;
  553.     },

  554.     toString: function(value, defaultValue) {
  555.         if (value === null || value === undefined) {
  556.             return defaultValue || '';
  557.         }
  558.         return String(value);
  559.     },

  560.     toBoolean: function(value) {
  561.         if (typeof value === 'boolean') {
  562.             return value;
  563.         }
  564.         if (typeof value === 'string') {
  565.             return value.toLowerCase() === 'true';
  566.         }
  567.         if (typeof value === 'number') {
  568.             return value !== 0;
  569.         }
  570.         return Boolean(value);
  571.     },

  572.     isArray: function(value) {
  573.         return Object.prototype.toString.call(value) === '[object Array]';
  574.     },

  575.     isObject: function(value) {
  576.         return typeof value === 'object' && value !== null && !this.isArray(value);
  577.     },

  578.     isFunction: function(value) {
  579.         return typeof value === 'function';
  580.     },

  581.     isString: function(value) {
  582.         return typeof value === 'string';
  583.     },

  584.     isNumber: function(value) {
  585.         return typeof value === 'number' && !isNaN(value);
  586.     },

  587.     isInteger: function(value) {
  588.         return this.isNumber(value) && value % 1 === 0;
  589.     },

  590.     isFloat: function(value) {
  591.         return this.isNumber(value) && value % 1 !== 0;
  592.     }
  593. };

  594. OperatorUtils.Comparison = {
  595.     equals: function(a, b) {
  596.         if (a === b) return true;
  597.         if (a === null || b === null) return false;
  598.         if (typeof a !== typeof b) return false;
  599.         
  600.         if (typeof a === 'object') {
  601.             var aKeys = [];
  602.             for (var key in a) {
  603.                 if (a.hasOwnProperty(key)) {
  604.                     aKeys.push(key);
  605.                 }
  606.             }
  607.             var bKeys = [];
  608.             for (var key in b) {
  609.                 if (b.hasOwnProperty(key)) {
  610.                     bKeys.push(key);
  611.                 }
  612.             }
  613.             
  614.             if (aKeys.length !== bKeys.length) return false;
  615.             
  616.             for (var i = 0; i < aKeys.length; i++) {
  617.                 var key = aKeys[i];
  618.                 if (!b.hasOwnProperty(key) || !this.equals(a[key], b[key])) {
  619.                     return false;
  620.                 }
  621.             }
  622.             return true;
  623.         }
  624.         
  625.         return false;
  626.     },

  627.     deepEquals: function(a, b) {
  628.         return this.equals(a, b);
  629.     },

  630.     between: function(value, min, max, inclusive) {
  631.         value = Number(value);
  632.         min = Number(min);
  633.         max = Number(max);
  634.         
  635.         if (inclusive) {
  636.             return value >= min && value <= max;
  637.         }
  638.         return value > min && value < max;
  639.     },

  640.     clamp: function(value, min, max) {
  641.         value = Number(value);
  642.         min = Number(min);
  643.         max = Number(max);
  644.         
  645.         if (value < min) return min;
  646.         if (value > max) return max;
  647.         return value;
  648.     },

  649.     inRange: function(value, range) {
  650.         if (Object.prototype.toString.call(range) !== '[object Array]' || range.length !== 2) {
  651.             throw new TypeError('范围参数必须是包含两个元素的数组');
  652.         }
  653.         return this.between(value, range[0], range[1], true);
  654.     },

  655.     compare: function(a, b) {
  656.         if (a < b) return -1;
  657.         if (a > b) return 1;
  658.         return 0;
  659.     }
  660. };

  661. OperatorUtils.Bitwise = {
  662.     and: function(a, b) {
  663.         return (a | 0) & (b | 0);
  664.     },

  665.     or: function(a, b) {
  666.         return (a | 0) | (b | 0);
  667.     },

  668.     xor: function(a, b) {
  669.         return (a | 0) ^ (b | 0);
  670.     },

  671.     not: function(a) {
  672.         return ~(a | 0);
  673.     },

  674.     leftShift: function(a, b) {
  675.         return (a | 0) << (b | 0);
  676.     },

  677.     rightShift: function(a, b) {
  678.         return (a | 0) >> (b | 0);
  679.     },

  680.     unsignedRightShift: function(a, b) {
  681.         return (a | 0) >>> (b | 0);
  682.     }
  683. };

  684. OperatorUtils.Logical = {
  685.     and: function() {
  686.         for (var i = 0; i < arguments.length; i++) {
  687.             if (!arguments[i]) {
  688.                 return arguments[i];
  689.             }
  690.         }
  691.         return arguments[arguments.length - 1];
  692.     },

  693.     or: function() {
  694.         for (var i = 0; i < arguments.length; i++) {
  695.             if (arguments[i]) {
  696.                 return arguments[i];
  697.             }
  698.         }
  699.         return arguments[arguments.length - 1];
  700.     },

  701.     not: function(value) {
  702.         return !value;
  703.     },

  704.     ternary: function(condition, trueValue, falseValue) {
  705.         return condition ? trueValue : falseValue;
  706.     },

  707.     nullish: function(value, defaultValue) {
  708.         return value != null ? value : defaultValue;
  709.     },

  710.     coalesce: function() {
  711.         for (var i = 0; i < arguments.length; i++) {
  712.             if (arguments[i] != null) {
  713.                 return arguments[i];
  714.             }
  715.         }
  716.         return null;
  717.     }
  718. };

  719. OperatorUtils.Chainable = function(initialValue) {
  720.     this.value = initialValue;
  721. };

  722. OperatorUtils.Chainable.prototype = {
  723.     add: function(n) {
  724.         this.value = OperatorUtils.Arithmetic.add(this.value, n);
  725.         return this;
  726.     },

  727.     subtract: function(n) {
  728.         this.value = OperatorUtils.Arithmetic.subtract(this.value, n);
  729.         return this;
  730.     },

  731.     multiply: function(n) {
  732.         this.value = OperatorUtils.Arithmetic.multiply(this.value, n);
  733.         return this;
  734.     },

  735.     divide: function(n) {
  736.         this.value = OperatorUtils.Arithmetic.divide(this.value, n);
  737.         return this;
  738.     },

  739.     modulo: function(n) {
  740.         this.value = OperatorUtils.Arithmetic.modulo(this.value, n);
  741.         return this;
  742.     },

  743.     power: function(n) {
  744.         this.value = OperatorUtils.Arithmetic.power(this.value, n);
  745.         return this;
  746.     },

  747.     round: function(decimals) {
  748.         this.value = OperatorUtils.Arithmetic.round(this.value, decimals);
  749.         return this;
  750.     },

  751.     abs: function() {
  752.         this.value = OperatorUtils.Arithmetic.abs(this.value);
  753.         return this;
  754.     },

  755.     clamp: function(min, max) {
  756.         this.value = OperatorUtils.Comparison.clamp(this.value, min, max);
  757.         return this;
  758.     },

  759.     valueOf: function() {
  760.         return this.value;
  761.     },

  762.     toString: function() {
  763.         return String(this.value);
  764.     }
  765. };

  766. OperatorUtils.chain = function(value) {
  767.     return new OperatorUtils.Chainable(value);
  768. };

  769. OperatorUtils.Calculator = function() {
  770.     this.stack = [];
  771.     this.memory = 0;
  772. };

  773. OperatorUtils.Calculator.prototype = {
  774.     push: function(value) {
  775.         this.stack.push(Number(value));
  776.         return this;
  777.     },

  778.     pop: function() {
  779.         return this.stack.pop();
  780.     },

  781.     add: function() {
  782.         if (this.stack.length < 2) throw new Error('栈中至少需要两个值');
  783.         var b = this.stack.pop();
  784.         var a = this.stack.pop();
  785.         this.stack.push(a + b);
  786.         return this;
  787.     },

  788.     subtract: function() {
  789.         if (this.stack.length < 2) throw new Error('栈中至少需要两个值');
  790.         var b = this.stack.pop();
  791.         var a = this.stack.pop();
  792.         this.stack.push(a - b);
  793.         return this;
  794.     },

  795.     multiply: function() {
  796.         if (this.stack.length < 2) throw new Error('栈中至少需要两个值');
  797.         var b = this.stack.pop();
  798.         var a = this.stack.pop();
  799.         this.stack.push(a * b);
  800.         return this;
  801.     },

  802.     divide: function() {
  803.         if (this.stack.length < 2) throw new Error('栈中至少需要两个值');
  804.         var b = this.stack.pop();
  805.         var a = this.stack.pop();
  806.         this.stack.push(a / b);
  807.         return this;
  808.     },

  809.     modulo: function() {
  810.         if (this.stack.length < 2) throw new Error('栈中至少需要两个值');
  811.         var b = this.stack.pop();
  812.         var a = this.stack.pop();
  813.         this.stack.push(a % b);
  814.         return this;
  815.     },

  816.     power: function() {
  817.         if (this.stack.length < 2) throw new Error('栈中至少需要两个值');
  818.         var b = this.stack.pop();
  819.         var a = this.stack.pop();
  820.         this.stack.push(Math.pow(a, b));
  821.         return this;
  822.     },

  823.     memoryStore: function() {
  824.         if (this.stack.length > 0) {
  825.             this.memory = this.stack[this.stack.length - 1];
  826.         }
  827.         return this;
  828.     },

  829.     memoryRecall: function() {
  830.         this.stack.push(this.memory);
  831.         return this;
  832.     },

  833.     memoryClear: function() {
  834.         this.memory = 0;
  835.         return this;
  836.     },

  837.     memoryAdd: function() {
  838.         if (this.stack.length > 0) {
  839.             this.memory += this.stack[this.stack.length - 1];
  840.         }
  841.         return this;
  842.     },

  843.     memorySubtract: function() {
  844.         if (this.stack.length > 0) {
  845.             this.memory -= this.stack[this.stack.length - 1];
  846.         }
  847.         return this;
  848.     },

  849.     getResult: function() {
  850.         return this.stack.length > 0 ? this.stack[this.stack.length - 1] : 0;
  851.     },

  852.     clear: function() {
  853.         this.stack = [];
  854.         return this;
  855.     }
  856. };

  857. OperatorUtils.runAllExamples = function() {
  858.     print.log("=== JavaScript 运算符高级封装库 - 完整测试 ===\n");

  859.     print.log("1. 算术运算符测试:");
  860.     print.log("-------------------");
  861.     print.log("加法(5+3+2): " + OperatorUtils.Arithmetic.add(5, 3, 2));
  862.     print.log("减法(10-4): " + OperatorUtils.Arithmetic.subtract(10, 4));
  863.     print.log("乘法(3*4*2): " + OperatorUtils.Arithmetic.multiply(3, 4, 2));
  864.     print.log("除法(15/3): " + OperatorUtils.Arithmetic.divide(15, 3));
  865.     print.log("取模(17%5): " + OperatorUtils.Arithmetic.modulo(17, 5));
  866.     print.log("幂运算(2^10): " + OperatorUtils.Arithmetic.power(2, 10));
  867.     print.log("平方根(16): " + OperatorUtils.Arithmetic.sqrt(16));
  868.     print.log("绝对值(-42): " + OperatorUtils.Arithmetic.abs(-42));
  869.     print.log("四舍五入(3.14159,2): " + OperatorUtils.Arithmetic.round(3.14159, 2));
  870.     print.log("");

  871.     print.log("2. 数组运算测试:");
  872.     print.log("----------------");
  873.     var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
  874.     print.log("数组求和: " + OperatorUtils.Arithmetic.sum(numbers));
  875.     print.log("数组平均: " + OperatorUtils.Arithmetic.average(numbers));
  876.     print.log("数组最大: " + OperatorUtils.Arithmetic.max(numbers));
  877.     print.log("数组最小: " + OperatorUtils.Arithmetic.min(numbers));
  878.     print.log("范围生成(1-10,步长2): " + JSON.stringify(OperatorUtils.Arithmetic.range(1, 10, 2)));
  879.     print.log("");

  880.     print.log("3. 赋值运算符测试:");
  881.     print.log("------------------");
  882.     var obj = { x: 10, y: 5 };
  883.     OperatorUtils.Assignment.addAssign(obj, 'x', 5);
  884.     OperatorUtils.Assignment.multiplyAssign(obj, 'x', 2);
  885.     print.log("对象操作后: " + JSON.stringify(obj));
  886.     var target = { a: 1 };
  887.     OperatorUtils.Assignment.merge(target, { b: 2 }, { c: 3 });
  888.     print.log("对象合并: " + JSON.stringify(target));
  889.     print.log("");

  890.     print.log("4. 字符串运算测试:");
  891.     print.log("--------------------");
  892.     print.log("字符串连接: " + OperatorUtils.StringOps.concat('Hello', ' ', 'World'));
  893.     print.log("字符串重复: " + OperatorUtils.StringOps.repeat('Abc', 3));
  894.     print.log("左填充: " + OperatorUtils.StringOps.padLeft('42', 5, '0'));
  895.     print.log("右填充: " + OperatorUtils.StringOps.padRight('Hi', 5, '*'));
  896.     print.log("首字母大写: " + OperatorUtils.StringOps.capitalize('hello'));
  897.     print.log("驼峰命名: " + OperatorUtils.StringOps.camelCase('hello-world'));
  898.     print.log("字符串反转: " + OperatorUtils.StringOps.reverse('Hello'));
  899.     print.log("包含检查: " + OperatorUtils.StringOps.contains('Hello World', 'World'));
  900.     print.log("");

  901.     print.log("5. 类型转换测试:");
  902.     print.log("----------------");
  903.     print.log("智能加法(5+5): " + OperatorUtils.TypeCoercion.smartAdd(5, 5));
  904.     print.log("智能加法(\"5\"+5): " + OperatorUtils.TypeCoercion.smartAdd('5', 5));
  905.     print.log("转数字(\"123.45\"): " + OperatorUtils.TypeCoercion.toNumber('123.45'));
  906.     print.log("转整数(\"123.45\"): " + OperatorUtils.TypeCoercion.toInt('123.45'));
  907.     print.log("转浮点(\"123.45\"): " + OperatorUtils.TypeCoercion.toFloat('123.45'));
  908.     print.log("转字符串(12345): " + OperatorUtils.TypeCoercion.toString(12345));
  909.     print.log("转布尔(\"true\"): " + OperatorUtils.TypeCoercion.toBoolean('true'));
  910.     print.log("是数组([1,2,3]): " + OperatorUtils.TypeCoercion.isArray([1, 2, 3]));
  911.     print.log("是对象({a:1}): " + OperatorUtils.TypeCoercion.isObject({ a: 1 }));
  912.     print.log("");

  913.     print.log("6. 比较运算测试:");
  914.     print.log("----------------");
  915.     print.log("深度相等: " + OperatorUtils.Comparison.deepEquals({ a: 1 }, { a: 1 }));
  916.     print.log("范围检查(5在1-10): " + OperatorUtils.Comparison.between(5, 1, 10, true));
  917.     print.log("限制范围(15在1-10): " + OperatorUtils.Comparison.clamp(15, 1, 10));
  918.     print.log("");

  919.     print.log("7. 位运算测试:");
  920.     print.log("-------------");
  921.     print.log("按位与(5&3): " + OperatorUtils.Bitwise.and(5, 3));
  922.     print.log("按位或(5|3): " + OperatorUtils.Bitwise.or(5, 3));
  923.     print.log("按位异或(5^3): " + OperatorUtils.Bitwise.xor(5, 3));
  924.     print.log("按位非(~5): " + OperatorUtils.Bitwise.not(5));
  925.     print.log("左移(5<<2): " + OperatorUtils.Bitwise.leftShift(5, 2));
  926.     print.log("右移(16>>2): " + OperatorUtils.Bitwise.rightShift(16, 2));
  927.     print.log("");

  928.     print.log("8. 逻辑运算测试:");
  929.     print.log("----------------");
  930.     print.log("逻辑与: " + OperatorUtils.Logical.and(true, false, 'hello'));
  931.     print.log("逻辑或: " + OperatorUtils.Logical.or(false, null, 'world'));
  932.     print.log("逻辑非(true): " + OperatorUtils.Logical.not(true));
  933.     print.log("三元运算(true,\"yes\",\"no\"): " + OperatorUtils.Logical.ternary(true, 'yes', 'no'));
  934.     print.log("空值合并(null,\"default\"): " + OperatorUtils.Logical.nullish(null, 'default'));
  935.     print.log("");

  936.     print.log("9. 链式调用测试:");
  937.     print.log("----------------");
  938.     var chainResult = OperatorUtils.chain(10)
  939.         .add(5)
  940.         .multiply(2)
  941.         .subtract(5)
  942.         .divide(5)
  943.         .round(2)
  944.         .valueOf();
  945.     print.log("链式计算: 10+5*2-5/5 = " + chainResult);
  946.     print.log("");

  947.     print.log("10. 计算器栈测试:");
  948.     print.log("-----------------");
  949.     var calc = new OperatorUtils.Calculator();
  950.     calc.push(10).push(5).add().push(3).multiply();
  951.     print.log("栈计算 (10+5)*3 = " + calc.getResult());
  952.     print.log("");

  953.     print.log("11. 数学引擎测试:");
  954.     print.log("-----------------");
  955.     var engine = new OperatorUtils.MathEngine();
  956.     engine.setVariable('x', 5).setVariable('y', 10);
  957.     var result = engine.calculate('x * y + 20');
  958.     print.log("变量计算 x=5,y=10, x*y+20 = " + result);
  959.     print.log("");

  960.     print.log("=== 测试完成 ===");
  961. };

  962. OperatorUtils.quickTest = function() {
  963.     print.log("=== 快速测试 ===");
  964.     print.log("加法: " + OperatorUtils.Arithmetic.add(1, 2, 3));
  965.     print.log("乘法: " + OperatorUtils.Arithmetic.multiply(2, 3, 4));
  966.     print.log("连接: " + OperatorUtils.StringOps.concat('A', 'B', 'C'));
  967.     print.log("智能加法: " + OperatorUtils.TypeCoercion.smartAdd('5', 5));
  968.     print.log("链式: " + OperatorUtils.chain(10).add(5).multiply(2).valueOf());
  969.     print.log("=== 快速测试完成 ===");
  970. };

  971. print.log("JavaScript 运算符封装库加载完成!");
  972. print.log("");
  973. print.log("使用方法:");
  974. print.log("  OperatorUtils.runAllExamples()  - 运行完整测试");
  975. print.log("  OperatorUtils.quickTest()       - 运行快速测试");
  976. print.log("");

  977. OperatorUtils.runAllExamples();
复制代码



untoAIWROK软件语法运行小示例nextAIWROK软件运算符封装库示例
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

相关导读了
    采集亚马逊正版群发工具有没有?
    Apr.20旅行X心语今天来说说YYPOST新功能的一个灵活用法,采集亚马逊商品信息,并且获得排名的软件,亚马逊现在越来越多客户做,淘宝的水是越来越清了,以前做电商的客户,现在都转战到外国,最赚钱的要数一些客户往亚马逊里堆了吧,拿我这个YYPOST的客户,最多的是采集,分析排名,刷价格,刷数量,改价,刷访问量等等技术

    企业发展B2B网站有什么东东软件可以发呢
    标题企业发展网B2B软件,现在虽然B2B网站收录不错,可愁的是心急的人们,他们太想一口吃撑胖子了,发帖宣传虽然不能像佛系那样淡定,但也不能像跑火车那般急躁对待,自己内容不收录,完全是自己操作内容问题,可以参考一下别人的内容是怎么弄的,然后自己要试着转变,而且收录这个内容,常常会变化的,不是一种规则就吃到老

    搜房天下房聊软件哪一个好呢
    本帖最后由 发帖软件 于 2019-5-22 16:15 编辑 2搜房天下群发房聊信息软件,开始本来打算做58同城的,但发一个就要一次点触验证码,这就让人没有感觉到存在的价值了吧,都是卖二手房和新房的搜房天下倒是可以发即时聊天信息,也没有发现他这个网站有啥子限制,登陆一个搜房天下账号,然后采集回来分类列表的网址,然后就一

    大家坛有没有好用的群发工具下载呢
    当你的笑容给我礼貌的招呼,大家坛全自动发帖软件,宣传推广是一场持久战,总是有一些人把软件用了一天,或是几个小时,就觉得自己付出太多了,那加进来的粉丝,或是流量,应该是和宣传多少成正比的,其实没有这么便宜的事,就像很多阅读量超过一百万的视频,或是电影,真正会在屏幕打赏的人不会超过三千,真正大额打赏给主

    群发正版软件中国塑料网
    中国塑料网群发软件YYPOST脚本下载地址,这个网站会有一个很奇怪的问题就是你在首页登陆无半个验证码,但在登陆网址登陆就会有一个验证码,所以我们灵活一些,在首页登陆就不用输入验证码了哈。网站秒收录比较高,但发的都是五金和建筑行业,先前有很多人都是发土建工程的大公司操作的,现在这个网站专为那个行业诞生的吧。

    OpenStreetMap网站正版2019年发帖工具下载
    本帖最后由 发帖软件 于 2019-5-21 11:13 编辑 OpenStreetMap网站全自动群发,OpenStreetMapOpenStreetMap(简称OSM,中文是公开地图)是一个网上地图协作计划,目标是创造一个内容自由且能让所有人编辑的世界地图。有的人编辑地图然后等收录,有的人发日志等收录,我们这里也是利用地图日志做为宣传的目标,简单的脚本理

    搜房天下全自动收短信全自动识别验证码注册账号软件
    房天下自动注册机,这个脚本是前几天发房聊的脚本廷伸品种,这个脚本能做到自动注册账号,自动保存账号,自动发房聊的效果,不过今天我们主要说一说怎么注册账号写脚本吧,这个搜房天天下的账号,可以发提问,可以发房聊,发论坛,发博客,还有发个人中心页都是有秒收的效果的,这样就省去了去买号,去乱花钱的效果了吧,而

    企业邮箱安卓端有什么APP软件可以发的呢
    请输入标题企业邮箱安卓发发送邮箱脚本,这个脚本是利用企业邮箱进行群发的,全程是一种模拟手工操作的过程,所以封号是很少的,而且企业邮箱群发到普通QQ邮箱不容易进垃圾箱中的,所以这个脚本也是这样的原理,不过最好是利用一些多开器,登陆多点的QQ邮箱账号会比较流畅一些,然后用软件一个一个的切换APP进行群发邮件会

    头条留评论软件有没有好用的呢?
    今天整一个今日头条留言软件,对于留言YYPOST是优势是比较大的存在,因为他往往专注一些下拉定位的优点,像今日头条这样,还是需要一些特殊下拉定位的,因为他新闻有长有短,有图有视频的,所以综合起来定位是比较难的,如果用POST也不是很轻松可以破解他的加密参数。这个脚本也是有一个不好的地方就是换号会比较麻烦,您电

    单网页生成神器
    最近新技术,网页生成机占领了整个网络的半壁江山,效果很疯狂,虽然不知道能持续多久,作为开发软件的领头者,一直在找收录的方法,一直在努力创新着,一直被人模仿,却从没有被超越过,这个网页生成机,已经出来有一段时间了,一直没有拿出来分享,醉过醉过,它是利用的一些小小收录漏洞整的,您最好用一些老站域名,进行

关闭
快速回复 返回列表 返回顶部
本站自动发贴软件,是现在最流行的做脚本软件,这种发贴工具,不但发贴收录快,而且抢占好的先机,完全自由编辑,实现针对性群发模拟操作,软件可以顶贴,也可以发贴,可以兼容支持Discuz、PHPWind、Dvbbs三大主流论坛,有手机验证码收件,邮件收发的功能,支持验证码识别,注册问题识别,多线程任务,自动上传头像,自动激活注册邮件,兼容防注册插件,本站软件原创正版,更新效率最快的原创软件。 『网络推广软件』『自动发帖软件』『 自动发帖