JavaScript数据类型

原始/基本数据类型(7种):

  1. Number

  2. String

  3. Boolean

  4. Undefined:undefined

  5. Null:null

  6. Symbol(ES6)

  7. BigInt(ES10)

引用数据类型(1个):

  • Object

JS 中万物皆对象

原始数据类型的数据直接存储在栈中,引用数据类型的数据存储在堆中,并把数据的起始地址存储在栈中。

undefined

如何得到安全的 undefined?

JS 比较松散,可以定义名为 undefined 的变量,这就导致固有的 undefined 值发生变化。

可以通过 void 获取安全的 undefined

1
void 0;

BitInt

BigInt值的定义:在一个整数字面量后面加 n 或使用构造函数。

1
2
const theBiggestInt = 9007199254740991n;
const alsoHuge = BigInt(9007199254740991);

类型检测

  • typeof

  • instanceof

  • Object.prototype.toString.call()

  • Array.isArray():专门用于检测数组

typeof

检测变量的前 3 位,最多 8 种。跟 JS 的数据类型并不一一对应。

特殊点:

  • 可以检测出 function,可见 JS 中函数的地位很高

  • 检测不出 null,null 表示空对象,检测为 "object",感觉也是合理的。

# 返回值 被检测变量 说明
1 number 数字、NaN NaN
2 string 字符串
3 boolean 布尔值
4 undefined undefined
5 symbol
6 bigint
7 object 非函数对象、null null 也是对象
8 function 函数

返回值是小写字符串。

typeof 的缺点:

  • 不能区分对象和数组
  • 不能判断对象的具体类型

instanceof

判断一个对象的原型链上是否有给定构造函数的原型(prototype)

1
2
3
4
5
6
7
8
9
10
11
12
13
function _instanceof(obj, Fun){
let proto = obj.__proto__;
const prototype = Fun.prototype;
while(proto !== null){
if(proto === prototype){
return true;
}
proto = proto.__proto__;
}
return false;
}

_instanceof(obj, Array);

Object.prototype.toString.call()

检测一个对象的内置类型,返回一个字符串,格式为 [object 对象数据类型]

1
2
3
4
5
6
7
8
// [object String]
Object.prototype.toString.call("hello");
// [object Undefined]
console.log(Object.prototype.toString.call(undefined));
// [object Null]
console.log(Object.prototype.toString.call(null));
// [object Array]
console.log(Object.prototype.toString.call([]));

参考

判断js对象类型的多种方法,附详细说明 - 掘金 (juejin.cn)

JavaScript判断数据类型的几种方式 - 如是。 - 博客园

https://mp.weixin.qq.com/s?__biz=MjM5MDA2MTI1MA==&mid=2649123999&idx=2&sn=9ee48f9b56fbb8e3fbd3f8c420ab5020&chksm=be584b32892fc22479cd1f680a0666c285a2d4bfb70a19e50fa659951b9cefe4130cf28e6b2b&scene=27