乐趣区

关于前端:Day-10-JS有哪8种数据类型你需要注意什么

原始类型(Primitive Type)和对象类型(Object Type)
原始数据类型蕴含了数字、布尔、字符串、BigInt、null、undefined,以及起初新增的 symbol,这个数据类型的值都是不可变的(immutable)。
对象数据类型则蕴含咱们常常说的对象,对象的值是可变的(mutable)。它是一个大类,如果再细分,它又蕴含了咱们罕用的数组(array)、函数(function)、Date、RegExp,以及起初新增的 Map 和 Set。

原始类型 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)。

因为把十进制转化为二进制的算法是用十进制的小数乘以 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

退出移动版