基本数据类型(7种)
ES5 5种
Number(在数值类型中,存在一个特殊值NaN,意为不是数值)StringBooleanundefined(typeof(undefined)返回undefined)Null(逻辑上讲,null值表示一个空对象指针,这也是typeof(null)返回'object'的原因)
ES6 新增1种
Symbol: 独一无二的值
ES10 新增1种
BigInt: 任意大的整数 (BigInt目前是第3阶段提案)
创建BigInt的两种方法:
- 在整数的末尾追加n即可 (如:9007199254740995n)
- 调用BigInt()构造函数 (如:BigInt("9007199254740995"))
引用数据类型 (5种常用)
ObjectArrayfunctionDateRegExpSetMap
存储区别
基本数据类型:直接存储在栈内存中,占据空间小,大小固定,属于被频繁使用的数据。引用数据类型:指针存在栈中,将值存在堆中,占据空间大,大小不固定。
堆(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相等
-
== 等于操作符(会做类型转换)
-
=== 全等操作符 (即判断类型也判断值)