前端面试题集锦-2021年前端面试题收集题库1

1.说说Javascript中对象的几种创建模式

  • 对象-继承-面向对象
    • 创建对象第一个想到的关键字是 new
    • 创建对象的目的是实现继承,继承部分通用属性
    • 问题可以转换成 : JavaScript如何实现对象的继承,继承的形式
  • 构造函数
    • 首先定义一个构造函数,可以传入构造参数,demo如下:
          function Student(name,sex){
              this.name = name
              this.sex = sex
              this.sayName = function(){
                  console.log(this.name)
              }
          }
          var student_1 = new Student('张三','male')
      
    • 限制和优势
      • 必须使用 new 关键字
      • 创建一个对象需要使用一次new语句
      • 属性和方法直接赋予this对象
      • 限制1:每个对象的属性和方法都需要创建一遍,如果是公用的属性会造成浪费
      • 限制2:多次创建相似对象,需要重复的进行new动作,无法快速创建
  • 快速批量创建对象的 工厂模式
    • 使用一个工厂函数,入参接受构造参数,返回创建的对象,避免重复的new关键字
          function factory(name,sex){
              var obj = new Object()
              obj.name = name
              obj.sex = sex
              obj.sayName = function(){
                  console.log(this.name)
              }
              return obj
          }
          var person_1 = factory('zhangsan','male')
          var person_2 = factory('lisi','female')
      
    • 限制和优势
      • 生成相似的同类对象避免多次重复的new关键字
      • 限制:只能构造同类元素
  • 避免重复属性性能浪费的 原型模式
    • 每个函数都有一个原型属性指针prototype,指向一个原型对象,所有实例的该属性指向同一个对象,并不会重复创建对象,所以再原型对象里面添加属性,可以避免实例重复创建对象的性能浪费
      ```:javacsript
      function student_proto(){

          }
          student_proto.prototype.sayNme = funciton(){
              console.log(this.name)
          }
          student_proto.prototype.sex = 'male'
          student_proto.prototype.name = 'zhangsan'
      
          var student_1 = new student_proto()
      ```
      
    • 如果实例上没有某个属性,就会往上向原型链上查找,会拿到prototype上面的统一的一个对象属性

    • 如果实例上有这个属性则会直接返回实例属性,如果原型链上也没有这个属性那么就会返回Undefined

    • 限制:实例对原型对象引用属性的修改会修改所有实例的原型属性,没法做到独立性

  • 组合使用 原型模式和构造函数
    • 在使用构造函数的保证实例属性独立的前提下,原型属性也使用,实现混合模式
      function Student(name,sex,grade){													
          this.name = name;
          this.sex = sex;
          this.grade = grade;
      }
      
      Student.prototype.sayName = function(){
              console.log(this.name);
      }
      Student.prototype.school = 'Joooh school';
      
  • 动态原型模式
    • 原理:还是把所有的信息都封装在构造函数里面,但是为了避免方法的重复定义和性能损耗,在定义重复方法之进行了一个判断,如果this.function 已经存在则不在进行重复定义,如果不存在,将原型链上添加上该方法
    • demo
      function Person(name,age,job){
      
          //属性
          this.name = name;
          this.age = age;
          this.job = job;
      
          //方法
          if (typeof this.sayName != "function"){
      
              Person.prototype.sayName = function(){
                  alert(this.name);
              };
      
          }
      }
      
      var friend = new Person("Nicholas",29,"Software Engineer");
      friend.sayName();
    
  • 寄生构造函数模式
    • 原理:Javascript 中构造函数如果有返回值的情况会怎么样

      • 无返回值: 实例为正常实例化对象
      • 有返回值但是返回值为非引用类型:实例为正常实例化对象
      • 有返回值并且返回值为引用类型:实例为返回值引用对象
    • 所谓寄生构造函数就是创建一个函数,然这个函数只是封装创建对象的代码,然后再返回新创建的对象。

      ```:javascript
      function Person(name,job){
      
      var o = new object();
      
      o.name = name;
      
      o.age=age;
      
      o.job=job;
      
      o.sayName = function(){
      
          alert(this.name)  
      
      }
      
      return o;  
      
      }
      
      var friend = new Person(name1,age1,job1)
      
      friend.sayName(); // name1
      ```
      
    • 构造函数里面通过一个函数返回引用对象,不推荐使用,并且无法通过Instanceof 判断所属关系

