js基础面试总结

面试

js基础

  1. 除了判断obj.a==null的时候(相当于obj.a===null||obj.a===undefined),其他都用===

  2. typeOf可以区分6种

    1. number

    2. string

    3. boolean

    4. undefined

    5. object

    6. function

      前四种是简单类型,可以区分,object和function都是object,es官方吧function拎出来了而已

  3. JSON是一种数据格式,也是js里面一个内置对象

  4. new一个实例的时候f=new F(),发生了:this变成一个空对象,this.a =?赋值 ,return this给这个f

    1、创建一个空对象 (好理解)
    2、将所创建对象的__proto__属性值设成构造函数的prototype属性值 (好理解)
    3、执行 构造函数中的代码,构造函数中的this指向该对象 (划重点)
    4、返回该对象(除非构造函数中返回一个对象)(见下面解释)
    5、react是直接用类的 并没有new所以里面用正常函数this指向undefind,这个this指向实例对象但是不存在,正常的构造函数中,必须要用正常函数才能拿到对应的实例对象,使用尖头函数则拿到的是undefind

  5. a instanceof b是判断a对象的原型链中任何位置是否有b出现

  6. let a = new b()则a.__photo===b.phototype

  7. 一般来说 构造函数(Dog)的prototype是他爸爸,__proto是他爸爸的prototype

  8. 闭包是一个函数return一个函数 父函数执行后得到一个子函数,父函数和子函数中间定义的变量不会被销毁,会缓存起来,子函数可以随意调用使用、更改。同时可以说这个变量被封装起来了,不容易被人为发现更改

  9. this是什么

    1. 全局函数中 this 是window
    2. 事件函数中this是触发事件的元素
    3. 对象中的函数 this 是这个对象
    4. 构造函数中的 this 是实例对象
    5. 箭头函数中的 this 指向箭头函数外面作用域的this
    6. 总结: this 指向this所在函数/方法的所有者
  10. //继承
    1. Dog.prototype = new Animal()//Animal的原型中的方法会过去(原型继承)
    2. const Dog = function () {
        Animal.call(this)//Animal的原型中的方法不会过去
    }
    
  11. 数组合并

    1. concat
    2. arr1.push.apply(arr1, arr2)
  12. js函数 是在定义的地方执行的 而不是在调用的地方执行的 也就是说函数只能调用定义的那个作用域里面的变量

  13. super在构造器中执行作用 super在子类中使用构造器时必须使用,使用后作用域中就有this了,指向父构造函数,super中传入的参数也会被用来传入父构造器执行,所以构造器中this.a创建的a,实例对象中的a是在实际身上的,因为都放到父亲身上,然后在new的时候一并把this指向实例,放在实例自己身上,而不是prototype

DOM

  1. dom叫 document object model 是文档对象模型
  2. dom中property是指dom js对象的属性;attribute是指html节点上的自定义属性;而getattribute和setattribute则是dom js对象上的一个方法 ,用来添加html节点上的自定义属性
    1. 要弄在html标签上的如style class可以用get/setattribute
    2. 很多属性如value calssName classList width是dom js对象上有的 可以直接pObj.value更改 用的直接就是property
  3. dom#input.focus()可以js直接聚焦

BOM

  1. navigation全局对象里面有一个userAgent用来获取用户浏览器信息,有一个geolocaltion用来配合api获取地理坐标
  2. localtion用来获取url上的信息
  3. history里面有forward()和back()方法用来前进后退
  4. screen里面可以获取屏幕属性

git

  1. 多人协作:
    1. 使用 git clone origin 克隆一个项目
    2. 使用 git branch xxx 新建一个分支
    3. 使用 git checkout xxx 移动到这个分支
    4. 或者直接使用 git checkout xxxx 移动到一个项目本来就有的分支
    5. 写入代码
    6. 下班前 使用 git pull --rebase origin xxxx 把远端服务器上的变更拉下来
    7. 如有冲突 打开文件解决冲突
    8. 解决后用 git add . 进行提交 (此步千万不能使用 git commit -m “21” 去提交 不然会出问题)
    9. 然后用 git rebase --continue
    10. 最后使用 git add . 和 git commit -m “12” 和 git push origin xxx 推上去
  2. 使用分支管理测试代码
    1. 使用 git branch xxx 新建一个分支
    2. 使用 git checkout xxx 移动到这个分支
    3. 写入代码
    4. 测试完成需要合主分支合并时:
      1. git checkout master 移动到主分支
      2. git pull --rebase origin xxxx 把远端的代码同步过来,出现冲突见上面上面笔记
      3. git merge xxx 合并分支
      4. 如遇冲突 打开文件解决冲突后 使用 git add . 和 git commit -m “24”
      5. 然后使用 git merge --continue
    5. 最后使用 git add . 和 git commit -m “12” 和 git push origin xxx 推上去
  3. 注意:
    1. git pull --rebase时解决冲突后必须使用 git add . 即可continue;
    2. git merge xxx 合并分支时解决冲突后必须使用 git add . 和git commit -m ”254“ 后continue;
  4. 版本回退
    1. 使用 git reflog 查看历史的记录
    2. 使用 git reset -hard HEAD@{数字} 回退版本
    3. 回退后使用 git add . 和 git commit -m “12” 提交一下
    4. 最后需要使用 git push origin xxx -f 强制推上去
  5. 多用git status看状态

模块化

  1. 不使用模块化的问题

    1. 全部用script引进来 都是全局变量 很容易污染 出bug查不出来
    2. 你不知道你引用的这个js依赖于哪个js ,顺序搞错或喽引都不行
  2. requirejs

    1. requirejs就是用define函数(方法)写模块,定义一个函数作为参数,return一个对象

    2. 用require函数(方法)写入口,定义一个函数作为参数,写逻辑

    3. //a.js
      define(['./util.js'], function (util) {
          return {
              hello: util.sayHi(hello)//utiljs里面写的方法,都在util这个参数对象里面调用
          }
      })
      //main.js
      require(['./hello.js'], function (a) {
          //这可以写业务
          a.hello()
      })
      //index.html
      <script src="/res/require.js" data-main="./main.js"></script>//最后在这里引入mainjs
      
  3. AMD、CMD和commonjs的区别

    1. AMD、CMD是异步加载的 commonjs是同步的 因为nodejs是服务端技术 设计的时候就没考虑到异步,同步硬盘读取就很快,而且更稳定
    2. ES6的模块同步异步和loader有关

上线流程

  1. 把所有的git分支都合并到master,进行build后测试等待上线
  2. 把服务器上正在运行的代码记录版本号,备份
  3. 把打包测试好的新代码上传到服务器运行,生成新的版本号

回滚流程

  1. 把当前服务器上有问题的代码打包备份,记录版本号
  2. 把之前备份的代码解压覆盖到服务器上运行,生成新的版本号

严格模式

  1. arguments不能用
  2. 必须用var等声明变量才能用
  3. 不能删除变量
  4. 对象字面量名重复报错
  5. 必须使用window.a
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容