util-helpers 4.12.2 → 4.12.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/esm/divide.js CHANGED
@@ -1,24 +1,24 @@
1
1
  import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
- import { strip, digitLength, float2Fixed, checkBoundary, isEffectiveNumeric } from './utils/math.util';
2
+ import { strip, digitLength, float2Fixed, checkBoundary, transformEffectiveNumber } from './utils/math.util';
3
3
  import times from './times';
4
4
  /**
5
- * 精确除法,支持多个数相除
5
+ * 精确除法,支持多个数相除,除数默认为 1 。
6
6
  *
7
7
  * @static
8
8
  * @alias module:Math.divide
9
9
  * @since 3.1.0
10
- * @param {...number|string} nums 除数和被除数
10
+ * @param {...number|string} nums 被除数和除数
11
11
  * @returns {number} 商数
12
12
  * @example
13
13
  *
14
- * divide(1.21, 1.1);
15
- * // => 1.1
16
- *
17
- * divide(1000, 10, 10);
18
- * // => 10
19
- *
20
- * divide(1000, 10, 10, 10);
21
- * // => 1
14
+ * divide(1.21); // 1.21 除数默认为 1 ,即 1.21/1 = 1.21
15
+ * divide(1.21, 1.1); // 1.1
16
+ * divide(1000, 10, 10); // 10
17
+ * divide(1000, 10, 10, 10); // 1
18
+ *
19
+ * divide(); // NaN 如果没有传入参数,被除数默认为 undefined 。 Number(undefined) 转换为 NaN ,NaN/1 = NaN
20
+ * divide(null); // 0 Number(null) 转换为 0 , 0/1 = 0
21
+ * divide('1.5 ', 0.5); // 3 Number('1.5 ') 转换为 1.5 ,1.5/0.5 = 3
22
22
  */
23
23
 
24
24
  function divide() {
@@ -27,18 +27,20 @@ function divide() {
27
27
  }
28
28
 
29
29
  var num1 = nums[0],
30
- num2 = nums[1],
30
+ _nums$ = nums[1],
31
+ num2 = _nums$ === void 0 ? 1 : _nums$,
31
32
  rest = nums.slice(2);
32
33
 
33
34
  if (rest.length > 0) {
34
35
  return divide.apply(void 0, [divide(num1, num2)].concat(_toConsumableArray(rest)));
35
- } // 兼容处理,如果参数包含无效数值时,尝试取出有效数值参数
36
+ }
36
37
 
38
+ num1 = transformEffectiveNumber(num1);
39
+ num2 = transformEffectiveNumber(num2); // 兼容处理,如果参数包含无效数值时,返回 NaN
40
+ // @ts-ignore
37
41
 
