这是我参与「日新方案10月更文应战」的第1天,点击检查活动详情

我正在参与「启航方案」

JavaScript是一种脚本言语,是前端言语的基础,无论是学习哪种前端结构,学好JS都是很有必要的。JavaScript是Brendan Eich在1995年创造的言语,为网景浏览器Netscape 2创造,在1997年成为ECMA-262标准的一部分。

JavaScript古怪行为大赏
JavaScript之父-Brendan Eich

JS的规划初衷仅仅为了完成简单的网页互动,并没有考虑复杂应用的需求,规划者只用了10天的时刻完成了规划,另外因为规划本身擅长函数式编程,可是又需求将JS往面向目标上挨近,出于规划简单脚本言语的想法抛弃了「类」的想法,选用prototype承继模型,使这门言语「怪样子」。因为JS言语一经推出就立刻受到广泛承受,用户呈爆破式增加,使其没有时刻调整规划,缺乏堆集过程,一起因为网景和微软的JScript竞赛,强势申请JS的国际标准,使得JS在推出一年半之后就称为标准。

JS规划之初并未想到会成为一门爆破式的盛行言语,以及以上原因,因此在语法规划上存在许多「语法缺点」,但这一起也是JS的强壮之处。

文章结合JS语法以及运用经历,对JS中数字的处理问题进行列举和阐明,用于在实际编程中防止踩坑,如有问题,欢迎纠正。

parseInt

原理

perseInt(value, radix),将指定为radix进制的value转为10进制整数

机制:parseInt会逐字符解析,直到遇到无法解析的字符

例子

比方:

parseInt('f*ck', 16) // 15
parseInt('1cdfed013*ck', 16) // 7750995987

将 “Infinity” 转为不同进制的数字:

//
parseInt("Infinity", 10); // -> NaN
// ...
parseInt("Infinity", 18); // -> NaN...
parseInt("Infinity", 19); // -> 18
// ...
parseInt("Infinity", 23); // -> 18...
parseInt("Infinity", 24); // -> 151176378
// ...
parseInt("Infinity", 29); // -> 385849803
parseInt("Infinity", 30); // -> 13693557269
// ...
parseInt("Infinity", 34); // -> 28872273981
parseInt("Infinity", 35); // -> 1201203301724
parseInt("Infinity", 36); // -> 1461559270678...
parseInt("Infinity", 37); // -> NaN

警觉空值

在运用parseInt进行数字转化时,要留意null空值判别

parseInt(null, 24) // 23

==, >, >=的比较规则

null == 0; // false
null > 0; // false
null >=0; // true

== 进行比较时,如果有非数字,会进行数字转化;可是如果有一侧是null/undefined,那么另一侧也有必要是其中一个才会进行转化,否则不转;

对两边进行数字转化,+null -> 0

= 并不等同于大于或等于,而是对小于比较的结果取反,null >= 0等同于 null < 0,+null < 0, 0 < 0,返回false,取反返回true

连续比较

1 < 2 < 3; // -> true
3 > 2 > 1; // -> false

依照从左到右的顺序履行,

1 < 2 < 3 // 1 < 2 -> true
true < 3 // true -> 1
1 < 3 // true
3 > 2 > 1 // 3 > 2 -> true
true > 1 // true -> 1
1 > 1 // false

❓0.1 + 0.2 === 0.3

0.1 + 0.2 === 0.3 // false

程序中的常数0.2和0.3也是它们的实在值的近似值。与0.2最接近的双精度数大于有理数0.2,而与0.3最接近的双精度数小于有理数0.3。0.1和0.2的和最终比有理数0.3大,因此与代码中的常数不一致。

详细解说拜见 0.30000000000000004.com

不只有JS中会有这个问题,运用浮点数学的言语都会有。

JS中中最小值大于0

Number.MIN_VALUE > 0; // -> true

Number.MIN_VALUE 是5e-324,是浮点数精度能标识的最小正数,也是最接近0的数字;

正数范围内的最小值是Number.NEGATIVE_INFINITY,虽然严格意义上讲这并不是一个数字。

双小数点

27.toString() // Uncaught SyntaxError: Invalid or unexpected token

运用双小数点可以解决问题:

27..toString() // '27'

原因:以上现象仅仅JS的语法限制。.有语法歧义,既可以作为成员操作符,又可以是数值后的小数点,取决于运用场景。

标准上关于例子中点位置的解说是数值后的小数点,这是由ECMAScript的数值型语法界说的,因此有必要运用两个点,或许增加括号的方式才能使上述语法收效。

(27).toString() // '27'
// 或许
27..toString(); // '27'

return

(function() {
  return
  {
    b: 10;
  }
})(); // -> undefined
let f = () => {};
f(); // -> undefined
// {}被作为函数的一部分,因此返回undefined
let f = () => ({});
f(); // -> {}

比方在运用map函数映射目标时,省掉return的方式:

const mockData = [{name: 'lily'}, {name: 'mike'}];
const result = mockData.map(item => ({name: item.name, key: item.name}));
const result = mockData.map(item => ({name: item.name, key: item.name}));

总结

文章罗列了JS在处理数值时的一些易出错或不常见的问题,在处理数值逻辑的时候需求留意,防止踩坑。

如果你遇到过JS中其他古怪行为,欢迎谈论区谈论交流,一起前进吖❤️❤️❤️