Day 10 JS有哪8种数据类型,你需要注意什么?

原始类型(Primitive Type)和对象类型(Object Type)
原始数据类型包含了数字、布尔、字符串、BigInt、null、undefined,以及后来新增的 symbol,这个数据类型的值都是不可变的(immutable)。
对象数据类型则包含我们经常说的对象,对象的值是可变的(mutable)。它是一个大类,如果再细分,它又包含了我们常用的数组(array)、函数(function)、Date、RegExp,以及后来新增的 Map 和 Set。
Day 10 JS有哪8种数据类型,你需要注意什么?_第1张图片
原始类型number 数字:为什么 0.1+0.2 不等于 0.3?
JavaScript 中的数字类型包括了浮点数和整数两类。
以上运算使用的是浮点数。
定点数:好处是满足日常小额运算需求。缺点就是进行很小或是很大的数字计算时,会浪费很大空间。例如:14亿就是1,400,000,000。
浮点数:采用科学计数法表示,由尾数(significand mantissa)、基数(base)和指数(exponent)三部分组成。例如:14亿就是1.4*10^9。
JavaScript 所采用的IEEE 754 是二进制浮点数算术标准。这个标准里规定了 4 种浮点数算术方式:单精确度、双精确度、延伸单精确度与延伸双精确度。JavaScript 在这里选择的又是双精确度(64 位)这种方式,通常也叫 double 或者 float64 类型。
双精确度(64 位):有 64 位比特。其中包含了 1 个比特的符号位(sign)、11 个比特的有偏指数(exponent)、还有 52 个比特的小数部分(fraction)。
Day 10 JS有哪8种数据类型,你需要注意什么?_第2张图片
因为把十进制转化为二进制的算法是用十进制的小数乘以 2 直到没有了小数为止,所以十进制下的有些小数无法被精确地表示成二进制小数。而既然这里的浮点数是二进制,因此小数就会存在精度丢失的问题。而且当我们使用加减法的时候,由于需要先对齐(也就是把指数对齐,过程中产生移位),再计算,所以这个精度会进一步丢失。并且根据 JavaScript 引擎实际返回的小数点后的位数,可能会出现第三次丢失。这样下来,最后的结果就和实际相加减的数有偏离。
解决方案:通过按比例放大再缩小。
NaN:如何判断一个值是不是数字?

  • 在 IEEE 754 中,NaN 虽然代表的是“不是数字”的意思,但是如果我们用 typeof NaN 来获取,会发现它返回的是 number。
  • 原始类型有个特点,就是两个数据的数值一样,会被当做是等同的。而对象类型则相反,即使两个数据的数值一样,也会被当做是不同的数值,每一个数值都有一个唯一的身份。

  • === 123 // 返回 true
    {} === {} // 返回 false

    `NaN === NaN // 返回 false`
    JavaScript 中会通过 isNaN 来判断一个值是不是数字,但是当我们输入一个字符串,它也会被当做是一个数字。因为在这个过程中,“0”这个字符串被转换成了数字。
    `isNaN("0") // 返回 false`
    **如何才能更正确地判断一个值是不是数字呢?**
    isFinite 是 JavaScript 中的一个内置函数,通过它,我们可以过滤掉 NaN 和 Infinity。
    它会把括号中的值比如字符串转化成数字,所以我们需要再通过 typeof 来确保这种被转换的问题不会被漏掉

    var isNum = function isNum(value){
    return typeof value === 'number' && isFinite(value);
    }

    **string 字符串:一串字符有多长?**
    我们是用 new String() 这样的 constructor 的方式创建一个字符串。而当我们想要获取它的长度时,就可以采用 str.length 方法来获取。

    var str = new String("hello");
    str.length // 返回 5;
    typeof str // 返回 'object'

    用字面量的方式来获取字符串的长度(length)。当你再用 typeof 来获取它的类型时,收到的结果仍然是字符串,而不是对象。

    var str = "hello";
    str.length // 返回 5
    typeof str // 返回 'string'

    **boolean 布尔:你分得清真假吗?**
    ![图片](https://y0peoube0q.feishu.cn/space/api/box/stream/download/asynccode/?code=MTZkNTliMGY4N2NhYWQ1ZWM1MmFmZDYyMjhiYTE5ZTJfemU3ZDhucUpubFhxdUtxVDFFMjJ1T0lzTVhvNUhjelFfVG9rZW46Ym94Y25RM05xQXd0eFZIN1Vxd2ZUQmw3MVVWXzE2NzQ2NTc4NTE6MTY3NDY2MTQ1MV9WNA)
    **null:什么,你是个对象?**
    可当我们用 typeof 来获取 null 的种类时,返回的结果是’object’,也就是说它是属于对象类型。
    那我们要如何判断一个值是不是 null 呢?解决这个问题方法,其实就是不用 typeof,而是直接将值和null做严格比较。
    除了 null 以外,另外一个和它类似的是 undefined。如果说 null 代表值是空对象,undefined 代表的就是没有值。但是当我们对比它们的值时,它们却是相等的;另外严格比较它们的数据类型的时候,又会发现它们是不同的。

    null == undefined // 返回 true
    null === undefined // 返回 false

    那么我们什么时候用 undefined,什么时候用 null 呢?通常我们是不用 undefined 的,而是把它作为系统的返回值或系统异常。比如当我们声明了一个变量,但是没有赋值的情况下,结果就是 undefined。而当我们想特意定义一个空的对象的时候,可以用 null。
    **对象类型**
    **为什么基于对象创建的实例 instanceOf 返回错误?**
    创建一个对象,既可以通过字面量也可以通过 constructor 的模式
    Object.create() 的话,这样的情况下,你没法用 instanceOf 来判断新的实例属于哪个对象。因为这里的两个对象间更像是授权而不是继承的关系,之间没有从属关系,所以返回的是错误。而通过经典的基于原型的继承方式创建的实例,则可以通过 instanceOf 获取这种从属关系。
    如下示例:

    // 方式1:字面量
    var objA = {name: "Object A"};
    var objB = Object.create(objA);
    console.log(objB instanceof objA); // 返回 类型错误

    // 方式2:constructor
    var objA = new Object();
    objA.name = "Object A";
    var objB = Object.create(objA);
    console.log(objB instanceof objA); // 返回 类型错误

    // 经典的基于原型的继承
    var objA = function() {
    / more code here /
    }
    objB = new objA();
    console.log(objB instanceof objA); // 返回 true

Day 10 JS有哪8种数据类型,你需要注意什么?_第3张图片

你可能感兴趣的:(前端javascript)