Javascript中如何实现异步编程

  • 回调函数
    • 原理:在需要持续很长的代码块结束位置调用回调函数,可以保证代码在结束时调用,后者等待前者的结果
    • 缺点:不利于代码维护,冗长,跳转调用阅读困难,控制反转
  • promise
    • 原理:ES6中注册promise对象,根据异步任务执行状态,调用promise的resolvereject方法,将promise状态置为resolvedrejected,promise对象会在状态转变时自动调用resolve回调或者是reject回调
    • 优点:代码结构优秀,可以链式调用
  • 发布/订阅模式
    • 相当于有个事件bus,任何监听了bus事件的订阅者,在bug触发一定事件时都会执行相应回调函数
  • 事件监听
    • 事件监听其实也是发布订阅模式的一种形式,在事件触发时,所有订阅者的对应函数都会被执行,常用的是vue的bus
  • async/await
    • ES6 中可迭代对象,可以使用next()生成,下一个序列的可迭代属性,在手动调用next方法时,只要返回值done不是true,则会阻塞下一次next()的调用
    • 所以通过next 的阻塞作用,使用asyncawait达到异步阻塞,在前者执行完之前不会执行后者,达到异步的效果
    • 可以结合Promise同时使用

Javascript 的同源策略

  • 概念:JavaScript只能读取和所属文档同源的窗口和文档的属性
    • 判断来源:指脚本本身的来源并不作为同源依据,而是指脚本所属文档的来源作为判断依据
    • 同源:协议,主机,端口必须全部相同

为什么JavaScript会有同源策略限制

  • 避免跨域跨来源的安全问题

为什么说Function函数在JavaScript中是第一类对象

  • 函数拥有对象能做的一切能力
    • 可以动态创建
    • 可以当作引用赋值
    • 可以拥有自己的属性和方法
    • 可以分配变量,可以将他们的引用复制到其他变量,可以被拓展或者删除
    • instance 函数和Object都是true,函数的原型链最上层也是Object,拥有对象的所有原型属性和方法

JavaScript中函数声明和函数表达式的区别

  • 什么是函数声明
    • function type(){ } 类似这样,声明一个名叫type的函数
    • var type = function(){} 类似这样则是函数表达式,并且把函数表达式赋值给一个变量
  • 主要就是函数声明会和var声明变量一样,会有变量提升的问题
  • JavaScript中定义函数的四种方式
    • 函数声明
    • 函数表达式
    • 箭头函数
    • new Function()

JavaScript如何删除cookie中的一个键值对

  • 原理:
    • document.cookie 在赋值时是设置单个cookie,但是获取document.cookie的时候是返回所有的cookie
    • 在需要删除的cookie键值对后面增加一个exires=时间戳exires键值对,浏览器就会立刻删除该cookie键值对,注意此处的时间戳必须是UTC或者是GMT时间不能是本地时间
    • 需要将document.cookie => .split(';')=>拆分成数组,for of 遍历,在需要修改的键值对后面进行添加exire键值对

手写一个方法求字符串的字节长度

  • 思路:
    • 字符串自带属性.length,可直接拿到字符长度
    • 遍历字符串,通过charCode识别时候是中文字符,如果是中文字符>255 则字节数额外+1

attribute 和 property的区别

  • attribute : 特性,特性节点(attribute node),每个dom节点都有有个attribute属性用来存储特定的attribute node属性节点
  • property :属性,每个dom节点,如果当作普通Object看,property就是存储在Object中的一个键值对
  • 设置方法不一样: attribute 需要setAttribute方法设置,property直接.语法设置
  • 删除方式不一样: attribute 需要removeAttribute方法设置,property则是使用Objectdelete 方法

延时脚本在JavaScript中的作用

  • deferasync 属性对脚本加载的意义不一样
  • 相同点: 都会使脚本的加载过程不阻碍html的解析
  • 不同点: defer 延时即使脚本加载完成,也会等待html解析完毕再执行脚本,而 async 则是异步加载脚本,脚本一加载完成则会立即执行脚本,可能还是会阻碍html解析
  • 相同作用:都是为了更好的html体验,减少白屏时间,优化用户体验

闭包是什么,闭包的优缺点

  • 闭包
    • 函数:封装作用域
    • 闭包:利用函数封装作用域的特性,实现了私有域变量的封装,同时暴露出方法,允许获取或者操作私有域变量
    • 实现:函数-》 函数作用域的变量声明 -》 暴露方法允许操作或者修改变量
  • 优点:私有域的变量,防止变量污染,防止全局污染,私有属性
  • 缺点:内存消耗巨大,变量不会自动回收(变量引用一直都在)

