IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 面试题记录 -> 正文阅读

[JavaScript知识库]面试题记录

面试题

  1. vue有哪两种传参方式,分别有什么区别?哪一种传参方式页面刷新会消失

    用法:query要用path来引入,params要用name来引入,接收参数都是类似的,分别是 this.$route.query.namethis.$route.params.name

    url地址显示:query更加类似于ajax中get传参,params则类似于post,说的再简单一点,前者在浏览器地址栏中显示参数,后者则不显示

    注意:query刷新不会丢失query里面的数据 params刷新会丢失 params里面的数据。

  2. 说说对vue的模块化开发

    tips:

    比如说在一些数据展示比较多的页面,可以在页面新增一个js文件,比如说一些初始化的数据信息使用export导出,然后在vue页面导进行import 导入,这样可以使代码看起来更简洁,也更方便后期代码的优化分模块存放代码。

    还有一个比较复杂的页面,也可以在该页面的文件夹新增一个compoents组件文件夹,然后分别在页面引入

    导出导出 import export default

  3. 说说vue的渐进式

    tips:

    比如使用vue开发 为可能需要使用element的组件,直接引入就好了,需要使用vuex然后也直接引入 ,而不是说在一开始搭建项目的时候将所有可能需要用到的全部安装,按需引入。

    需要多少拿多少 ,按需引入

  4. vue的权限管理

    根据用户登陆授权的角色 注入相对应的路由,

    刷新页面,从缓存中获取token信息再次请求获取所属权限,再次注入路由

    缓存之后存储用户的token信息,权限路由不会存储

    之后再去刷新token获取对应路由信息

    1.登陆后获得用户角色,通过角色获得用户的权限,注入权限对应的路由。
    2.刷新页面,从localStorage用角色(更好的方式是通过token)再次获得所属权限,再次注入路由。在管理界面左端循环权限对应的路由菜单。
    3.localStorage存用户的信息(token),权限路由不会存。
    
  5. vue的组件传参的方式?

    • prop/emit 父子组件传参,父组件使用prop定义传递数据,子组件emit将数据变量传递给父组件
    • refs 父组件中给子组件绑定ref,可以直接调用this.$refs.child获取子组件的数据信息
    • vuex全局状态管理
    • eventBus 用户兄弟组件之间的传参,在全局创建一个eventBus变量 在兄弟组件引入,a兄弟组件使用emit 发送数据,b兄弟使用on接受数据信息
    • parent/children 之间传参数 ,
  6. es6的新特性

    https://juejin.cn/post/6844903959283367950

  7. 如何解构赋值数组对象?

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MirXWIhx-1634974658014)(file:///Users/liulu/Library/Application%20Support/typora-user-images/image-20211015212819961.png?lastModify=1634905919)]

  8. promise 和async和await 的区别?

    promise

    promise是一部编程的一种解决方案,比传统的解决方案–回调函数和事件----更合理和更强大,简单地说,Promise好比容器,里面存放着一些未来才会执行完毕(异步)的事件的结果,而这些结果一旦生成是无法改变的

    async await

    async await意识异步编程的一种解决方案,遵循的是generator函数的语法糖,他拥有内置执行器,不需要额外的调用直接会自动执行并输出结果,它返回的是一个Promise对象。

    两者的区别:

    1. Promise的出现解决了传统的callback函数导致的"地狱回调"问题,它的语法导致了它向纵向发展行成了一个回调链,遇到复杂的业务场景,这种语法显然是不美观的,而async awiat 代码看起来会更简洁,使得异步代码看起来像同步代码,await的本质是可以提供等同于"同步效果"的等待异步返回能力的语法糖,只有这语句代码执行完,才会执行下一句。
    2. async await与Promise一样是,是非阻塞的
    3. async await是基于Promise实现的,可以说是改良版的Promise,它不能用于普通函数
  9. vue生命周期

    1. beforeCreate(创建前):数据观测和初始化事件还未开始,此时data的响应式追踪,event/watcher都还没有被设置,也就是不能访问到data,computed,watch,methods上的方法和数据
    2. created(创建后):实例创建完成,实例上配置的options包括data,comouted,watch,methods等都配置完成,但是此时渲染的节点还未挂载到DOM,所以不能访问**$el**属性 (虚拟dom在此生命周期执行)
    3. beforeMount(挂载前):在挂载开始之前被调用,相关的render函数首次被调用,实例已经完成以下的配置:编译模版,把data里面的数据和模版生成html。此时还没有挂在在html页面上。
    4. mounted(挂载后):在el被新创建的vm.$el替换,并挂在到实例上去之后调用。实例已完成以下配置:用上面编译好的html内容替换el属性指向的DOM对象。完成编译模版中的html渲染到html页面中。此过程中进行ajax交互。
    5. beforeUpdate(更新前):响应式数据更新时调用,此时虽然响应式数据更新了,但是对应的真实DOM还没有被渲染,
    6. updated(更新后):在由于数据更改导致的虚拟DOM重新渲染和打补丁之后调用,此时DOM已经根据响应式数据的变化更新了,调用时,组件DOM已经更新,所以可以执行依赖于DOM的操作。然后在大多数情况下,应该避免在此期间更改状态,因为这可能会导致更新无限循环。改钩子在服务器渲染期间不被调用。
    7. beforDestroy(销毁前):实例销毁之后调用,这一步,实例仍然完全可用,this仍然可以获取到实例。
    8. destroy(销毁后):实例销毁后调用,调用后,Vue实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。改钩子在服务端渲染期间不被使用。
  10. 给定一个数组 手写一个排序的方法

     function sortArr(arr) {
                for (let i = 0; i < arr.length; i++) {
                    for (let j = 0; j < arr.length - 1; j++) {
                        if (arr[j] < arr[j + 1]) {  //从大到小。//从小到大 (arr[j]>arr[j+1])
                            var temp = arr[j]
                            arr[j] = arr[j + 1]
                            arr[j + 1] = temp
                        }
    
                    }
    
                }
                return arr
            }
    
  11. jquery 和vue有什么区别?

    jquery:通过获取dom元素,给元素绑定事件和方法。

    vue:运用双向数据绑定,用数据驱动视图更新,不再去操作dom,

  12. http和https为什么说https更安全

    (http是明文传输 ,https是加密传输)

  13. mvvm和mvc有什么区别?

    MVC

    MVC通过分离Model,View和Controller的方式来组织代码结构。其中View负责页面的显示逻辑,Model负责存储页面的业务逻辑,以及对相应数组的操作。并且View和Model应用来观察者模式,当Model层发生改变的时候它会通知有关View层更新视图,Controller是View和Model层的纽带,主要负责用户与应用的响应操作,当用户与页面发生交互的时候, 中事件触发器就开始工作了,通过调用Model层,来完成对Model的修改,然后Model层再去通知View层更新。

    MVVM

    • Model代码数据模型

    • View代码UI视图

    • ViewModel负责监听MOdel中数据的改变,并控制视图的更新,处理用户交互操作

      tips

      Model和View并无直接关联,而是通过ViewModel来进行联系的,Mode和ViewMOdel之间有着双向数据绑定的联系,因此当Model中的数据改变时会出发View层的更新,View中由于用户交互操作而改变的数据也会在Model中同步。

    m表示model 数据

    v表示视图

    c表示控制器

    表示数据的更改需要依赖Controller控制器进行视图更新,而mvvm可以通过viewModel进行双向数据绑定进行数据和视图的更新

  14. get和post和put的区别 ?

    • post更安全因为get直接将数据在url里面传输的 而post是在request body里面
    • get 参数有长度限制 post没有限制大小
    • get请求性能更好 只会发送一次 直接将headerdata一并发送出去
    • post 会发送两次 首先将header信息发送出去 服务器响应之后再发送data 然后再请求成功返回数据

    GET和POST还有一个重大区别,简单的说:

    GET产生一个TCP数据包;POST产生两个TCP数据包。

    长的说:

    对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);

    而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

    也就是说,GET只需要汽车跑一趟就把货送到了,而POST得跑两趟,第一趟,先去和服务器打个招呼“嗨,我等下要送一批货来,你们打开门迎接我”,然后再回头把货送过去

  15. 前端如何配合后端一起处理秒杀的高并发

    前端:用户下单之后按钮灰置,禁止用户重复下单,或者提示loading

  16. cookie和LocalStorage和sessionStorage和区别?

    cookie

    1. 存储在客户端里面,创建成功之后名称就不能修改

    2. 跨域名是无法共享的,这是由cookie的隐私安全性决定的,遮掩可以防止非法获取其他网站的cookie

    3. 每个域名下面的cookie不能超过20个,大小不可以超过4kb

    4. 存在安全问题,如果被拦截了,就可以获得session的信息,加密也没用。

      使用场景:

      • 结合session使用,将sessionId存储到Cookie中,每次发送请求都会携带sessionId,这样服务端就知道是谁发起的,从而响应数据
      • 可以用来统计页面的点击次数

    LocalStorage

    1. 浏览器缓存,如果不清理会一直存在浏览器中,仅存储在本地。
    2. 受同源政策的限制,端口,协议,主机地址不同都访问不了。
    3. 仅存储在本地,不想cookie每次http请求都会携带
    4. 网站中的一些用户的浏览记录也是存储在localstorage里面,网站中一些不常变动的个人信息也存储在里面。

    sessionStorage

    1. 具有失效性,一般用来存储游客登陆的信息,还有临时的浏览记录的信息,关闭网站的时候,这些信息也被清除了。
    2. 只有在同一个浏览器的同一个窗口下才能共享。
  17. 什么是跨域?

    跨域就是浏览器同源问题策略造成的;

    协议,端口号,域名不一致都会导致跨域请求异常。

  18. 如何处理跨域问题

    1. CORS

    2. JSONP

      jsonp的原理就是利用<script>标签没有跨域限制,通过<script>标签src属性,发送带有callback参数的GET请求,服务端将接口返回数据拼凑到callback函数中,返回给浏览器,浏览器解析执行,从而前端拿到callback函数返回的数据。

      Vue axios实现:

      this.$http = axios;
      this.$http.jsonp('http://www.domain2.com:8080/login', {
          params: {},
          jsonp: 'handleCallback'
      }).then((res) => {
          console.log(res); 
      })
      
    3. nginx代理跨域

      • nginx配置解决iconfont跨域

        浏览器跨域访问js、css、img等常规静态资源被同源策略许可,但iconfont字体文件(eot|otf|ttf|woff|svg)例外,此时可在nginx的静态资源服务器中加入以下配置。

        location / {
          add_header Access-Control-Allow-Origin *;
        }
        
    4. window.name + iframe跨域

      window.name属性的独特之处:name值在不同的页面(甚至不同域名)加载后依旧存在,并且可以支持非常长的 name 值(2MB)。

    5. location.hash + iframe跨域

      实现原理:a欲与b跨域相互通信,通过中间页c来实现。 三个页面,不同域之间利用iframe的location.hash传值,相同域之间直接js访问来通信。

    6. document.domain + iframe跨域

      此方案仅限主域相同,子域不同的跨域应用场景。实现原理:两个页面都通过js强制设置document.domain为基础主域,就实现了同域。

    7. vue框架的跨域

      node + vue + webpack + webpack-dev-server搭建的项目,跨域请求接口,直接修改webpack.config.js配置。开发环境下,vue渲染服务和接口代理服务都是webpack-dev-server同一个,所以页面与代理接口之间不再跨域。

      webpack.config.js部分配置:

      module.exports = {
          entry: {},
          module: {},
          ...
          devServer: {
              historyApiFallback: true,
              proxy: [{
                  context: '/login',
                  target: 'http://www.domain2.com:8080',  // 代理跨域目标接口
                  changeOrigin: true,
                  secure: false,  // 当代理某些https服务报错时用
                  cookieDomainRewrite: 'www.domain1.com'  // 可以为false,表示不修改
              }],
              noInfo: true
          }
      }
      
  19. 为什么vue要使用虚拟dom树

    • 优化性能,通过比较变化,计算最小需要更新的视图,再去操作真是dom,不更新的dom不会重新渲染,
    • 通过diff算法进行同级计算,不跨级别计算,简化次要
    • 比较标签名,不同的标签名直接删除,不再深度比较
    • 相同标签,key相同就认为是相同的节点,不再深度比较
  20. 什么作用域?

    • 全局作用域

      1. 最外层函数和最外层函数外面定义的变量拥有全局作用域
      2. 所有未定义直接赋值的变量自动声明为全局变量
      3. 所有window对象的属性拥有全局作用域
      4. 全局作用域有很大弊端就是,过多的全局作用域变量会污染全局命名空间,容易命名个冲突
    • 函数作用域

      1. 函数作用域声明在函数内部的变量,一般只有固定代码可以访问到
      2. 作用域是分层的,内层作用域可以访问外层作用域,反之则不行
    • 块级作用域

      1. es6中的let和const 指令可以声明块级作用域,块级作用域可以在函数中创建也可以在一个代码块中创建(由{}包裹的代码片段)
      2. let和const不会有变量提升,也不可以重复声明
      3. 在循环中比较适合绑定块级作用域,这样可以把声明的计数器变量限制在循环内部
  21. 什么是作用域链?

    当一个函数在当前作用域中查找一个变量,如果在自己的作用域里面找不到该变量就去父级作用域查找,然后依次向上级作用域查找,直到访问对象到window对象就被终止,这一层层的关系就是作用域链。

    作用域链的作用:保证对执行环境有权访问的所有变量和函数的有序访问,通过作用域链,可以访问到外层环境的变量和函数

  22. 如果给你一张长图你在商品详情里面怎么优化?

  23. 什么是递归?

    递归就是自己调用自己本身,需要有执行条件终止判断,不然会一直调用进入死循环

  24. 递归的使用场景是什么?

    一般用于数据的累加

    比如函数reduce累加器实现原理运用的就是递归方法

  25. 给定你一个数组1-10,请将这个数组随机排序

         function randomArr(arr) {
                 arr.sort(function(a, b) {
                    return Math.random() - 0.5
                })
            }
    
  26. 购物车里面的价格计算一般是写在哪个方法里面?watch还是computed?

    一般是写在computed计算属性里面,使用reduce方法计算

  27. 请使用递归将1-50进行累加

     function add(x){
       return x==0?1:x+add(x-1)
    }
    add(50)
    
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-24 14:50:47  更:2021-10-24 14:53:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/14 3:31:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码