前言
面试官:“你讲一下JS的数据类型吧。” 我:"Number、String、Array、Object…,记不起来了,平常只是在用,没怎么注意。"我不知道有没有道友遇到过和我我一样的情况,反正这就是我曾经面试的真实经历,这次血的教训告诉我,面试是真的要准备的,面经还是要背的,不然倒在这种问题上就是真的是活该了,没错,我就是活该。
数据类型
ECMAScript
有6种简单数据类型:Undefined、Null、Boolean、Number、String、Symbol,其中Symbol(符号)是ES6新增的,还有一种复杂类型叫Object。
Undefined
Undefined类型就只有一个值undefined,表示一个变量声明了,但是没有初始值。
let a
console.log(a) // undefined
console.log(a === undefined) // true
有一点需要注意的是,没有声明的变量和声明了没有初始值的变量是有区别的,但是使用typeof
判断的结果又都是undefined
let a
console.log(a) // undefined
console.log(b) // Uncaught ReferenceError: b is not defined
console.log( typeof a) // undefined
console.log(typeof b) // undefined
Null
Null类型同样只有一个值,那就是特殊值null,可以显示的为一个对象赋值为null,表示一个空对象指针。需要注意的是typeof null 的结果是object,而不是null,这是一个历史悠久的bug,但是由于影响的地方太多了,所以一直没有修复(Javascript中的基本数据类型存储在32位的二进制单元中,低位的000表示对象,而null的二进制为全0,所以被判定为null)
let a = null
console.log(a) // null
console.log(typeof null) // object
Boolean
Boolean值有两个值,true和false,分别表示真假,虽然Boolean值只有两个,但是其他的数据类型都有相应布尔值的等价形式。
// 可以转化为true: 非空字符串、非零数值、任意对象、N/A
// 可以转化为false: 空字符串、0、NaN、null、undefined
console.log(Boolean('1111')) // true
console.log(Boolean(111)) // true
console.log(Boolean({})) // true
console.log(Boolean('')) // false
console.log(Boolean(0)) // false
console.log(Boolean(NaN)) // false
console.log(Boolean(undefined)) // false
console.log(Boolean(null)) // false
Number
Number数据类型需要注意的有以下几点:
1.Js中能表示的最大值为Number.MAX_VALUE,最小值为Number.MIN_VALUE,一旦超出这个范围之后,这个数值分别会被转化为Infinity(正无穷)和-Infinity(负无穷),之后就无法进行任何计算
2.NaN:是一个特殊值(Not a Number),用于表示本来要返回数值的操作失败了,比如:
console.log(0/0) // NaN
console.log(5/0) // Infinity 比较冷门
3.数值转化,JS提供了3个将非数值转化为数值的函数:Number
、parseInt
、parseFloat
,详细规则如下:
Number转化规则:
1.true --> 1 ,false --> 0
2.数值直接返回
3.null --> 0
4.undefined --> NaN
5.字符串包含数值字符,转化为数字,空字符串转化为0,其他情况转化为NaN
6.对象先调用ValueOf(),在根据结果再转化
console.log(Number('')) // 0
console.log(Number('1233a')) // NaN
console.log(Number('1111')) // 1111
console.log(Number('+0111')) // 11
console.log(Number('a111')) // NaN
parseInt转化规则:z
parseInt专注于字符串是否包含数值
1、数字,保留整数
2.null --> NaN
3.undefined --> NaN
4.字符串 --> 从第一个非空的字符串开始,如果第一个字符不是数值、加号、减号,直接返回NaN
5.还可转换八进制、十六进制,第二个参数表示进制
console.log(parseInt('')) // NaN
console.log(parseInt(null)) // NaN
console.log(parseInt(undefined)) // NaN
console.log(parseInt(true)) // NaN
console.log(parseInt('111a')) // 111
console.log(parseInt('a111')) // NaN
console.log(parseInt('0xAF',16)) // 175
console.log(parseInt('10',8)) // 8
parseFloat转换方法和parseInt基本一致,解析到第一个无效的浮点数为止
console.log(parseFloat('22.333.44')) // 22.333
console.log(parseFloat('0011102.11')) // 11102.11
String
转化为字符串直接调用toString()方法即可,也可调用String(),其实String()方法调用的就是toString方法,需要注意的是null和undefind没有toString法,数值调用toString方法可以传参,表示进制。
console.log(true.toString()) // 'true'
console.log(String(null)) // 'null'
console.log(String(undefined)) // 'undefined'
let num = 10
console.log(num.toString(10)) // '10'
console.log(num.toString(8)) // '12'
console.log(num.toString(16)) // a
Symbol
Symbol是一种通过Symbol函数来生成的独一无二的值,可以作为对象属性名。
const sym = Symbol()
console.log(typeof sym) // symbol
let obj = {}
obj[sym] = 'hahah'
console.log(obj[sym]) // hahah
const sym1 = Symbol()
console.log(sym === sym1) // false
Object
对象就是一组数据和功能的集合,可以通过关键字new
后面跟对象类型来创建。
const obj = new Object()
const arr = new Array()
结语
这就是我总结的数据类型,喜欢就点个赞支持以下吧。