如何判断一个对象是否属于一个类

  • instanceof
    • object instanceof Object 右边参数是否存在左右对象的原型链上,存在返回 true 不存在返回 false
  • constructor
    • object.constructor === Object 一个实例在创建过程中,prototype 中会自动创建一个constructor 属性,并且指向这个构造函数

是否存在一个函数,只在当前对象查找属性,不会顺原型链查找

  • hasownproperty
    • 返回值:一个 boolean 值,该对象本身是否拥有该属性
    • 可能会有坑: hasOwnProperty 也是 Object 原型链上一个属性,可以被重写

document.write和innerHTML的区别

  • 是否重绘整个页面:
    • document.write在修改html片段之后会重绘页面
    • innerHtml修改html片段 会重绘部分页面片段

在JavaScript中读取文件的方法是什么

  • JavaScript环境区分
    • node环境:
      • fs 库
      // 1. 使用 require 方法加载 fs 核心模块
      var fs = require('fs')
      // 2. 读取文件
      //    第一个参数就是要读取的文件路径
      //    第二个参数是一个回调函数
      //        成功
      //          data 数据
      //          error null
      //        失败
      //          data undefined没有数据
      //          error 错误对象
      fs.readFile('read.txt',function (error,data) {
      // 在这里就可以通过判断 error 来确认是否有错误发生
      if (error) {
          console.log('读取文件失败了')
      } else {
          console.log(data.toString())
      }
      })
      
      
    • 浏览器环境:
      • 后端读取文件,返回前端解析 前端通过 xhr http 请求拿取文件内容
                  function readAjaxFile(url) {
                      // 创建xhr
                      var xhr = new XMLHttpRequest();
                      // 监听状态
                      xhr.onreadystatechange = function() {
                      // 监听状态值
                      if(xhr.readyState === 1 && xhr.status === 200) {
                      console.log(xhr.responseTest)
                      }
                      }
                      // 打开请求
                      xhr.open('GET',url,true)
                      // 发送数据
                      xhr.send(null)
                      }
      
      • 前端通过input 上传文件
          let file  =  document.queryselector('file-input')[0].file[0]
          let reader = new FileReader()
          reader.readAsText(file)
          reader.onload = function(data) {
              console.log(data,this.result);
              }
      

Javascript如何分配对象属性

  • 对象赋值?
    • . 属性点操作赋值 obj.test = 1
    • [] 方括号属性操作 obj['test'] = 1
    • 区别:方括号内部允许变量动态值,点属性只能直接获取属性

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


