发表于: 2020-06-05 22:42:13

1 2187


JS中的基本类型和引用类型

js数据类型种类  

ES5 种   ES6 8


基础类型

Number       整数或浮数    如 : 1  包含特殊值(-Infinity、+Infinity、NaN)

String         一串表示文本值的字符序列  如 :  '1'

Boolean       布尔类型    只有 true 和 false

undefined    未定义的数据类型  只有一个值 underfined

Null              表示一个空对象指针   只包含一个值:null

Symbol  ES6新增   一种实例是唯一且不可改变的数据类型


谷歌67版本中出现  bigInt   指安全存储、操作大整数    (但是很多人不把这个做为一个类型)


引用类型

Object     包含了Data、function、Array等


基本类型和引用类型的区别

在ECMAScript中,变量可以存放两种类型的值,即原始值和引用值。
原始值指的就是代表原始数据类型(基本数据类型)的值,
引用值指的就是复合数据类型(引用数据类型)的值。
原始值与引用值对应存在两种结构的内存即栈和堆。


基本类型具有不可变性, 基本类型是储存在栈内存内,

引用类型是可以改变的,引用值是用来引用存储在堆中的对象,引用出来的对象是存放在堆中的。
也就是说,存储在变量处的值(即指向对象的变量,存储在栈中)是一个指针,指向存储在堆中的实际对象.


深浅拷贝

      var array = [12];
      console.log(array);
      var newArray = array;
      console.log(newArray);
      newArray.push(4);
      console.log(newArray);
      console.log(array);

当改变newArray的值时 array的值同时改变

就是因为newArray浅拷贝了array的指针

新旧对象共享同一块内存 


深拷贝的方法  方法较多根据使用场景来定  拷贝的深浅,被拷贝对象的嵌套层级

数组  前提:内部没有嵌套对象

  for循环

 let arr1 = [123];
      let arr2 = copyArr(arr1);
      function copyArr(arr) {
        let res = [];
        for (let i = 0, length = arr.length; i < length; i++) {
          res.push(arr[i]);
        }
        return res;
      }

  

slice  concat

 let arr1 = [123];
      let arr2 = arr1.slice(0);

      let arr1 = [123];
      let arr2 = arr1.concat();


  Array.from


      let arr1 = [123];
      let arr2 = Array.from(arr1);


   ES6拓展运算符

      let arr1 = [123];
      let [...arr2] = arr1;


对象

    for循环

let obj1 = { count: 1, name: "grace", age: 1 };
      let obj2 = copyObj(obj1);
      function copyObj(obj) {
        let res = {};
        for (let key in obj) {
          res[key] = obj[key];
        }
        return res;
      }

    

 利用JSON

let obj1 = { count: 1, name: "grace", age: 1 };
      let obj2 = JSON.parse(JSON.stringify(obj1));

   ES6拓展运算符

  let obj1 = { count: 1, name: "grace", age: 1 };
      let { ...obj2 } = obj1;


这也就引申到学习angualr框架时 使用ngOnChanges生命钩子无法被触发

OnChanges只对输入的不可变对象起作用。

在Angular中,典型的不可变对象是string类型

这也就可以理解为何angular使用@Input接收父组件传递的值时,

如果传递的类型为对象时,数据更改由于被监测的事对象的指针,指针未更改,没有触发angular的变更检测

(angualr变更检测机制个人还未了解很深,这里只是个人的理解,如有错误欢迎师兄指正)




返回列表 返回列表
评论

    分享到