今天来讲一下JS的数据类型,很多人都知道有6种,其实是7种了,ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。它是javascript语言的第七种数据类型。
一个变量可以存放两种类型的值,基本类型的值和引用类型的值。
Undefined: // 没有定义的值,表示变量没有值(只有一种特殊的值是Undefined)
Null: // 空值(null表示一个空对象指针,所以typeof(null)会返回object)
Boolean: // 布尔值(值有2种可能,一种是true,一种是false,注意:true不等于1,false不等于0)
String: // 字符串(有一个特殊值NaN,表示一个本来要返回数值的操作数未返回数值的情况,注意:任何与NaN有关的运算都返回NaN,而且NaN不等于它本身,比如:NaN == NaN,返回的是false)
Number: // 数值
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不能直接操作独享的内存空间(堆内存)
类型的检测方法
1,typeof(变量)是检测基本类型的最佳工具。会返回基本类型的具体类型,但是如果是Null和对象,则都会返回'object';
2,instanceof(变量)用于检测引用类型,可以检测到引用类型的具体类型,具体的某某某类型的实例,但是返回的是Boolean;
3,通过Object.prototype.toString.call(变量);可以检测到引用类型的具体类型,返回的是一个固定格式的字符串,比如console.log(Object.prototype.toString.call(arr)); // '[Object Array]'