js数据与类型与数据拷贝

数据类型

s的数据类型有种划分方式为 原始数据类型和 引用数据类型。

原始数据类型 存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。栈区包括了 变量的标识符和变量的值。

引用数据类型 存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存处。放在栈空间中的值是该对象存储在堆中的地址。

基本类型

Undefined、Null、Boolean、Number、String、Symbol

引用类型

Object、Array、Date、RegExp、Function

数据拷贝

基本类型是按值传递,像是这样:在修改a时并不会改到b

var a = 25;
var b = a;
b = 18;
console.log(a);//25
console.log(b);//18

引用类型按引用传值

var obj1 = { a: 10, b: 20, c: 30 };
var obj2 = obj1;
obj2.b = 100;
console.log(obj1);
// { a: 10, b: 100, c: 30 } <-- b 被改到了
console.log(obj2);
// { a: 10, b: 100, c: 30 }

更改obj2值的同时obj1的值也会发生变化,因为他们指向同一个对象,这就是浅拷贝

浅拷贝实现

直接赋值

let a=1
let b=a//1

Object.assign()

Object.assign是ES6的新函数。Object.assign() 方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。但是 Object.assign() 进行的是浅拷贝,拷贝的是对象的属性的引用,而不是对象本身。

var obj = { a: {a: "hello", b: 21} };
var obj1 = Object.assign({}, obj);

obj1.a.a = "changed";
console.log(obj.a.a); // "changed"

深拷贝实现

序列化反序列化

var syb = Symbol('obj');
var person = {
   name :'tino',
   say: function(){
      console.log('hi');
   },
   ok: syb,
   un: undefined
}
var copy = JSON.parse(JSON.stringify(person))

方法简单有效,当值为undefined、function、symbol 会在转换过程中被忽略,所以对象值有这三种的话用这种方法会导致属性丢失。

递归

function deepCopy(obj) {
      var result = Array.isArray(obj) ? [] : {};
      for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
          if (typeof obj[key] === 'object') {
            result[key] = deepCopy(obj[key]);   //递归复制
          } else {
            result[key] = obj[key];
          }
        }
      }
      return result;
    }

展开运算符…

只适用于单层对象

let a={aa:1,bb:2,cc:3}
let b={...a}