JS中的数据类型有下面几种:
-
Undefined
-
Null
-
Boolean
-
Number
-
String
-
Symbol (ES6中新增)
-
Object
其中前六种是基本数据,最后一种是复杂数据类型
但是区别在哪里那?
- 对象可以动态添加属性和方法,而基本数据类型不可以:
// 基本类型 Number
var num1 = 1000;
num1.length = 10;
console.log(num1.length); //undefinded
// 对象类型 Array
var arr1 = [];
arr1.length = 10;
console.log(arr1.length); //10
2.存储方式和赋值操作的方式不同:
-
基本类型:初始化一个值类型实例的时候,实际上是给这个值分配了一个内存空间来保存,当进行赋值操作的时候,新的实例会开辟一块新的内存空间,然后将原来的值
copy
到了这个新的内存空间中; -
引用类型:初始化一个引用类型实例的时候,仅仅是把这个实例的值所在内存空间的引用赋给这个实例,当
copy
给了新的实例对象使,实际上是copy
了对这块内存空间的引用,两个实例对象本质上共用一块内存空间。
// 基本类型 Number
//当num1的值赋给num2,之后再改变num2的值,对num1无影响
var num1 = 1;
var num2 = num1;
num2 = num2 + 1
console.log(num1); // 1
// 引用类型 Array
//当arr1的值赋给arr2,之后再改变arr2的值,arr1的值也同样改变。
//因为arr1和arr2公用同样的数据。
var arr1 = [];
var arr2 = arr1;
arr2.push('oujm')
console.log(arr1); // ["oujm"]
3.对象和包装对象
包装对象(String,Number,Boolean),ECMAScript提供了这三个特殊的引用类型,这三个引用类型和其他的引用类型相似,但同时也具有于各自的基本类型相应的特殊行为,实际上,每当读取一个基本类型的时候,后台就会创建一个对应的基本包装类型的对象。
为了让我们更好的操作基本类型的实例对象,后台进行了一系列的操作:
-
创建String的实例
-
在实例上调用指定的方法
-
销毁这个实例
// var str2 = str1.substring(2) 动作拆解:
var tempStr = new String("oujm");
var str2 = tempStr.substring(2);
tempStr = null;
一般的引用类型和包装类型唯一的区别就在于对象的生命周期。包装类型的对象生命周期很短,只有代码执行的一瞬间,然后就被销毁了,所以这也就是为什么我们不能在运行的时候为基本类型的值添加属性和方法。