前言: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】”
深拷贝,浅拷贝
浅拷贝:
浅拷贝是创建一个新的对象,复制原有对象的基本类型的值给新对象;如果属性是引用类型,复制就是内存中地址,假如其中一个对象改变了这个内存中地址,肯定会影响到另一个对象。而且对于引用数据类型值拷贝一层属性,深层次无法进行拷贝;
浅拷贝方法
-
Object.assign
Object.assign(target,....sources)第一个参数拷贝目标对象,后面参数是拷贝的来源对象;
缺点
- 不会拷贝对象继承属性;
- 不会拷贝对象不可枚举属性;
- 可以拷贝Symbol类型属性
2.扩展运算符{...obj};(更适用于基本类型,缺陷跟Object.assign()一样)
3.concat拷贝数组;(只能是数组类型)
4.slice拷贝数组;(只能是数组类型)
深拷贝:
深拷贝:对于复杂引用数据类型,在堆内存中开辟一个全新空间存放对象,新对象修改不会改变原对象,两个对象相互独立,不受影响的;
深拷贝方法:
1.Json.stringify
不足: 无法拷贝对象循环应用(obj[key]=obj)
无法拷贝对象原型链
无法拷贝不可枚举属性等等
2.手写递归deepClone函数封装
call,applay,bind
区别:
-
call: 多个参数, 函数调用改变this,直接执行
-
applay:参数是单个数组,函数调用改变this,直接执行
-
bind: 多个参数,函数调用改变this,返回执行函数
this
this指向:
this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象
使用场景:
- 作为普通函数
- 使用call,applay,bind
- 作为对象方法被调用;
- 在class中被调用
- 箭头函数
原型链:(js非常重要概念,暂时不写了打字累)
闭包:
闭包概念: 一个可以访问其他函数内部变量的函数(或者说是闭包是个内嵌函数)
闭包本质: 当前环境中存在执行父级作用域引用;(作用域链执行顺序,自己画画图吧)
闭包场景:
- 返回一个函数
- 定时器
- 作为函数参数传递
- IIFE(立即执行函数)
可以从这些方面深入理解下闭包,这只是闭包常用部分;例如作用域执行规则,作用域链,浏览器执行规则,垃圾回收等等方面都跟闭包相关联;