数据可以分为原始数据类型和引用数据类型
栈:原始数据类型(Undefined、Null、Boolean、Number、String)
堆:引用数据类型(对象、数组和函数)
1、原始数据类型有哪些?
Number(NaN是其中的特殊数值)、String、Boolean、Null、Undefined、Symbol、BigInt
undefined
:Undefined 类型只有一个值,就是特殊值 undefined。当使用 var或 let声明了变量但没有初始化时,就相当于给变量赋予了 undefined值。
String
:字符串是不可变的,一旦创建了,值就不能改变了。
Null
:null值表示的是一个空对象指针,给typeof传一个null会返回object的原因。
Boolean
:布尔类型有两个字面量:true和false。
Symbol
:(ES6新增加的)创建独一无二且不可变的数据类型,主要是为了解决可能出现的全局变量冲突的问题。
BigInt
:是一种数字类型的数据,可以表示任意精度格式的整数。用于安全的存储和操作大数据。
2、引用数据类型有哪些?
Object(对象)、Array(数组)、function(函数)、RegExp(正则表达式)、Date(日期)
Object
:创建object常用方式为对象字面量表示法,属性名可以是字符串或数值。
在Symbols
出来之前,对象的键只能是String
。如果尝试用非字符串作为对象的键,该值会被强制转换为String。所以当采用数字作为对象的键值属性的时候,必须采用中括号的形式,但如果是字符串的话既可以用.
也可以用[]
let person = { name: 'haha', age: 11, 1: 222 }; let name1 = person.name;//haha let name2 = person["name"];//haha let num1 = person[1];//222 let num2 = person["1"];//222
Array
:数组中每个槽位可以存储任意类型的数据。并且,数组也是动态大小的,会随着数据添加而自动增长。
3、js中的类型转换机制
Number()
原始值 | 转换结果 |
---|---|
undefined | NaN |
Null | 0 |
true | 1 |
false | 0 |
String | 0 |
Symbol | 报错 |
Object | 0 |
console.log(Number('aa111'))//NaN
console.log(Number('111'))//111
注:只要有一个字符无法转换为数值,整个字符串就会变为NaN
parseInt()
:
parseInt相比Number,就没那么严格了,parseInt函数逐个解析字符,遇到不能转换的字符就停下来
Boolean()
:
数据类型 | 转换为true的值 | 转换为false的值 |
---|---|---|
String | 非空字符串 | “” |
Number | 非零数值 | 0、NaN |
Object | 任意对象 | null |
undefined | 不存在 | Undefined |
自动转换为字符串
常发生在+运算中,一旦存在字符串,则会进行字符串拼接操作
自动转换成数值
除了+有可能把运算子转为字符串,其他运算符都会把运算子自动转成数值
4、==和===的区别
==
:
- 会进行隐式转换
- 两个都为简单类型,字符串和布尔值都会转换成数值,再比较
console.log('1' == true)//true console.log('1' == 1)//true console.log('aa' == 'aaa') console.log(undefined == '') // false console.log(null == '') // false console.log(null == undefined) // true
- 如果是引用类型,判断他们是否指向同一个对象
- 存在NaN就返回false
console.log(NaN == undefined)//false
console.log(NaN == '')//false
console.log(NaN == 0)//false
===
:
- 只有在两个操作数不转换的前提下相等才返回
true
- undefined===null