MDN定义
根据最新的 ECMAScript 标准,js数据类型定义了8种,包括7种基本数据类型也有人称为原始数据类型、值类型和对象(Object)
让我来简单记录一下js基本数据类型:
-
undeifined
- 变量被定义初始值是undefined
var m; console.log(m) //undefined - 函数没有指定返回值默认返回undefined
function fn(){} console.log(fn) //undefined - 转换成数字
Number(undefined) //NaN - 全局对象一属性
- 变量被定义初始值是undefined
-
null
-
变量定义的时候可以赋值为null
var m = null -
清除堆内存
function fn(){...} fn = null; var obj = {} obj = null -
转换成数字
Number(null) //0 -
不是全局对象的属性
-
注意
typeof null //‘object’
-
-
Boolean 布尔
- 大多在逻辑判断中使用
- fasle的表现形式
空字符串:“”、‘’、``
数字:0 undefined
null
false
...
-
Symbol 唯一值
- 常见使用方法
- 给对象设置一个symbol()属性:唯一属性,减少属性冲突上的处理
let x = Symbol(); let symbolObj = { [x]: 'symbol' } console.log(symbolObj[x]) //'symbol' - 宏观管理一些唯一的标识的时候,也是使用唯一值
let sym = Symbol('only')
- 给对象设置一个symbol()属性:唯一属性,减少属性冲突上的处理
- 注意
- 不能使用new
new Symbol()//Uncaught TypeError: Symbol is not a constructor - 它每次都会创建一个新的 symbol类型
Symbol('only') == Symbol('only') //false
- 不能使用new
- 常见使用方法
-
BigInt 大数
- Number.MAX_SAFE_INTEGER 9007199254740991 最大安全数字
- Number.MIN_SAFE_INTEGER -9007199254740991 最小安全数字
- 当超过这个数字的时候,js计算会出现偏差,这时变需要使用BigInt
console.log(9007199254740991+10) //9007199254741000 console.log(BigInt(9007199254740991)+BigInt(10)) //9007199254741001n - 用法
1、BigInt(val)
2、在数字后边直接加上n:[val]n - 使用场景:
大型项目中,服务器返回给客户端的数据可能出现大数【服务端可以给予longint存储,这个值可能出现大于最大安全数的情况】
-
Number 数字
- NaN:not a number,不是一个有效数字
console.log(typeof NaN) //number- NaN和本身不相等
console.log(NaN == NaN) //false - 检测一个变量是否为NaN
- isNaN(value):检测当前值是否为非有效数字(NaN),是NaN返回true,反之返回false
console.log(isNaN(NaN))//true
console.log(isNaN(1))//false - Object.is(value1,value2):方法判断两个值是否为同一个值。
console.log(Object.is(NaN,NaN)) //true
- isNaN(value):检测当前值是否为非有效数字(NaN),是NaN返回true,反之返回false
- 出现NaN的情况:不部分为把其他数据类型转换成Number数据类型
- 显示转换:Number(value) / parseInt(value)、parseFloat(value)
- 隐式转换
- 数学运算
- 基于“==”号进行比较的时候
- isNaN(value)
- NaN和本身不相等
- Infinity:无穷大;-Infinity:无穷小
超出 1.7976931348623157E+103088 的数值即为Infinity,小于 -1.7976931348623157E+103088 的数值为无穷小
console.log(Infinity) //number
console.log(typeof Infinity) //number
- NaN:not a number,不是一个有效数字
-
String 字符串
- 表现形式
- ""双引号
- ''单引号
- ``模版字符串
- 把其他值转换成字符串
- 显示转换:String(value) / value.toString()
- 隐式转换
- 加号+除了会产生数学运算还会产生字符串拼接
let n = '10', m = 10;
- 表现形式
-
"+"在存在两边的情况下,如果一边存在字符串,那么会变成字符串拼接
console.log(m + n) //'1010'
console.log(n + m) //'1010' -
"+"只存在一边,会转换成数字
console.log(+n) //10 -
"++"只有一边,先转换成数字再自身累加1
console.log(++n) //'11'- 延伸“i=i+1和i++/++i的区别”
- 当i为数字的时候没有区别
- 当i为字符串的时候i=i+1会进行字符串拼接,i++/++i会先进行一步数字转换,即先把i转换成数字Number
- 延伸“i=i+1和i++/++i的区别”
-
“+”在存在两边的情况下,如果一边是对象,那么可能变成字符串拼接
10+{} //'10[object Object]'
10+[10] //'1010'- 特殊情况:
1、10+New Number(10)//20{}+10 / {name:1}+10 //10
说明:
1、此情况下需在控制台中直接打印,不能在js文件中输出
2、代码不能用“()”包裹
3、浏览器认为{}是代码块,计算+'10',但是如果加上()包裹,或者赋值let a= {}+10,从语法分析上要参加到运算中
- 对象在做数学运算时的底层机制:
1、检测对象的Symbol.toPrimitive,如果有,则基于这个值进行计算,如果没有进行第二步2、检测对象有没valueOf()这个值(原始值),如果有责基于这个值进行计算,如果不是原始值,进行第三步const obj = { [Symbol.toPrimitive]: function (hint) { //hint 记录浏览器识别出来的 default/string/... console.log(hint) return 10 } } console.log(10 + obj) //20 const obj1 = { [Symbol.toPrimitive]: function (hint) { //hint 记录浏览器识别出来的 default/string/... console.log(hint) return '10' } } console.log(10 + obj) //'1010'
console.log(10 + new Number(10)) //20
(new Number(10)).valueOf() //10
3、检测对象的toString(),把其变为字符串,如果是‘+’处理,则变成字符串拼接,4、如果最后想变成数字,则再把字符串转换成数字即可console.log(m + { value: 10 })//`10[object Object]` ({value:10}).toString() //'[object Object]'
- 特殊情况:
-
- 加号+除了会产生数学运算还会产生字符串拼接
- 表现形式
这就是一些js数据基本类型的简单整理。