请你讲⼀讲JavaScript有哪些数据类型,数据类型判断有哪些⽅
法?
js的8种数据类型
JavaScript中有8种数据类型, 包括基本数据类型(number, string, boolean, null, undefined, symbol, bigint)和引⽤数据类型object number
JavaScript中的整数和浮点数都会按照浮点数的标准进⾏存储.
即64个⼆进制位, 从最左边开始:
第1位: 符号位, 0表⽰正数, 1表⽰负数
第2到第12位: 存储指数部分
第13到第64位: 存储⼩数部分
其中, 符号位决定⼀个数是正数还是负数, 指数部分决定了⼀个数的⼤⼩, ⼩数部分决定了⼀个数的精度
数值精度
JavaScript提供的有效数字最长为53个⼆进制位, 这意味着绝对值⼩于2的53次⽅的整数都能够精确表⽰
JavaScript内部实际的表现形式:
(-1)^符号位 * * 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返回-Infinity
NaN
NaN表⽰not a number(⾮数字), NaN和任何值都不相等, 包括它⾃⼰. 所以x != x当且仅当x是NaN时成⽴. 0/0会返回NaN Number.isNaN(Number.NaN)
x != x 可以⽤来检测x是否是NaN
Number.isFinite()可以⽤来检测Number.NaN和Infinity.
bigint
bigint可以使⽤任意精度表⽰整数. 即使超出js的安全数, 也可以安全地存储和使⽤⼤整数
bigint不能表⽰⼩数
BigInt(123)
string
js中的字符串是不可变的, str.length可表⽰字符串的长度
基本数据类型字符串它不是对象, 却能够使⽤对象才有的属性和⽅法进⾏操作(⽐如str.length, str.split('-')), 这是因为三个关键的基本数据类型都有⾃⼰对应的对象(Number, String和Boolean). 这三个对象是
针对数字, 字符串和布尔值的包装.
当我们在对象环境中使⽤字符串时(⽐如使⽤str.length), JavaScript会为这个字符串内部地创建⼀个String对象, 这个对象就代替了原始的字符串值来执⾏相应的操作. 注意此时被创建的String对象只是瞬时存在的, 使⽤之后系统就会⾃动将其丢弃.
boolean
null, undefined, 0, -0, NaN, ''都可以转成false
null和undefined
null == undefined会返回true, null === undefined会返回false
symbol
symbol代表独⼀⽆⼆的值
let s = Symbol(); // 这样就⽣成了⼀个唯⼀不可变的值
let s1 = Symbol('s1'); // 参数表⽰对symbol值的描述
let s2 = Symbol('s1'); // s1 == s2会返回false
let a1 = Symbol.for('aa');
let a2 = Symbol.for('aa'); // a1 === a2会返回true
⽤symbol作为对象的属性名时, 不能通过点去访问属性, 通过点访问, js会将属性名解析成字符串
JSON中⽆法存储Symbol类型的值
不可枚举: 当Symbol值作为对象属性名时, 可以保证对象不会出现重复的属性, for in等⽅式⽆法枚举Symbol值出来, 可以调⽤
object
对象是通过调⽤特殊的构造函数创建的, 常常要使⽤到的对象有以下:
function: JavaScript的函数是具有可执⾏代码的对象, 可以通过调⽤函数执⾏某些操作
array
class
Date⽇期
json值的类型有哪些RegExp正则表达式
匹配所有中⽂字符, 匹配邮箱
Math数学
JSON
null, NaN, Infinity, -Infinity, 正则对象和undefined都会被转成null
JSON.parse(JSON.stringify())
Error: 程序中发⽣的语法错误和运⾏时错误的对象
数据类型判断
typeof
对于⾮object的基本类型, 除null以外, 均可返回意料之中的结果
对于引⽤类型, 除function以外, ⼀律返回object
对于null, 返回object
对于function, 返回function
typeof(typeof a)返回的是string
因为typeof NaN会返回number, 但是NaN不能⽤于数值计算, 所以在使⽤typeof判断数字时, 建议这样⼦做: typeof num == 'number' && Number.isFinite(num)
instanceof
A instanceof B是⽤来判断B的原型是否在A的原型链上
instanceof的问题在于它假定只有⼀个全局执⾏环境, 如果存在两个及以上的全局执⾏环境, 那么就存在不同的构造函数, 此时instanceof⽆法进⾏判断
String.call
String.call(true) === '[object Boolean]'
constructor
当声明定义⼀个构造函数时, js会为构造函数添加⼀个prototype属性指向构造函数的原型对象, 这个原型对象会有⼀个constructor属性指向构造函数. ⽽当使⽤new和构造函数创建⼀个实例对象时, 实例对象会继承原型对象的constructor属性
let a = [], b = 100;
当程序员重写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 = String.call(data);
return 'Type:' + tmp.slice(7, tmp.length-1).toLowerCase();
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论