基本数据类型(7种)
ES5 5种
Number
(在数值类型中,存在一个特殊值NaN
,意为不是数值)String
Boolean
undefined
(typeof(undefined)
返回undefined
)Null
(逻辑上讲,null值表示一个空对象指针
,这也是typeof(null)
返回'object'
的原因)
ES6 新增1种
Symbol
: 独一无二的值
ES10 新增1种
BigInt
: 任意大的整数 (BigInt目前是第3阶段提案)
创建BigInt的两种方法:
- 在整数的末尾追加n即可 (如:9007199254740995n)
- 调用BigInt()构造函数 (如:BigInt("9007199254740995"))
引用数据类型 (5种常用)
Object
Array
function
Date
RegExp
Set
Map
存储区别
基本数据类型
:直接存储在栈
内存中,占据空间小
,大小固定
,属于被频繁使用
的数据。引用数据类型
:指针
存在栈
中,将值
存在堆
中,占据空间大
,大小不固定
。
堆(heap)和栈(stack)的区别
-
栈: 是一种
连续储存
的数据结构,具有先进后出后进先出
的性质。通常的操作有入栈(压栈),出栈和栈顶元素。想要读取栈中的某个元素,就是将其之间的所有元素出栈才能完成。
-
堆: 是一种
非连续
的树形储存数据结构
,具有队列优先,先进先出
。每个节点有一个值,整棵树是经过排序的。特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。常用来实现优先队列,存取随意。
js数据类型判断
1、Boolean()
所有基本类型中Boolean值是false的只有6个,分别是 : 0, NaN, ' ', null, undefined, false; 引用类型Boolean值全是true.
2、逻辑运算符
- && 与
- || 或
- ! 非
3、 数据类型判断
typeof
: 返回一个数据类型的字符串instanceof
:返回布尔值
,检测构造函数的prototype
属性是否出现在某个实例对象的原型链上(可以准确的判断一个引用数据类型)- constructor
Object.prototype.toString.call()
使用 Object 对象的原型方法 toString 来判断数据类型
typeof 对于基本数据类型判断是没有问题的,但是遇到引用数据类型(如:Array)是不起作用
console.log(typeof 2); // number
console.log(typeof null); // object
`instanceof` 只能正确判断引用数据类型 而不能判断基本数据类型,其内部运行机制是判断在其原型链中能否找到该类型的原型
console.log([] instanceof Array); // true
console.log(function(){} instanceof Function); // true
console.log({} instanceof Object); // true
constructor 似乎完全可以应对基本数据类型和引用数据类型 但如果声明了一个构造函数,并且把他的原型指向了 Array 的原型,所以这种情况下,constructor 也显得力不从心
console.log((true).constructor === Boolean); // true
console.log(('str').constructor === String); // true
console.log(([]).constructor === Array); // true
console.log((function() {}).constructor === Function); // true
console.log(({}).constructor === Object); // true
console.log((2).constructor === Number); // true
Object.prototype.toString.call() 完美的解决方案,可以通过toString() 来获取每个对象的类型,
`Object.prototype.toString.call()` 使用 Object 对象的原型方法 toString 来判断数据类型:
var a = Object.prototype.toString;
console.log(a.call(2));
console.log(a.call(true));
console.log(a.call('str'));
console.log(a.call([]));
console.log(a.call(function(){}));
console.log(a.call({}));
console.log(a.call(undefined));
console.log(a.call(null));
补充:基本数据类型赋值的时候 赋的是具体的值 引用数据类型传的是地址,一个变另一个跟着变
js数据类型的转换
常见的类型转换:
强制转换
(显式转换
)自动转换
(隐式转换
)
强制转换(显式转换)
Number()
parseInt()
(解析一个字符串并返回指定基数的十进制整数)parseFloat()
(转为浮点数)String()
或者.toString()
Boolean()
toFixed(num)
方法可把 Number 四舍五入为指定小数位数的数字
注意:null
、undefined
没有.toString方法
自动转换(隐式转换)
有两种发生隐式转换的场景:
比较运算
(==、!=、>、<)、if
、while
需要布尔值地方算术运算
(+、-、*、/、%)
js数据之间的比较
-
Object.is()
在===基础上特别处理了NaN,-0,+0,保证-0与+0不相等,但NaN与NaN相等
-
== 等于操作符(会做类型转换)
-
=== 全等操作符 (即判断类型也判断值)