ECMAScript中有5种简单数据类型(也称为基本数据类型):Undefined、Null、Boolean、Number和String。还有1种复杂数据类型——Object,Object本质上是由一组无序的名值对组成的。ECMScript不支持任何创建自定义类型的机制,而所有值最终都将是上诉6中数据类型之一。乍一看,好像只有6种数据类型不足以表示所有数据;但是,由于ECMScript数据类型具有动态性,因此的确没有再定义其他类型的必要了。
赋值:
对于5种基本数据类型,相互赋值,是直接值传递的。如下:
var a = 1;
var b = a;
a = 2;
alert(b); // 1,值未变 var str1 = "aaa";
var str2 = str1;
str1 = "bbb";
alert(str2); // aaa,值未变
但对于复杂数据类型Object,直接赋值,结果是引用传递。如下:
var array1 = [1, 2, 3];
var array2 = array1;
array1[0] = 100;
alert(array2); // [100, 2, 3],值跟着array1改变 var obj1 = {"a":1};
var obj2 = obj1;
obj1["a"] = 2;
alert(obj2); // {"a":2}, 值跟着obj1改变
开发中经常会遇到对象间赋值,只用做到值传递,如何实现呢?
这里用到的方法是:Object.assign(),该方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
见如下代码:
// 数组
var array1 = [1, 2, 3];
var array2 = Object.assign([], array1);
array1[0] = 100;
console.log(array2); // [1, 2, 3],值未变 // 对象
var obj1 = {"a":1};
var obj2 = Object.assign({}, obj1);
obj1["a"] = 2;
console.log(obj2); // {"a":1}, 值未变