1、数据类型的判断
我们可以这样去回答:
一共有四种方式1、typeof 2、instanceof 3、constructor 4、object.prototype.toString.coll()来判断但是这四种方法都不能完整的解决数据类型判断 typeof只能判断基本数据类型 它对于引用数据类型只能返回object,但是我们判断自定义数据类型可以用instanceof和constructor但是它俩都不能很好的解决内置数据类型判断,因为instanceof它对new和undefined判断不出来 constructor对Array也判断不出来 object.prototype.toString.call()主要用于判断内置数据类型
2、作用域链
简单来说是 就近原则
变量的作用域链:一个函数在访问变量的时候,优先使用自己的局别变量,如果没有这个变量的声明,则向上一级访问,一直访问到全局 如果全局都没有的话 说明语法错误 is not defined
3、js预解析
简单来说就是 先使用后定义
定义必须用 :
- var 定义一个变量 (把这个变量预解析为undefined)
- 用function 定义一个函数 (预解析为函数字符串)
- 函数传参的变量
代码展示:
4、闭包
定义:当一个函数的返回值是另一个函数,而返回的那个函数如果调用了其父函数的内部变量,且返回的那个函数在外部被执行,就产生了闭包。
闭包同时也是一个环境,具体指的就是外部函数——高阶函数
闭包的三个特性:
- 函数套函数
- 内部函数可以直接访问外部函数的内部变量或参数
- 变量或参数不会被垃圾回收机制回收 (垃圾回收机制:1、标记清除 2、引用计数)
闭包的优点
- 变量长期存在内存中
- 缓存数据延长作用域链
- 私有成员的存在
闭包的缺点
- 占内存
- 对捕获的变量是引用,不是复制
- 父函数每调用一次,会产生不同的闭包
闭包的应用场景
- setTimeout
- 回调
- 函数防抖,节流
防抖:函数被高频触发时停止触发后延时n秒再执行函数
节流:函数被高频触发时延时n秒才会执行 - 封装私有变量
5、字符串常见的方法
- chartAt( ):返回在指定位置的字符;
- concat( ):字符串连接;
- indexOf( ):检索字符串,找不到返回-1;
- slice( ):提取字符串片段,并在新的字符串中返回被提取的部分;
- split( ):字符串转数组;
- substr( ):从起始索引号提取字符串中指定数目的字符;
- substring( ):提取字符串中两个指定的索引号之间的字符;
- toLowerCase( ):字符串转小写;
- toUpperCase( ):字符串转大写;
- valueOf( ):返回某个字符串对象的原始值;
- trim( ):删除字符串两边的空格
数组ES5中常见的方法
- concat( ):数组合并。
- join( ):数组转字符串。
- pop( ):删除最后一个元素。
- push( ):数组向后添加。
- unshift( ):数组向前添加。
- shift( ):删除第一个元素
- slice( ):数组元素的截取,返回一个新数组,新数组是截取的元素,可以为负值。
- sort( ):对数组元素进行排序;
- splice( ):删除元素,并向数组添加新元素;
- toString( ):数组转字符串;
深拷贝浅拷贝
深拷贝和浅拷贝是针对复杂的数据类型来说的浅拷贝只拷贝一层,深拷贝是层层拷贝
深拷贝:
拷贝的是变量值,对基本数据类型再复制
浅拷贝:
只是复制了引用地址,两个对象同时指向了同一个人内存地址,所有任意一个对象的修改,另一个对象也会随之改变
深拷贝代码 递归
倒叙代码
for in遍历 数组 对象
For of 遍历的两类对象 - 类似数组的对象 可遍历对象 实现Itrartor接口的对象
.