JS相关的复习记录-持续更新
一:数据类型检测
typeof 可以检测除了null 和 Array之外的所有类型。
instanceof 通过原型链来判断数据类型的
Object.prototype.toString.call() 可以检测所有的数据类型
二:深浅拷贝
浅拷贝:Object.assign({},{a:1})
深拷贝:JSON.parse(JSON.stringify(obj))
三:promise
promise 状态: pending, resolve, reject
pending: 正在进行中。
resolve: 成功的回调。
reject: 失败的回调
四:jquert 链式写法的调用原理
实例在调用内部方法的时候,返回当前调用这个方法的实例对象this就可以了,因为返回了当前的this就可以继续访问自己的原型了
五:什么是回调地狱并避免。
什么是回调地狱:在js中的异步逻辑导致导致函数的参数层层嵌套。一个函数作为参数需要依赖另一个函数执行的调用。
如何避免:
保持代码剪短,模块化引用。
es6 用promises 编写异步代码,使代码继续自上而下。并且可以使用try/catch,
es6 Generators是代码暂停,用next(继续)使代码继续自上而下
es7 Async function 异步方法
六:Javascript作用链域?
因为全局函数无法查看局部函数的内部结构,但局部函数可以查看上层和全局的函数结构,当需要从局部函数查找某一属性或者函数时,如当前作用域没有,边上找到上一层作用域,直到全局。
谈谈This对象的理解。
this总是指向函数的直接调用者;如果有new关键字,this指向new出来的那个对象;在事件中,this指向触发这个事件的对象
七:DOM操作——怎样添加、移除、移动、复制、创建和查找节点?
(1) 创建新节点 createDocumentFragment() //创建一个DOM片段 createElement() //创建一个具体的元素 createTextNode() //创建一个文本节点
(2) 添加、移除、替换、插入 appendChild() removeChild() replaceChild() insertBefore() //在已有的子节点前插入一个新的子节点
(3) 查找 getElementsByTagName() //通过标签名称 getElementsByName() //通过元素的Name属性的值(IE容错能力较强,会得到一个数组,其中包括id等于name值的) getElementById() //通过元素Id,唯一性
八:如何判断当前脚本运行在浏览器还是node环境中?
this === window ? 'browser' : 'node';
九:检测浏览器版本信息等
navigator.userAgent
十:函数防抖(debounce)与函数节流(throttle)
函数防抖(debounce):在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时。
实际利用:每次 resize/scroll 触发统计事件、文本输入的验证(连续输入文字后发送 AJAX 请求进行验证,验证一次就好)
函数节流(throttle):规定一个单位时间,在这个单位时间内,只能有一次触发事件的回调函数执行,如果在同一个单位时间内某事件被触发多次,只有一次能生效。
DOM 元素的拖拽功能实现(mousemove).计算鼠标移动的距离(mousemove)