JavaScript的数据类型?存储上的差别?数据类型的判断?数据类型的转换?数据类型相比较?

14 阅读3分钟

基本数据类型(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 四舍五入为指定小数位数的数字

注意:nullundefined没有.toString方法

自动转换(隐式转换)

有两种发生隐式转换的场景:

  • 比较运算(==、!=、>、<)、ifwhile 需要布尔值地方
  • 算术运算(+、-、*、/、%)

js数据之间的比较

  • Object.is()

    在===基础上特别处理了NaN,-0,+0,保证-0与+0不相等,但NaN与NaN相等

  • == 等于操作符(会做类型转换)

  • === 全等操作符 (即判断类型也判断值)