1==>简述一下src与href的区别 src用于替换当前元素; href用于在当前文档和引用资源之间确立联系 2==>、谈谈以前端角度出发做好SEO需要考虑什么? a. 了解搜
什么是window对象?什么是document对象? window对象代表浏览器中打开的一个窗口。 document对象代表整个html文档。实际上, document对象是window对象的一个属性
1 》vue-router有哪几种导航钩子? 第一种:是全局导航钩子:router.beforeEach(to,from,next) 第二种: 组件内的钩子 beforeRouteEnter
1=>为什么data是一个函数 【理解】 组件的data写成一个函数, 这样每复用一次组件,就会返回一分新的data。 也就说:给每个组件实例创建一个私有的数据空间。 各个组件维护各自的数据。
01 vue3的新特征 1.组合式API. setUp作为组合函数的入口函数 2.Teleport 传送门 3.片段 template下可以有多个标签 4.用于创建自定义渲染器。我的理解是 creat
// var arr=[1,2,23,23,4,5,5]; // var newarr=new Set(arr); //去重 // console.log([.
摆好姿势 摆好姿势 如何使下面的等式成立 if(a==1&&a==3&a==5){ console.log(666) } var a=[1,3,5] a.join=a.shif
1=>为什么data是一个函数 【理解】 ok 每复用一次组件,就会返回一分新的data。 也就说:【每个组件实例创建】一个【私有】的数据空间。各个组件维护各自的数据。 如果单纯的写成对象形式,
以下是收集一些面试中经常会遇到的经典面试题以及自己面试过程中无法解决的问题,通过对知识的整理以及经验的总结,重新巩固自身的前端基础知识,如有错误或更好的答案,欢迎指正。:) 在网页中,一个元素占有空间
1 Action是不是线程安全的?如果不是 有什么方式可以保证Action的线程安全?如果是,说明原因不是声明局部变量,或者扩展RequestProcessor,让每次都创建一个Action,或者在s
解决js兼容性问题使用 event对象 function eventHandler(event) { event = event || window.event} 获取滚动条属性 var scrollTop = document.documentElment.scrollTop || document.body.scrollTop
浏览器的内核 IE: trident内核,Firefox:gecko内核,Safari:webkit内核,Opera:以前是presto内核,Opera现已改用Google Chrome的Blink内核,Chrome:Blink(基于webkit,Google与Opera Software共同开发) HTML中的Doctype有什么作用 此标签可告知浏览器文档使用哪种HTML或XHTML规范。(重点:告诉浏览器按照何种规范解析页面) div+css的布局较table布局有什么...
如何创建函数第一种(函数声明): function sum1(num1,num2){ return num1+num2; } 第二种(函数表达式): var sum2 = function(num1,num2){ return num1+num2; } 第三种(函数对象方式): var sum3 = new Function("num1","num2","return num1+num2");三种弹窗的单词以及三种弹窗的功能1.alert //弹出对话框并输出一段提示信...
js的垃圾回收机制是什么原理垃圾回收机制有两种方法第一种是标记清除法:当变量进入执行环境时,就标记这个变量为”进入环境”,当变量离开环境的时候,则将其标记为”离开环境”,垃圾收集器在运行的时候会给储存在内存中的所有变量都加上标记,然后它会去掉环境中的标量以及被环境中的变量引用的标记,而在此之后再被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了,最后,垃圾收集器完成内存清除工作,销毁那些带标记的值,并回收他们所占用的内存空间 第二种是引用计数法:当声明了一个变量并将
Ajax 是什么? 如何创建一个Ajax?AJAX全称是Asychronous JavaScript And Xml(异步的 JavaScript 和 XML)它的作用是用来实现客户端与服务器端的异步通信效果,实现页面的局部刷新,早期的浏览器并不能原生支持ajax,可以使用隐藏帧(iframe)方式变相实现异步效果,后来的浏览器提供了对ajax的原生支持其主要通过XMLHttpRequest(标准浏览器)、ActiveXObject(IE浏览器)对象实现异步通信效果实现方式(gitee上的案例):
谈一谈let与var和const的区别let为ES6新添加申明变量的命令,它类似于var,但是有以下不同: let命令不存在变量提升,如果在let前使用,会导致报错let暂时性死区的本质,其实还是块级作用域必须“先声明后使用”的性质,let 暂时性死区的原因:var 会变量提升,let 不会。let,const和class声明的全局变量不是全局对象的属性const可以在多个模块间共享const声明的变量与let声明的变量类似,它们的不同之处在于,const声明的变量只可以在声明时赋值,不可
解释一下为何[ ] == ![ ] // ---> true首先看一张图![ ] 是 false原式:[ ] == false根据第八条,false通过tonumber()转换为0原式:[ ] == 0根据第十条,[ ]通过ToPrimitive()转换为' '原式:' ' == 0根据第六条原式:0 == 0尝试实现new function ObjectClass() {//对象 console.log(arguments[...
谈谈对Node的理解Node.js 在浏览器外运行V8 JavaScript引擎,单线程 非阻塞I/O 事件驱动,适应于数据高并发,适合多请求,但不适合高运算,有权限读取操作系统级别的API,npm 仓库,常用框架:Express,koa,Socket.io,AdonisJs,NestJS什么是gulp?作用?机制是什么?gulp是基于node的自动化构建工具作用:1 自动压缩JS文件2 自动压缩CSS文件3 自动合并文件4 自动编译sass5 自动压缩图片6 自动刷
vue和react的区别React严格上只针对MVC的view层,Vue则是MVVM模式virtual(虚拟) DOM不一样,vue会跟踪每一个组件的依赖关系,不需要重新渲染整个组件树。而对于React而言,每当应用的状态被改变时,全部组件都会重新渲染,所以react中会需要shouldComponentUpdate这个生命周期函数方法来进行控制组件写法不一样,React推荐的做法是 JSX + inline style,也就是把HTML和CSS全都写进JavaScript了,即'all in
谈谈对react的理解react是基于v(视图层)层的一款框架,虚拟dom和diff算法react特点:声明式设计高效,其中高效以现在虚拟dom,最大限度减少与dom的交互和diff算法灵活,体现在可以与已知的框架或库很好的配合JSX,是js语法的扩展组件化,构建组件,是代码的更容易得到复用,比较建议在大型项目的开发单项数据,实现单项数流,从而减少代码复用react有哪几个生命周期自己的总结分为三个阶段,初始,运行中,销毁初始化: 执行getDefaultProps钩子