【前端面试题】0.2 + 0.1 === 0.3 ?js数据类型精度问题

in 前端 with 0 comment

background

今天看到了一篇 “2019 前端面试都聊啥” 的文章。全国大大小小的公司前端开发人员恐怕能坐满 100 辆加长版复兴号了。但是很多所谓的“基础”或者一些平时不太会遇见的问题,记得住的会比较少。比如 js 数据类型这件事。所以今天就念叨念叨。

本文使用 es6 及以上语法

js 数据类型/目录

字符串型

在一些编程语言里会把这个类型分为“字符”和“字符串”两个类型,字符就是只有一个字符,字符串就是两个以上。
(至少我上学的时候那个计算机图形学的博士是这么讲的,我对此产生怀疑态度,因为我只用字符串。)

// javascript
let str = 'hi there';
let numStr = '9';

数字型

在一些强数据类型的编程语言里,数字型会被拆分成 “整型” 和 “浮点型” 之类的数据类型。但是上学的时候老师严格禁止我们使用浮点型进行计算。原因是浮点型数据由于在计算机内部使用二进制计算等原因,会造成丢失精度。经过测试,不只是 js,很多编程语言都有这样的问题。
工作了以后,在计算价格的时候全部都转成以分做单位进行计算。不过后端给的理由是,整型的计算速度快。

0.2 + 0.1 === 0.3 // js
0.2 + 0.1 == 0.3 // java & python

计算结果

false

当在应该使用数字型的地方使用了其他类型时,会出现 NaN 字样(Not a Number),这时候应该检查是否在运算过程中使用了非数字字符。

当数字为字符串类型时的运算会变成字符串拼接

const NUM1 = '1234';
const NUM2 = 1234;
const NUM3 = 9876;
console.log(NUM1 + NUM3); // 12349876
console.log(NUM2 + NUM3); // 11110

布尔型

布尔型数据用来标注真和假两个位置,大概是最接近二进制的一种数据类型了。
当字符串为空,或者数字为 0 的时候,转换为布尔型也会返回false

const NUM = 0;
NUM ? console.log('yes') : console.log('no'); // no

const STR = '';
STR ? console.log('yes') : console.log('no'); // no

于此同时,我想多说两句的是,在js里, === 和 == 得到的结果会有不同。 === 这样的比较符号除了比较变量的值以外,还比较数据类型,可以理解成“全等”

const NUM = 9;
let num = '9';
console.log(NUM == num); // true
console.log(NUM === num); //false

数组型

一维数组可以理解为数列,二维数组可以理解为矩阵。
数组里的元素可以是以上任何类型,甚至还可以是数组或者对象。元素的 index 从 0 开始计,

const ARR = [2, '4', true, [0, 1], { name: 'peter' }];
console.log('第2个元素:',ARR[1]); // 第二个元素 4

对象型

对象也可以理解成一种数组,例如按照 json 格式写的对象我们也会称作 “json 数组”。

const OBJ = {
  name: '田昊天',
  age: 18,
  score: [
    {
      subject: '语文',
      value: 100,
    },
    {
      subject: '数学',
      value: 99,
    },
    {
      subject: '英语',
      value: 95,
    },
  ],
}
console.log(`${obj.name}的${obj.score[1].subject}成绩:`,obj.score[1].value); 
// 田昊天的数学成绩: 99

Null

这是个用来清空变量的数据类型,以上提到的所有类型都支持

let str = 'Hi there';
str = null;
console.log(str); // null
let arr = [];
arr = null;
console.log(arr); //null

Undefined

这个是在使用没有被声明的变量时会产生的结果

// 不声明任何变量
console.log(neq); // undefined
Comments are closed.