38
- if (!isEffectiveNumeric(num1)) {
39
- return isEffectiveNumeric(num2) ? Number(num2) : NaN;
40
- } else if (!isEffectiveNumeric(num2)) {
41
- return Number(num1);
42
+ if (isNaN(num1) || isNaN(num2)) {
43
+ return Number.NaN;
42
44
  }
43
45
 
44
46
  var num1Changed = float2Fixed(num1);
package/esm/index.js CHANGED
@@ -54,38 +54,35 @@ export { default as padZero } from './padZero';
54
54
  * @see 参考 {@link https://github.com/camsong/blog/issues/9|JavaScript 浮点数陷阱及解法}
55
55
  * @see 参考 {@link https://2zbuy.csb.app/|JS浮点数计算测试}
56
56
  * @example
57
- * // 从 4.12.0 版本开始,规范了有效数值参数校验。
58
- * // 有效数值即数字或字符串类型,字符串不能为空或空白符,能通过 Number(value) 转为数字,且不能为 NaN 。
57
+ * // 从 4.12.0 版本开始,规范了有效数值。(注意:4.12.3 对有效数值重新定义)
58
+ * // 有效数值即能通过 Number(value) 转为数字,且不能为 NaN 。
59
59
  *
60
60
  * // 以下为有效数值:
61
61
  * // 1. 数字: 1, -1, 1e-2, 1.312, 0.1, Infinity
62
- * // 2. 数字字符串: '1', '10e2', '-1', '0.1'
62
+ * // 2. 字符串: '1', '10e2', '-1', '0.1', '', ' ', ' 15', ' 15 '
63
+ * // 4. 其他类型: null, new Date(), [], new Array(), true, false,...
63
64
  *
64
65
  * // 以下为无效数值:
65
- * // 1. 非数字的字符串: '', ' ', '1a', '-12a', '10.2.2', '10e2.1'
66
- * // 2. 其他类型值: undefined, null, true, false, [], {}, new Date(), ...
67
- *
68
- * // 注意:Number('') 、 Number(' ') 、 Number(new Date) 、 Number(true)等虽然可以返回数字,但都不是有效数值。
69
- * // 因为它们分别是空字符串、空格字符串和非数字或字符串类型。
70
- *
66
+ * // 1. 字符串: '1a', '-12a', '10.2.2', '10e2.1'
67
+ * // 2. 其他类型: undefined, [], {}, Symbol(), function(){}, ()=>{}
71
68
  *
72
69
  * // 计算说明:
73
- * // 1. 全部参数都是无效数值将返回 NaN 。
74
- * plus(); // NaN
75
- * plus(new Date()); // NaN
76
- * plus(true, null); // NaN
70
+ * // 四则运算的第二个参数都是有默认值(乘数和除数默认1,加数和减数默认0)
71
+ * plus(); // NaN 0个参数时,被加数转换为 Number(undefined) NaN ,NaN+0 = NaN 。其他计算方法如果没有参数一样返回 NaN 。
72
+ * plus(0.1); // 0.1 第二个参数,加数默认为 0
73
+ * plus(undefined, 0.1); // NaN 第一个参数被加数转换为 Number(undefined) NaN ,NaN+0 = NaN 。其他计算方法如果第一个参数为无效数值一样返回 NaN 。
74
+ * plus(true, null); // 1 Number(true) 转换为 1 , Number(null) 转换为 0 , 1+0=1
77
75
  *
78
- * // 2. 参数中包含有效数值和无效数值,将忽略无效数值。
79
- * plus(0.1); // 0.1
80
- * plus('0.1', ' ', true, ); // 0.1
81
- * plus(true, 0.1); // 0.1
82
- * plus(true, 0.1, 0.2); // 0.3
83
- * plus('', 0.1, ' ', new Date(), 0.2); // 0.3
84
- * plus(0.1, true, 0.2, null); // 0.3
76
+ * // 2. 参数中包含无效数值,返回NaN
77
+ * plus('0.1', ' a'); // NaN
78
+ * plus(true, {}); // NaN
79
+ * plus(true, 0.1, Symbol()); // NaN
85
80
  *
86
- * // 3. 数字和数字字符串将正常的使用安全计算
87
- * plus(0.1, 0.2); // 0.3
88
- * plus(0.1, 0.2, 0.3); // 0.6
81
+ * // 注意:
82
+ * // 如果第二个及后面的参数如果值为 undefined 取默认值,即乘除数取 1 ,加减法取 0
83
+ * plus(0.1, undefined); // 0.1
84
+ * plus(0.1, undefined, 0.2, undefined); // 0.3 后面的 undefined 取默认值 0
85
+ * times(0.1, undefined, 0.2, undefined); // 0.02 后面的 undefined 取默认值 1
89
86
  *
90
87
  */
91
88
 
package/esm/minus.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
- import { digitLength, isEffectiveNumeric } from './utils/math.util';
2
+ import { digitLength, transformEffectiveNumber } from './utils/math.util';
3
3
  import times from './times';
4
4
  /**
5
- * 精确减法,支持多个数相减
5
+ * 精确减法,支持多个数相减,减数默认为 0 。
6
6
  *
7
7
  * @static
8
8
  * @alias module:Math.minus
@@ -27,18 +27,20 @@ function minus() {
27
27
  }
28
28
 
29
29
  var num1 = nums[0],
30
- num2 = nums[1],
30
+ _nums$ = nums[1],
31
+ num2 = _nums$ === void 0 ? 0 : _nums$,
31
32
  rest = nums.slice(2);
32
33
 
33
34
  if (rest.length > 0) {
34
35
  return minus.apply(void 0, [minus(num1, num2)].concat(_toConsumableArray(rest)));
35
- } // 兼容处理,如果参数包含无效数值时,尝试取出有效数值参数
36
+ }
36
37
 
38
+ num1 = transformEffectiveNumber(num1);
39
+ num2 = transformEffectiveNumber(num2); // 兼容处理,如果参数包含无效数值时,返回 NaN
40
+ // @ts-ignore
37
41
 
38
- if (!isEffectiveNumeric(num1)) {
39
- return isEffectiveNumeric(num2) ? Number(num2) : NaN;
40
- } else if (!isEffectiveNumeric(num2)) {
41
- return Number(num1);
42
+ if (isNaN(num1) || isNaN(num2)) {
43
+ return Number.NaN;
42
44
  }
43
45
 
44
46
  var baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));
package/esm/plus.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
- import { digitLength, isEffectiveNumeric } from './utils/math.util';
2
+ import { digitLength, transformEffectiveNumber } from './utils/math.util';
3
3
  import times from './times';
4
4
  /**
5
- * 精确加法,支持多个数相加
5
+ * 精确加法,支持多个数相加,加数默认为 0 。
6
6
  *
7
7
  * @static
8
8
  * @alias module:Math.plus
@@ -27,18 +27,20 @@ function plus() {
27
27
  }
28
28
 
29
29
  var num1 = nums[0],
30
- num2 = nums[1],
30
+ _nums$ = nums[1],
31
+ num2 = _nums$ === void 0 ? 0 : _nums$,
31
32
  rest = nums.slice(2);
32
33
 
33
34
  if (rest.length > 0) {
34
35
  return plus.apply(void 0, [plus(num1, num2)].concat(_toConsumableArray(rest)));
35
- } // 兼容处理,如果参数包含无效数值时,尝试取出有效数值参数
36
+ }
36
37
 
38
+ num1 = transformEffectiveNumber(num1);
39
+ num2 = transformEffectiveNumber(num2); // 兼容处理,如果参数包含无效数值时,返回 NaN
40
+ // @ts-ignore
37
41
 
38
- if (!isEffectiveNumeric(num1)) {
39
- return isEffectiveNumeric(num2) ? Number(num2) : NaN;
40
- } else if (!isEffectiveNumeric(num2)) {
41
- return Number(num1);
42
+ if (isNaN(num1) || isNaN(num2)) {
43
+ return Number.NaN;
42
44
  }
43
45
 
44
46
  var baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));
package/esm/round.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import divide from './divide';
2
2
  import times from './times';
3
- import { isEffectiveNumeric } from './utils/math.util';
3
+ import { transformEffectiveNumber } from './utils/math.util';
4
4
  /**
5
5
  * 四舍五入,支持设置精度
6
6
  *
@@ -24,10 +24,11 @@ import { isEffectiveNumeric } from './utils/math.util';
24
24
 
25
25
  function round(num) {
26
26
  var precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
27
+ num = transformEffectiveNumber(num); // 兼容处理,如果参数包含无效数值时,返回 NaN
28
+ // @ts-ignore
27
29
 
28
- // 兼容处理,如果参数包含无效数值时,返回第一个参数
29
- if (!isEffectiveNumeric(num)) {
30
- return NaN;
30
+ if (isNaN(num)) {
31
+ return Number.NaN;
31
32
  }
32
33
 
33
34
  var base = Math.pow(10, precision);
package/esm/times.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
- import { digitLength, float2Fixed, checkBoundary, isEffectiveNumeric } from './utils/math.util';
2
+ import { digitLength, float2Fixed, checkBoundary, transformEffectiveNumber } from './utils/math.util';
3
3
  /**
4
- * 精确乘法,支持多个数相乘
4
+ * 精确乘法,支持多个数相乘,乘数默认为 1 。
5
5
  *
6
6
  * @static
7
7
  * @alias module:Math.times
@@ -26,18 +26,20 @@ function times() {
26
26
  }
27
27
 
28
28
  var num1 = nums[0],
29
- num2 = nums[1],
29
+ _nums$ = nums[1],
30
+ num2 = _nums$ === void 0 ? 1 : _nums$,
30
31
  rest = nums.slice(2);
31
32
 
32
33
  if (rest.length > 0) {
33
34
  return times.apply(void 0, [times(num1, num2)].concat(_toConsumableArray(rest)));
34
- } // 兼容处理,如果参数包含无效数值时,尝试取出有效数值参数
35
+ }
35
36
 
37
+ num1 = transformEffectiveNumber(num1);
38
+ num2 = transformEffectiveNumber(num2); // 兼容处理,如果参数包含无效数值时,返回 NaN
39
+ // @ts-ignore
36
40
 
37
- if (!isEffectiveNumeric(num1)) {
38
- return isEffectiveNumeric(num2) ? Number(num2) : NaN;
39
- } else if (!isEffectiveNumeric(num2)) {
40
- return Number(num1);
41
+ if (isNaN(num1) || isNaN(num2)) {
42
+ return Number.NaN;
41
43
  }
42
44
 
43
45
  var num1Changed = float2Fixed(num1);
@@ -1,4 +1,4 @@
1
- var version = "4.12.2";
1
+ var version = "4.12.3";
2
2
  var config = {
3
3
  // 禁用warning提示
4
4
  disableWarning: true
@@ -6,15 +6,18 @@
6
6
  */
7
7
  import { MAX_SAFE_INTEGER, MIN_SAFE_INTEGER } from './constants';
8
8
  import devWarn from './devWarn';
9
- import { isNumber, isString } from './type';
9
+ import { isNumber, isString, isSymbol } from './type';
10
10
  /**
11
11
  * 值是否为有效的数值
12
12
  *
13
+ * @deprecated 已废弃
13
14
  * @param {*} value 待检测的值
14
15
  * @returns {boolean} 是否为有效的数值
15
16
  */
16
17
 
17
- export function isEffectiveNumeric(value) {
18
+ export function isEffectiveNumeric() {
19
+ var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
20
+
18
21
  if (isNumber(value) && !isNaN(value)) {
19
22
  return true;
20
23
  } // 避免空字符串 或 带空格的字符串
@@ -36,6 +39,50 @@ export function isEffectiveNumeric(value) {
36
39
  devWarn("".concat(value, " is not a valid number."));
37
40
  return false;
38
41
  }
42
+ /**
43
+ * 将值转换为有效数值
44
+ *
45
+ * @param {*} value 要转换的值
46
+ * @returns {number|string} 有效数值
47
+ */
48
+
49
+ export function transformEffectiveNumber(value) {
50
+ /** @type {string|number|undefined} */
51
+ var ret;
52
+
53
+ if (isString(value)) {
54
+ ret = value.trim(); // ' 15' ' 15 ' 兼容 Number(string) 处理
55
+
56
+ if (ret === '') {
57
+ ret = Number(ret);
58
+ } else if (Number.isNaN(Number(ret))) {
59
+ // string如果可以转换为number,默认不转换为number类型
60
+ ret = Number.NaN;
61
+ }
62
+ } else if (isSymbol(value)) {
63
+ ret = Number.NaN;
64
+ } else if (!isNumber(value)) {
65
+ // 其余非数字类型通过 Number 转换
66
+ // 例如 Symbol 包装器对象将会报错
67
+ // symObj = Object(Symbol());
68
+ // Number(symObj); // TypeError: Cannot convert a Symbol value to a number
69
+ try {
70
+ ret = Number(value);
71
+ } catch (err) {
72
+ ret = Number.NaN;
73
+ console.error(err);
74
+ }
75
+ } else {
76
+ ret = value;
77
+ }
78
+
79
+ if (Number.isNaN(ret)) {
80
+ return Number.NaN;
81
+ } // @ts-ignore
82
+
83
+
84
+ return ret;
85
+ }
39
86
  /**
40
87
  * 是否为科学计数法数字
41
88
  *
package/lib/divide.js CHANGED
@@ -24,23 +24,23 @@ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToAr
24
24
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
25
25
 
26
26
  /**
27
- * 精确除法,支持多个数相除
27
+ * 精确除法,支持多个数相除,除数默认为 1 。
28
28
  *
29
29
  * @static
30
30
  * @alias module:Math.divide
31
31
  * @since 3.1.0
32
- * @param {...number|string} nums 除数和被除数
32
+ * @param {...number|string} nums 被除数和除数
33
33
  * @returns {number} 商数
34
34
  * @example
35
35
  *
36
- * divide(1.21, 1.1);
37
- * // => 1.1
38
- *
39
- * divide(1000, 10, 10);
40
- * // => 10
41
- *
42
- * divide(1000, 10, 10, 10);
43
- * // => 1
36
+ * divide(1.21); // 1.21 除数默认为 1 ,即 1.21/1 = 1.21
37
+ * divide(1.21, 1.1); // 1.1
38
+ * divide(1000, 10, 10); // 10
39
+ * divide(1000, 10, 10, 10); // 1
40
+ *
41
+ * divide(); // NaN 如果没有传入参数,被除数默认为 undefined 。 Number(undefined) 转换为 NaN ,NaN/1 = NaN
42
+ * divide(null); // 0 Number(null) 转换为 0 , 0/1 = 0
43
+ * divide('1.5 ', 0.5); // 3 Number('1.5 ') 转换为 1.5 ,1.5/0.5 = 3
44
44
  */
45
45
  function divide() {
46
46
  for (var _len = arguments.length, nums = new Array(_len), _key = 0; _key < _len; _key++) {
@@ -48,18 +48,20 @@ function divide() {
48
48
  }
49
49
 
50
50
  var num1 = nums[0],
51
- num2 = nums[1],
51
+ _nums$ = nums[1],
52
+ num2 = _nums$ === void 0 ? 1 : _nums$,
52
53
  rest = nums.slice(2);
53
54
 
54
55
  if (rest.length > 0) {
55
56
  return divide.apply(void 0, [divide(num1, num2)].concat(_toConsumableArray(rest)));
56
- } // 兼容处理,如果参数包含无效数值时,尝试取出有效数值参数
57
+ }
57
58
 
59
+ num1 = (0, _math.transformEffectiveNumber)(num1);
60
+ num2 = (0, _math.transformEffectiveNumber)(num2); // 兼容处理,如果参数包含无效数值时,返回 NaN
61
+ // @ts-ignore
58
62
 
59
- if (!(0, _math.isEffectiveNumeric)(num1)) {
60
- return (0, _math.isEffectiveNumeric)(num2) ? Number(num2) : NaN;
61
- } else if (!(0, _math.isEffectiveNumeric)(num2)) {
62
- return Number(num1);
63
+ if (isNaN(num1) || isNaN(num2)) {
64
+ return Number.NaN;
63
65
  }
64
66
 
65
67
  var num1Changed = (0, _math.float2Fixed)(num1);
package/lib/minus.js CHANGED
@@ -24,7 +24,7 @@ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToAr
24
24
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
25
25
 
26
26
  /**
27
- * 精确减法,支持多个数相减
27
+ * 精确减法,支持多个数相减,减数默认为 0 。
28
28
  *
29
29
  * @static
30
30
  * @alias module:Math.minus
@@ -48,18 +48,20 @@ function minus() {
48
48
  }
49
49
 
50
50
  var num1 = nums[0],
51
- num2 = nums[1],
51
+ _nums$ = nums[1],
52
+ num2 = _nums$ === void 0 ? 0 : _nums$,
52
53
  rest = nums.slice(2);
53
54
 
54
55
  if (rest.length > 0) {
55
56
  return minus.apply(void 0, [minus(num1, num2)].concat(_toConsumableArray(rest)));
56
- } // 兼容处理,如果参数包含无效数值时,尝试取出有效数值参数
57
+ }
57
58
 
59
+ num1 = (0, _math.transformEffectiveNumber)(num1);
60
+ num2 = (0, _math.transformEffectiveNumber)(num2); // 兼容处理,如果参数包含无效数值时,返回 NaN
61
+ // @ts-ignore
58
62
 
59
- if (!(0, _math.isEffectiveNumeric)(num1)) {
60
- return (0, _math.isEffectiveNumeric)(num2) ? Number(num2) : NaN;
61
- } else if (!(0, _math.isEffectiveNumeric)(num2)) {
62
- return Number(num1);
63
+ if (isNaN(num1) || isNaN(num2)) {
64
+ return Number.NaN;
63
65
  }
64
66
 
65
67
  var baseNum = Math.pow(10, Math.max((0, _math.digitLength)(num1), (0, _math.digitLength)(num2)));
package/lib/plus.js CHANGED
@@ -24,7 +24,7 @@ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToAr
24
24
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
25
25
 
26
26
  /**
27
- * 精确加法,支持多个数相加
27
+ * 精确加法,支持多个数相加,加数默认为 0 。
28
28
  *
29
29
  * @static
30
30
  * @alias module:Math.plus
@@ -48,18 +48,20 @@ function plus() {
48
48
  }
49
49
 
50
50
  var num1 = nums[0],
51
- num2 = nums[1],
51
+ _nums$ = nums[1],
52
+ num2 = _nums$ === void 0 ? 0 : _nums$,
52
53
  rest = nums.slice(2);
53
54
 
54
55
  if (rest.length > 0) {
55
56
  return plus.apply(void 0, [plus(num1, num2)].concat(_toConsumableArray(rest)));
56
- } // 兼容处理,如果参数包含无效数值时,尝试取出有效数值参数
57
+ }
57
58
 
59
+ num1 = (0, _math.transformEffectiveNumber)(num1);
60
+ num2 = (0, _math.transformEffectiveNumber)(num2); // 兼容处理,如果参数包含无效数值时,返回 NaN
61
+ // @ts-ignore
58
62
 
59
- if (!(0, _math.isEffectiveNumeric)(num1)) {
60
- return (0, _math.isEffectiveNumeric)(num2) ? Number(num2) : NaN;
61
- } else if (!(0, _math.isEffectiveNumeric)(num2)) {
62
- return Number(num1);
63
+ if (isNaN(num1) || isNaN(num2)) {
64
+ return Number.NaN;
63
65
  }
64
66
 
65
67
  var baseNum = Math.pow(10, Math.max((0, _math.digitLength)(num1), (0, _math.digitLength)(num2)));
package/lib/round.js CHANGED
@@ -35,10 +35,11 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "d
35
35
  */
36
36
  function round(num) {
37
37
  var precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
38
+ num = (0, _math.transformEffectiveNumber)(num); // 兼容处理,如果参数包含无效数值时,返回 NaN
39
+ // @ts-ignore
38
40
 
39
- // 兼容处理,如果参数包含无效数值时,返回第一个参数
40
- if (!(0, _math.isEffectiveNumeric)(num)) {
41
- return NaN;
41
+ if (isNaN(num)) {
42
+ return Number.NaN;
42
43
  }
43
44
 
44
45
  var base = Math.pow(10, precision);
package/lib/times.js CHANGED
@@ -20,7 +20,7 @@ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToAr
20
20
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
21
21
 
22
22
  /**
23
- * 精确乘法,支持多个数相乘
23
+ * 精确乘法,支持多个数相乘,乘数默认为 1 。
24
24
  *
25
25
  * @static
26
26
  * @alias module:Math.times
@@ -44,18 +44,20 @@ function times() {
44
44
  }
45
45
 
46
46
  var num1 = nums[0],
47
- num2 = nums[1],
47
+ _nums$ = nums[1],
48
+ num2 = _nums$ === void 0 ? 1 : _nums$,
48
49
  rest = nums.slice(2);
49
50
 
50
51
  if (rest.length > 0) {
51
52
  return times.apply(void 0, [times(num1, num2)].concat(_toConsumableArray(rest)));
52
- } // 兼容处理,如果参数包含无效数值时,尝试取出有效数值参数
53
+ }
53
54
 
55
+ num1 = (0, _math.transformEffectiveNumber)(num1);
56
+ num2 = (0, _math.transformEffectiveNumber)(num2); // 兼容处理,如果参数包含无效数值时,返回 NaN
57
+ // @ts-ignore
54
58
 
55
- if (!(0, _math.isEffectiveNumeric)(num1)) {
56
- return (0, _math.isEffectiveNumeric)(num2) ? Number(num2) : NaN;
57
- } else if (!(0, _math.isEffectiveNumeric)(num2)) {
58
- return Number(num1);
59
+ if (isNaN(num1) || isNaN(num2)) {
60
+ return Number.NaN;
59
61
  }
60
62
 
61
63
  var num1Changed = (0, _math.float2Fixed)(num1);
@@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.setDisableWarning = setDisableWarning;
7
7
  exports.version = exports.config = void 0;
8
- var version = "4.12.2";
8
+ var version = "4.12.3";
9
9
  exports.version = version;
10
10
  var config = {
11
11
  // 禁用warning提示
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.isEffectiveNumeric = isEffectiveNumeric;
7
+ exports.transformEffectiveNumber = transformEffectiveNumber;
7
8
  exports.isScientificNumber = isScientificNumber;
8
9
  exports.strip = strip;
9
10
  exports.digitLength = digitLength;
@@ -30,10 +31,13 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "d
30
31
  /**
31
32
  * 值是否为有效的数值
32
33
  *
34
+ * @deprecated 已废弃
33
35
  * @param {*} value 待检测的值
34
36
  * @returns {boolean} 是否为有效的数值
35
37
  */
36
- function isEffectiveNumeric(value) {
38
+ function isEffectiveNumeric() {
39
+ var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
40
+
37
41
  if ((0, _type.isNumber)(value) && !isNaN(value)) {
38
42
  return true;
39
43
  } // 避免空字符串 或 带空格的字符串
@@ -55,6 +59,51 @@ function isEffectiveNumeric(value) {
55
59
  (0, _devWarn["default"])("".concat(value, " is not a valid number."));
56
60
  return false;
57
61
  }
62
+ /**
63
+ * 将值转换为有效数值
64
+ *
65
+ * @param {*} value 要转换的值
66
+ * @returns {number|string} 有效数值
67
+ */
68
+
69
+
70
+ function transformEffectiveNumber(value) {
71
+ /** @type {string|number|undefined} */
72
+ var ret;
73
+
74
+ if ((0, _type.isString)(value)) {
75
+ ret = value.trim(); // ' 15' ' 15 ' 兼容 Number(string) 处理
76
+
77
+ if (ret === '') {
78
+ ret = Number(ret);
79
+ } else if (Number.isNaN(Number(ret))) {
80
+ // string如果可以转换为number,默认不转换为number类型
81
+ ret = Number.NaN;
82
+ }
83
+ } else if ((0, _type.isSymbol)(value)) {
84
+ ret = Number.NaN;
85
+ } else if (!(0, _type.isNumber)(value)) {
86
+ // 其余非数字类型通过 Number 转换
87
+ // 例如 Symbol 包装器对象将会报错
88
+ // symObj = Object(Symbol());
89
+ // Number(symObj); // TypeError: Cannot convert a Symbol value to a number
90
+ try {
91
+ ret = Number(value);
92
+ } catch (err) {
93
+ ret = Number.NaN;
94
+ console.error(err);
95
+ }
96
+ } else {
97
+ ret = value;
98
+ }
99
+
100
+ if (Number.isNaN(ret)) {
101
+ return Number.NaN;
102
+ } // @ts-ignore
103
+
104
+
105
+ return ret;
106
+ }
58
107
  /**
59
108
  * 是否为科学计数法数字
60
109
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "util-helpers",
3
- "version": "4.12.2",
3
+ "version": "4.12.3",
4
4
  "description": "一个基于业务场景的工具方法库",
5
5
  "main": "lib/index.js",
6
6
  "module": "esm/index.js",
@@ -1,21 +1,21 @@
1
1
  export default divide;
2
2
  /**
3
- * 精确除法,支持多个数相除
3
+ * 精确除法,支持多个数相除,除数默认为 1 。
4
4
  *
5
5
  * @static
6
6
  * @alias module:Math.divide
7
7
  * @since 3.1.0
8
- * @param {...number|string} nums 除数和被除数
8
+ * @param {...number|string} nums 被除数和除数
9
9
  * @returns {number} 商数
10
10
  * @example
11
11
  *
12
- * divide(1.21, 1.1);
13
- * // => 1.1
12
+ * divide(1.21); // 1.21 除数默认为 1 ,即 1.21/1 = 1.21
13
+ * divide(1.21, 1.1); // 1.1
14
+ * divide(1000, 10, 10); // 10
15
+ * divide(1000, 10, 10, 10); // 1
14
16
  *
15
- * divide(1000, 10, 10);
16
- * // => 10
17
- *
18
- * divide(1000, 10, 10, 10);
19
- * // => 1
17
+ * divide(); // NaN 如果没有传入参数,被除数默认为 undefined 。 Number(undefined) 转换为 NaN ,NaN/1 = NaN
18
+ * divide(null); // 0 Number(null) 转换为 0 , 0/1 = 0
19
+ * divide('1.5 ', 0.5); // 3 Number('1.5 ') 转换为 1.5 ,1.5/0.5 = 3
20
20
  */
21
21
  declare function divide(...nums: (number | string)[]): number;
@@ -1,6 +1,6 @@
1
1
  export default minus;
2
2
  /**
3
- * 精确减法,支持多个数相减
3
+ * 精确减法,支持多个数相减,减数默认为 0 。
4
4
  *
5
5
  * @static
6
6
  * @alias module:Math.minus