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)

 

猜你喜欢

转载自www.cnblogs.com/yasoPeng/p/12802147.html