js的基本类型和引用类型

184 阅读3分钟

今天来讲一下JS的数据类型,很多人都知道有6种,其实是7种了,ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。它是javascript语言的第七种数据类型。
一个变量可以存放两种类型的值,基本类型的值和引用类型的值。

Undefined: // 没有定义的值,表示变量没有值(只有一种特殊的值是Undefined)
Null: // 空值(null表示一个空对象指针,所以typeof(null)会返回objectBoolean: // 布尔值(值有2种可能,一种是true,一种是false,注意:true不等于1false不等于0String: // 字符串(有一个特殊值NaN,表示一个本来要返回数值的操作数未返回数值的情况,注意:任何与NaN有关的运算都返回NaN,而且NaN不等于它本身,比如:NaN == NaN,返回的是falseNumber: // 数值
Object: // 对象
Symbol: // 独一无二的值


一,基本类型

约定:基本数据类型与原始数据类型等意。

JavaScript种共有6种基本数据类型:Undefined, Null, Boolean, String, Number, Symbol

基本数据类型的值是可以按值访问的,操作的是他们实际保存的值。
复制的时候,复制的是这个值,栈中会自动创建一个新的位置给复制出来的值保存起来,复制之后的值和之前的值没有关系了。
特点:

// 1,基本类型的值是不可变的;
var str = '123duibuqizhibi321';
str.toUpperCase(); // 123DUIBUQIZHIBI321
console.log(str); // 123duibuqizhibi321

// 2,基本类型的比较是它们的值的比较;
// 虽然a与b数据类型不同,但是他们都是基本类型,可以比较,
// '==' => 只进行值的比较
// '===' => 不仅仅进行值的比较,还要进行数据类型的比较,二者比较都是true才会返回true
var a = 1; // Number数据类型
var b = true; // Boolean数据类型
console.log(a == b); // true
console.log(a === b); // false

// 3,基本类型的变量是存放在栈内存(Stack)里的;
// 栈内存中包括了变量的标识符和变量的值
var a, b;
a = 'duibuqizhibi';
b = a;
console.log(a); // duibuqizhibi
console.log(b); // duibuqizhibi
a = '对不起之笔'; // 改变了a的值,但不影响b的值
console.log(a); // '对不起之笔'
console.log(b); // duibuqizhibi

二,引用类型

除了基本类型剩下的都是引用类型了,统称为Object类型。包括基本包装类型,也是一种引用类型:BOOlean、Number、String。

Object // 对象类型
Array // 数组类型
Date // 日期时间类型
RegExp // 正则对象数据类型
Function // 方法类型
Boolean // 和布尔值对应的引用类型,可以通过new创建Boolean对象
Number // 和基本数据类型的数值对应的引用类型,可以通过new创建Number对象
String // 字符串对象的引用类型,可以通过new创建String对象

引用类型的值是可以按引用访问的。访问的是他们在栈内存里的内存地址,不管值怎么变,最后返回来的一定是这个内存地址里的值。
复制的时候,复制的是这个地址,而不是这个值。
特点:

// 1,引用类型的值是可变的

// 2,引用类型的比较是引用的比较

// 3,引用类型的值是保存在堆内存中的对象
// 与其他编程语言不通,JavaScript不能直接操作独享的内存空间(堆内存)

类型的检测方法

1typeof(变量)是检测基本类型的最佳工具。会返回基本类型的具体类型,但是如果是Null和对象,则都会返回'object'2instanceof(变量)用于检测引用类型,可以检测到引用类型的具体类型,具体的某某某类型的实例,但是返回的是Boolean3,通过Object.prototype.toString.call(变量);可以检测到引用类型的具体类型,返回的是一个固定格式的字符串,比如console.log(Object.prototype.toString.call(arr)); // '[Object Array]'