js的数据类型分为:基本类型和引用(复杂)类型2大类。
1. 基本类型:存放在栈(stack)内存中的简单数据段:(Undefined、Null、Boolean、Number 和 String)
- 数值类型:整数和浮点数
- 字符串类型:用引号括起来,可以双引号,也可以单引号
- 布尔类型:true和false
- undefined类型:确定一个已经声明但是还没有赋值的变量
- null类型:表明某个变量的值为空。
按值访问的,因为可以直接操作保存在变量中的实际值。示例:
var a = 10;
var b = a;
b = 20;
console.log(a); // 10值
上面b只是保存了a复制的一个副本。所以,b的改变,对a没有影响。
2. 引用类型:即存放在堆(heap)内存中有多个值构成的对象:(Object,Array,Function)
变量实际保存的是一个指针,这个指针指向另一个位置,不可以直接访问堆内存空间中的位置和操作堆内存空间。只能操作对象在栈内存中的引用地址。所以,引用类型数据在栈内存中保存的实际上是对象在堆内存中的引用地址。通过这个引用地址可以快速查找到保存中堆内存中的对象。
var obj1 = new Object();
var obj2 = obj1;
obj2.name = "我有名字了";
console.log(obj1.name); // 我有名字了
// 说明这两个引用数据类型指向了同一个堆内存对象。obj1赋值给onj2,实际上这个堆内存对象在栈内存的 引用地址复制了一份给了obj2,
// 但是实际上他们共同指向了同一个堆内存对象。实际上改变的是堆内存对象。
区别:
1)、基本类型会将原始值的副本赋值给新变量,此后这两个变量是完全独立的,他们只是拥有相同的value而已。
2)、引用类型会把存在栈中的内存地址赋值给新变量(多了一个指针)。但这两个变量都指向了堆内存中的同一个对象,因此,改变其中任何一个变量,都会相互影响。
typeof 123 //Number
typeof 'abc' //String
typeof true //Boolean
typeof undefined //Undefined
typeof null //Object
typeof { } //Object
typeof [ ] //Object
typeof console.log() //Function
null类型进行typeof操作符后,结果是object,原因在于,null类型被当做一个空对象引用。