Js概念理解

170 阅读3分钟

前言:js  是前端基础;梳理下思路,我是看了《js红宝书》感觉有些提升了;

我个人觉得看书比较系统体系化,然后再看别人文章比较有利于抓住重点;(当然我也菜,仅供参考)

数据类型

**基本数据类型:**Undefined,Null,Boolean, String,Number,Symbol,Bignit,OBject

**引用数据类型:**Object(包含了Array,RegExp,Date,Math,Functuon)

存储空间:

基本类型存储在栈内存,被引用或拷贝时,会创建一个完全相等变量;

引用类型存储在堆内存,存储是地址,多个引用指向同一个地址;(涉及到共享概念);

检测数据类型:

typeof;

对于基础数据类型:typeof null 输出 Object,有问题结果;

对于引用类型: 除了function会显示正确function,其它都显示Object无法正确判断类型;

instanceof

可以准确判断复杂引用数据类型,但是不能正确判断基础数据类型;

console.log([] instanceof Array) //true

Object.prototype.toString(推荐);

对于其它对象,则需要通过call来调用,才能返回正确类型;

例如: Object.prototype.toString.call(1)  //打印“【Object Number】”

深拷贝,浅拷贝

浅拷贝:

浅拷贝是创建一个新的对象,复制原有对象的基本类型的值给新对象;如果属性是引用类型,复制就是内存中地址,假如其中一个对象改变了这个内存中地址,肯定会影响到另一个对象。而且对于引用数据类型值拷贝一层属性,深层次无法进行拷贝;

浅拷贝方法

  1. Object.assign

      Object.assign(target,....sources)第一个参数拷贝目标对象,后面参数是拷贝的来源对象;

     缺点

  1.     不会拷贝对象继承属性;
  2.     不会拷贝对象不可枚举属性;
  3.     可以拷贝Symbol类型属性

2.扩展运算符{...obj};(更适用于基本类型,缺陷跟Object.assign()一样)

3.concat拷贝数组;(只能是数组类型)

4.slice拷贝数组;(只能是数组类型)

深拷贝:

深拷贝:对于复杂引用数据类型,在堆内存中开辟一个全新空间存放对象,新对象修改不会改变原对象,两个对象相互独立,不受影响的;

深拷贝方法:

1.Json.stringify

不足: 无法拷贝对象循环应用(obj[key]=obj)

无法拷贝对象原型链

无法拷贝不可枚举属性等等

2.手写递归deepClone函数封装

call,applay,bind

区别:

  1. call:  多个参数, 函数调用改变this,直接执行

  2. applay:参数是单个数组,函数调用改变this,直接执行

  3. bind:  多个参数,函数调用改变this,返回执行函数

this

this指向:

this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象

使用场景:

  1. 作为普通函数
  2. 使用call,applay,bind
  3. 作为对象方法被调用;
  4. 在class中被调用
  5. 箭头函数

原型链:(js非常重要概念,暂时不写了打字累)

闭包:

闭包概念: 一个可以访问其他函数内部变量的函数(或者说是闭包是个内嵌函数)

闭包本质: 当前环境中存在执行父级作用域引用;(作用域链执行顺序,自己画画图吧)

闭包场景:

  1. 返回一个函数
  2. 定时器
  3. 作为函数参数传递
  4. IIFE(立即执行函数)

可以从这些方面深入理解下闭包,这只是闭包常用部分;例如作用域执行规则,作用域链,浏览器执行规则,垃圾回收等等方面都跟闭包相关联;