在 JavaScript 中,一共有 6 种数据类型(不包含 ES6 新增的 Symbol 和 BigInt )。这 6 种类型可划分为原始数据类型(又称基本数据类型)和引用类型(又称对象类型)。本文对其进行大致的介绍,每个类型具体的使用会在后续几篇文章中进行详细说明。
1.原始类型
字符串(string):文本(比如 Hello World)。
数值(number):整数和小数(比如 1 和 3.14)。
布尔值(Boolean),有 2 个值分别是:true 和 false。
null,一个表明空值的特殊关键字。JavaScript 是大小写敏感的,因此 null 与 Null、NULL 或其他格式的变体完全不同。
undefined,和 null 一样是一个特殊的关键字,undefined 表示“未定义”或不存在。是变量还未赋值时的属性。
对于原始类型来说,它们的值保存在栈中,直接可以进行操作。例如:
var a = 10 ; var b = a ; b = 20 ; console.log(a); // 10
2.引用类型
包含了数组(Array)、对象(object)、函数(function)、日期对象(Date)、正则表达式(RegExp)等。需要注意的是,引用数据类型是保存在栈内存和堆内存中的对象。在 JavaScript 中,你不可以直接访问堆内存中的位置或操作堆内存空间,只能操作对象保存在栈内存中的地址。例如:
var obj1 = {} var obj2 = obj1; obj2.name = "orange"; console.log(obj1.name); //orange
可以看到明明在创建了一个空的 obj1 对象,但是在 obj2 中添加name属性后再次打印 obj1 原先不存在的name属性,也可以打印出来。从下面两张图中可以看到由于 obj2 保存的是 obj1 在堆内存中的地址,所以在其更改时 obj1 自然而然的能打印出name属性 这就是上述提到的引用类型与原始数据类型的区别了。
3.类型判断
在 JavaScript 中,常见的有三种用于判断数据类型的方法
typeof 运算符
该方法一般用来判断基本数据类型,返回数据类型的字符串形式。可以返回 string,number,boolean,symbol,bigint,unfined,object,function 这⼋种类型。Typeof 运算符常用在判断语句中,例如:
if(typeof === 'string'){ console.log('该类型为string类型') }
//举几个typeof运算符的例子: typeof "helloworld"; //"string" typeof 123; //"number" typeof true; //"boolean" typeof undefined; //"undefined" typeof function () {}; //"function" typeof {}; //"object" typeof Symbol(); //"symbol" typeof null; //"object" typeof [1,2,3]; //"object" typeof new Date(); //"object" typeof new RegExp(); //"object" typeof Null //"undefined
这里我们可以看到typeof null === "object"而不是null,这是因为在 JavaScript 中,不同的对象都是使用⼆进制存储的,如果⼆进制前三位都是 0 的话,系统会判断为是 Object 类型,而 null 的⼆进制全是 0,⾃然也就判断为 Object。
instanceof 运算符
该运算符用于判断引用数据类型,判断原始数据类型时基本无效。
可以判断⼀个实例是否属于某种类型
可以判断⼀个实例是否是其⽗类型或者祖先类型
[] instanceof Array; // true [] instanceof Object; // true new Date() instanceof Date // true
Object.prototype.toString.call
该方法是使用了 Object 原型对象上的toString⽅法,该⽅法默认返回其调⽤者的具体类型,返回的格式为为[object,xxx],xxx 是具体的数据类型。其中包括:String, Number,Boolean,Undefined,Null,Function,Date,Array,RegExp 等等基本上所有对象的类型都可以通过这个⽅法获取到。这里简单对其进行介绍,后续文章还会详细说明。以下列举常见数据类型的 Object.prototype.toString 方法返回的值:
数值: Object.prototype.toString.call(123) //"[object Number]" 字符串: Object.prototype.toString.call("a") //"[object String]" 布尔值: Object.prototype.toString.call(false) //"[object Boolean]" undefined: Object.prototype.toString.call(undefined) //"[object Undefined]" null: Object.prototype.toString.call(null) //"[object Null]" 数组: Object.prototype.toString.call([]) //"[object Array]" 日期对象: Object.prototype.toString.call(new Date()) //"[object Date]" 函数: Object.prototype.toString.call(function(){}) //"[object Function]" RegExp对象: Object.prototype.toString.call(new RegExp("ab+c", "i")) //"[object RegExp]"