设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 重新 试卷 文件
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

中高级前端大厂面试秘籍,为你保驾护航金三银四,直通大厂(4)

发布时间:2019-02-20 20:16 所属栏目:21 来源:佚名
导读:浅拷贝: 以赋值的形式拷贝引用对象,仍指向同一个地址,修改时原对象也会受到影响 Object.assign 展开运算符(...) 深拷贝: 完全拷贝一个新对象,修改时原对象不再受到任何影响 JSON.parse(JSON.stringify(obj)) :

浅拷贝: 以赋值的形式拷贝引用对象,仍指向同一个地址,修改时原对象也会受到影响

  • Object.assign
  • 展开运算符(...)
  • 深拷贝: 完全拷贝一个新对象,修改时原对象不再受到任何影响

    • JSON.parse(JSON.stringify(obj)): 性能最快

      • 具有循环引用的对象时,报错
      • 当值为函数或undefined时,无法拷贝
    • 递归进行逐一赋值
  • 8. new运算符的执行过程

    • 新生成一个对象
    • 链接到原型: obj.__proto__ = Con.prototype
    • 绑定this: apply
    • 返回新对象

    9. instanceof原理

    能在实例的 原型对象链 中找到该构造函数的prototype属性所指向的 原型对象,就返回true。即:

    1. // __proto__: 代表原型对象链 
    2. instance.[__proto__...] === instance.constructor.prototype 
    3.  
    4. // return true 

    10. 代码的复用

    当你发现任何代码开始写第二遍时,就要开始考虑如何复用。一般有以下的方式:

    • 函数封装
    • 继承
    • 复制extend
    • 混入mixin
    • 借用apply/call

    11. 继承

    在 JS 中,继承通常指的便是 原型链继承,也就是通过指定原型,并可以通过原型链继承原型上的属性或者方法。

    • 最优化: 圣杯模式
    1. var inherit = (function(c,p){ 
    2.     var F = function(){}; 
    3.     return function(c,p){ 
    4.         F.prototype = p.prototype; 
    5.         c.prototype = new F(); 
    6.         c.uber = p.prototype; 
    7.         c.prototype.constructor = c; 
    8.     } 
    9. })(); 
    • 使用 ES6 的语法糖 class / extends

    12. 类型转换

    大家都知道 JS 中在使用运算符号或者对比符时,会自带隐式转换,规则如下:

    • -、*、/、% :一律转换成数值后计算
    • +:

      • 数字 + 字符串 = 字符串, 运算顺序是从左到右
      • 数字 + 对象,, 优先调用对象的valueOf -> toString
      • 数字 + boolean/null = 数字
      • 数字 + undefined == NaN
    • [1].toString() === '1'
    • {}.toString() === '[object object]'
    • NaN !== NaN 、+undefined === NaN

    13. 类型判断

    判断 Target 的类型,单单用 typeof 并无法完全满足,这其实并不是 bug,本质原因是 JS 的万物皆对象的理论。因此要真正完美判断时,我们需要区分对待:

    • 基本类型(null): 使用 String(null)
    • 基本类型(string / number / boolean / undefined) + function: 直接使用 typeof即可
    • 其余引用类型(Array / Date / RegExp Error): 调用toString后根据[object XXX]进行判断

    很稳的判断封装:

    1. let class2type = {} 
    2. 'Array Date RegExp Object Error'.split(' ').forEach(e => class2type[ '[object ' + e + ']' ] = e.toLowerCase())  
    3.  
    4. function type(obj) { 
    5.     if (obj == null) return String(obj) 
    6.     return typeof obj === 'object' ? class2type[ Object.prototype.toString.call(obj) ] || 'object' : typeof obj 

    14. 模块化

    模块化开发在现代开发中已是必不可少的一部分,它大大提高了项目的可维护、可拓展和可协作性。通常,我们 在浏览器中使用 ES6 的模块化支持,在 Node 中使用 commonjs 的模块化支持。

    • 分类:

      • es6: import / exports
      • commonjs: require / module.exports / exports
      • amd: require / defined
    • (编辑:ASP站长网)

    网友评论
    推荐文章
      热点阅读