在Javascript中变量是松散类型的,也就是说,变量可以保存任何类型的的数据。从数据在内存中的存储方式来看,Javascript的数据类型可以分为基本数据类型和引用数据类型。基本数据类型又叫原始数据类型或简单数据类型,引用数据类型又叫复杂数据类型。
基本数据类型
JavaScript 语言基本数据类型有六种,分别是:Undefined、Null、布尔值(Boolean)、字符串(String)、数值(Number)、Symbol。
基本数据类型值指保存在栈内存中的简单数据段。
基本数据类型的值按值访问的,且这个值是不能改变的。这里有点想不通,那我们以下面代码为例来阐述吧
var str = '123tomato456';
var b = str.toUpperCase();
console.log(str);//123tomato456
console.log(b);//123TOMATO456
str = '789user000';//789user000
console.log(str);
首先这代码第条语句 var str = '123tomato456'
,变量是str
,值是123tomato456
,值‘123tomato456’永恒不会变的,str.toUpperCase()
返回的是 123tomato456
的一个转换为大写的副本,并没有改变原来123tomato456
,当执行 str = '789user000'
时,程序也没有改变123tomato456
而是给str
变量赋予了一个新的值。
基本数据类型值指保存在栈内存(Stack)中,操作的是变量实际保存的值
var a = 1;
var b = a;
a = 2;
console.log(a);//2
console.log(b);//1
在栈内存中会保存两条记录 a >>> 1
和 b >>> 1
。
上面的代码图解过程为:
引用数据类型
JavaScript 语言引用数据类型是指保存在堆内存中的对象,所有的复杂结构数据都是由object类型衍生而来,无论是数组,还是函数,都属于引用数据类型
引用数据类型值指保存在堆内存中。 引用数据类型变量保存的实际上的是一个指针,这个指针指向堆内存内存中的另一个位置,该位置保存着对象。访问方式是按引用访问。
如:
var a = 1,b = ' string'
var obj = {
name : "Tom",
age : 10,
body : {
head : 1,
hand : 2,
foot : 2
}
};
var fun = function(param) {
alert(param);
};
引用类型变量的复制,复制的是存储在栈内存中的指针,这个指针指向堆内存中的同一个对象。
var a = {
name:'tomato',
age:28
}
var b = a;
b.age = 30;
console.log(a.age);//30