请你讲⼀讲JavaScript有哪些数据类型,数据类型判断有哪些⽅法?js的8种数据类型JavaScript中有8种数据类型, 包括基本数据类型(number, string, boolean, null, undefined, symbol, bigint)和引⽤数据类型object numberJavaScript中的整数和浮点数都会按照浮点数的标准进⾏存储.即64个⼆进制位, 从最左边开始:第1位: 符号位, 0表⽰正数, 1表⽰负数第2到第12位: 存储指数部分第13到第64位: 存储⼩数部分其中, 符号位决定⼀个数是正数还是负数, 指数部分决定了⼀个数的⼤⼩, ⼩数部分决定了⼀个数的精度数值精度JavaScript提供的有效数字最长为53个⼆进制位, 这意味着绝对值⼩于2的53次⽅的整数都能够精确表⽰JavaScript内部实际的表现形式:(-1)^符号位 * 1.xxx...xxx * 2^指数Math.pow(2, 53) === Math.pow(2, 53) + 1数值范围指数部分的最⼤值是2047(2^11 - 1), 分出⼀半表⽰负数, 那么JavaScript能够表⽰的数值范围为21024到2(-1023)Number.MAX_VALUE和Number.MIN_VALUE代表js可表⽰的最⼤数字和最⼩数字当⼀个浮点值⼤于(⼩于)js所能表⽰的最⼤(最⼩)值时, 其结果是Infinity(-Infinity), 12/0返回Infinity, -12/0返回-InfinityNaNNaN表⽰not a number(⾮数字), NaN和任何值都不相等, 包括它⾃⼰. 所以x != x当且仅当x是NaN时成⽴. 0/0会返回NaN Number.isNaN(Number.NaN)x != x 可以⽤来检测x是否是NaNNumber.isFinite()可以⽤来检测Number.NaN和Infinity.bigintbigint可以使⽤任意精度表⽰整数. 即使超出js的安全数, 也可以安全地存储和使⽤⼤整数bigint不能表⽰⼩数BigInt(123)stringjs中的字符串是不可变的, str.length可表⽰字符串的长度基本数据类型字符串它不是对象, 却能够使⽤对象才有的属性和⽅法进⾏操作(⽐如str.length, str.split('-')), 这是因为三个关键的基本数据类型都有⾃⼰对应的对象(Number, String和Boolean). 这三个对象是针对数字, 字符串和布尔值的包装.当我们在对象环境中使⽤字符串时(⽐如使⽤str.length), JavaScript会为这个字符串内部地创建⼀个String对象, 这个对象就代替了原始的字符串值来执⾏相应的操作. 注意此时被创建的String对象只是瞬时存在的, 使⽤之后系统就会⾃动将其丢弃.booleannull, undefined, 0, -0, NaN, ''都可以转成falsenull和undefinednull == undefined会返回true, null === undefined会返回falsesymbolsymbol代表独⼀⽆⼆的值let s = Symbol(); // 这样就⽣成了⼀个唯⼀不可变的值let s1 = Symbol('s1'); // 参数表⽰对symbol值的描述let s2 = Symbol('s1'); // s1 == s2会返回falselet a1 = Symbol.for('aa');let a2 = Symbol.for('aa'); // a1 === a2会返回true⽤symbol作为对象的属性名时, 不能通过点去访问属性, 通过点访问, js会将属性名解析成字符串JSON中⽆法存储Symbol类型的值不可枚举: 当Symbol值作为对象属性名时, 可以保证对象不会出现重复的属性, for in等⽅式⽆法枚举Symbol值出来, 可以调⽤Object.getOwnPropertySymbols()获取Symbol值. 借助Symbol的不可枚举特性可以在js中模拟私有变量object对象是通过调⽤特殊的构造函数创建的, 常常要使⽤到的对象有以下:function: JavaScript的函数是具有可执⾏代码的对象, 可以通过调⽤函数执⾏某些操作arrayclassDate⽇期RegExp正则表达式匹配所有中⽂字符, 匹配邮箱Math数学Math.ceil(), Math.floor()Math.round(), Math.random()JSONnull, NaN, Infinity, -Infinity, 正则对象和undefined都会被转成nullJSON.parse(JSON.stringify())Error: 程序中发⽣的语法错误和运⾏时错误的对象数据类型判断typeof对于⾮object的基本类型, 除null以外, 均可返回意料之中的结果对于引⽤类型, 除function以外, ⼀律返回object对于null, 返回object对于function, 返回functiontypeof(typeof a)返回的是string因为typeof NaN会返回number, 但是NaN不能⽤于数值计算, 所以在使⽤typeof判断数字时, 建议这样⼦做: typeof num == 'number' && Number.isFinite(num)instanceofA instanceof B是⽤来判断B的原型是否在A的原型链上instanceof的问题在于它假定只有⼀个全局执⾏环境, 如果存在两个及以上的全局执⾏环境, 那么就存在不同的构造函数, 此时instanceof⽆法进⾏判断Object.prototype.toString.callObject.prototype.toString.call(true) === '[object Boolean]'constructor当声明定义⼀个构造函数时, js会为构造函数添加⼀个prototype属性指向构造函数的原型对象, 这个原型对象会有⼀个constructor属性指向构造函数. ⽽当使⽤new和构造函数创建⼀个实例对象时, 实例对象会继承原型对象的constructor属性let a = [], b = 100;a.constructor == Arrayb.constructor == Number当程序员重写prototype指向之后, 原来的constructor就会丢失使⽤JavaScript写⼀个判断数据类型的函数function getType(data) {if(data === null) return 'Type: null';else if(data === undefined) return 'Type: undefined';else if(typeof data == 'number' && Number.isFinite(data)) return 'Type: number';else if(typeof data == 'string') return 'Type: string';else if(typeof data == 'boolean') return 'Type: boolean';else if(typeof data == 'function') return 'Type: function';else {let tmp = Object.prototype.toString.call(data);return 'Type:' + tmp.slice(7, tmp.length-1).toLowerCase();}}。