自己整理的初级前端面试题总结(2020年)

初级前端面试题总结

CSS

  1. link标签是同时加载的 ,script标签才会加载完一个再加载另一个。

    • link标签除了可以加载css外,还可以做很多其他的事情,比如定义RSS,定义rel连接属性等,@import只能加载CSS
  2. 你使用过的单位都有哪些?

    • px:相对长度单位。像素px是相对于显示器屏幕分辨率而言的。

    • rpx:微信小程序中有的,宽度分成750块。

    • em:相对于父元素的font-size

    • rem:相对于htmlfont-size

    • vh相对于视口的高度。视口被均分为100单位

      <!DOCTYPE html>
      <html lang="zh-cn">
      <head>
      <meta charset="utf-8" />
      <title>vh_CSS参考手册_web前端开发参考手册系列</title>
      <style>
      p{font-size:5vh;}
      </style>
      </head>
      <body>
      <p>相对于viewport高度大小的文字</p>
      </body>
      </html>
      
    • fr:倍数关系,在网格中会用到,fr讲解,是一个自适应单位,fr单位被用于在一系列长度值中分配剩余空间,如果多个已指定了多个部分,则剩下的空间根据各自的数字按比例分配。

  3. 布局方案都有哪些:

    • table

    • 弹性盒子(CSS 3.0)

    • 网格:

      • 列宽:grid-template-columns: repeat(3,100px);
      • 行高:grid-template-rows: repeat(3,100px);
      • 间距:gap: 10px 10px;
      • 划分区域:grid-template-areas: "a b c" "d e f" "g h i";
    • 圣杯布局:要想左右两栏不遮盖中间栏,就需要中间栏给左右两栏腾些位置处理,可以想到用padding属性或者margin属性来腾位置。圣杯布局是用padding属性来腾位置,而双飞翼布局则是用margin属性,同时要修改下html的布局结构。

      <!DOCTYPE html>
      <html lang="en">
      
      <head>
          <meta charset="UTF-8">
          <title>圣杯布局</title>
          <style type="text/css">
              body {
                  margin: 0;
                  padding: 0;
              }
              header,
              footer {
                  height: 100px;
                  width: 100%;
                  background-color: #BBBBBB;
              }
              .container {
                  height: 300px;
                  padding-left: 200px;
                  padding-right: 300px;
              }
              .container div {
                  float: left;
                  position: relative;
              }
              .left {
                  width: 200px;
                  height: 300px;
                  background-color: #DC698A;
                  margin-left:-100%;
                  left:-200px;
              }
              .middle {
                  width: 100%;
                  height: 300px;
                  background-color: #3EACDD;
              }
              .right {
                  width: 300px;
                  height: 300px;
                  background-color: #8CB08B;
                  margin-left:-300px;
                  right:-300px;
              }
          </style>
      </head>
      <body>
          <!--圣杯布局的思想:
          1. 先实现三栏布局
          2. 然后让中间container持有padding:为了给left,right腾出位置
          3. 接着让left right 相对于 container 定位,左面的块像左移动,left:-left宽度
          -->
          <header>头部</header>
          <div class="container">
              <div class="middle">
                      123333333333333333333333333333333333
              </div>
              <div class="left">左栏</div>
              <div class="right">右栏</div>
          </div>
          <footer>底部</footer>
      </body>
      </html>
      
    • 双飞翼:双飞翼就简单多了

      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>双飞翼布局</title>
          <style type="text/css">
              body {
                  margin: 0;
                  padding: 0;
              }
      
              header,
              footer {
                  height: 100px;
                  width: 100%;
                  background-color: #bbbbbb;
              }
      
              .container {
                  height: 300px;
              }
      
              .container div {
                  float: left;
              }
      
              .left {
                  width: 200px;
                  height: 300px;
                  background-color: #DC698A;
      
                  margin-left: -100%;
      
              }
      
              .middle {
                  width: 100%;
                  height: 300px;
                  background-color: #3EACDD;
              }
              .right {
                  width: 300px;
                  height: 300px;
                  background-color: #8CB08B;
                  margin-left: -300px;
              }
              /* 双飞翼布局 */
              .main{
                  margin-left:200px;
                  margin-right:300px;
              }
          </style>
      </head>
      
      <body>
          <header>头部</header>
          <div class="container">
              <div class="middle">
                  <!--双飞翼的思想:在中间内容区新建一个展示区main,给main以左右的距离-->
                  <div class="main">中间栏</div>
              </div>
              <div class="left">左栏</div>
              <div class="right">右边栏</div>
          </div>
          <footer>footer</footer>
      </body>
      </html>
      
  4. 动画keyframe

  5. CSS3新增有哪些:

    • 变框的属性:圆角border-radius,阴影box-shadow
    • opacity(不透明度)
    • box-sizing(控制盒模型的组成模式)
    • 文本属性:文本阴影,溢出省略 text-overflow:ellipse
    • 背景
    • 文字效果
    • 2d转换
    • 动画
    • 十六进制颜色表示法,及透明度
    • 盒子模型
    • 线性渐变:linear-gradient()
    • 字体图标
    • css过渡:ease,ease-in,east-out,east-in-out
  6. 实现一个三角形:不需要加其他的属性,比方说宽度

    border-width: 20px;
    border-style: solid;
    border-color: transparent transparent transparent pink;
    
  7. 实现一个矩形,旁边有个半圆的缺口:

    • 主要点:伪类

      .box{
          width: 300px;
          height: 100px;
          background-color: pink;
          /*父亲相对*/
          display: flex;
          position: relative;
          align-items: center;
      }
      .box::after{
          /*内容content是关键,不能没有他*/
          content: '';
          width: 50px;
          height: 50px;
          border-radius: 25px;
          background-color: white;
      
          /*孩子绝对定位*/
          position: absolute;
          top: 25px;
          right: -25px;
      }
      
  8. 实现矩形中文字一行,超出部分省略号代替

    .container{
        width: 50px;
        height: 50px;
        background-color: skyblue;
        
        text-overflow: ellipsis;
        overflow: hidden;
        white-space: nowrap;
    }
    
  9. 什么是BFC:块格式化上下文,块盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域

    • 详解:BFC介绍
    • 下列方式会创建 块格式化上下文
      • 根元素(<html>)
      • 浮动元素(元素的 float 不是 none
      • 绝对定位元素(元素的 positionabsolutefixed
      • 行内块元素(元素的 displayinline-block
      • overflow 值不为 visible 的块元素
      • display 值为 flow-root 的元素
      • 弹性元素(displayflexinline-flex元素的直接子元素)
      • 网格元素(displaygridinline-grid 元素的直接子元素)
    • 能够解决什么问题
      • 让浮动内容和周围的内容等高:包裹住浮动的元素,给父元素添加display: flow-root;包裹浮动的元素
      • 外边距塌陷问题:创建新的BFC避免两个相邻 <div> 之间的 外边距合并 问题外边距塌陷
  10. 浮动是什么:脱离原来的文档流。

  11. 如何清除浮动带来的影响

    • clear:both
    • overflow:hidden
  12. 什么是父元素塌陷:

    • 在文档流中,父元素的高度默认是被子元素撑开的,也就是子元素多高,父元素就多高。但是当子元素设置浮动之后,子元素会脱离文档流,此时将会导致子元素无法撑起父元素的高度,导致父元素的高度塌陷。
  13. position都有什么?

    • 绝对定位:absolute
    • 相对定位:relative
    • 粘性定位 sticky
    • 相对父元素定位 inherit
    • 固定定位 fixed
  14. 相对定位是相对谁在定位?

    • 相对于原来的位置定位,原来的位置依然占着空间
  15. 选择器都有哪些?

    • id选择器
    • 类选择器
    • 标签选择器
    • 通配符选择器
    • 子后代选择器
    • 属性选择器
    • 伪类
    • 交集,并集选择器
    • 同级选择器
  16. 选择器的优先级如何计算?

    • !important最高
    • 行内其次
    • id>类>标签>*>继承
  17. 如何取消li的默认样式:list-style:none

  18. 如何制作一个最大的正方形?

    • 重点:padding-bottom: 100%;,用padding撑开,padding-top也可以。
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            *{
                margin: 0;
                padding: 0;
            }
            .box{
                width: 100%;
                background-color: pink;
                padding-bottom: 100%;
            }
    
        </style>
    </head>
    <body>
        <div class="box"></div>
    </body>
    
  19. 响应式:媒体查询

     /*制作一个1.小屏幕下蓝色,2. 中屏幕下绿色,3. 大屏幕下橙色*/
    @media screen and (min-width:1000px){
        html{
            background-color: orange;
        }
    }
    @media screen and (min-width:700px) and (max-width: 1000px){
        html{
            background-color: green;
        }
    }
    @media screen and (max-width:700px){
        html{
            background-color: blue;
        }
    }
    
  20. 雪碧图,也叫css图像精灵

    • 主要点:每个元素都有background-imagebackground-position
    <style>
        .icon{
            width: 23px;
            height: 23px;
            /*border: 1px red solid;*/
            background-image: url("../../Img/icon.gif");
        }
        .icon1{
            background-position: -4px -2px;
        }
        .icon2{
            background-position: -31px -2px;
        }
        .icon3{
            background-position: -58px -2px;
        }
        .icon4{
            background-position: -84px -2px;
        }
        /*扣雪碧图,用浏览器和手去调试*/
        /*块级标签和行内块标签可以,因为他们都有宽高*/
    
    </style>	
    
    <body>
        <div class="icon icon1"></div>
        <div class="icon icon2"></div>
        <div class="icon icon3"></div>
        <div class="icon icon4"></div>
    </body>
    
    
  21. 盒子模型

    1. W3C:开发者定义的 width就是内容区的宽度
    2. 怪异盒子模型:定义的 widthcontent + padding + border的宽度
    3. 转换用 box-sizing: border-box; 默认W3C的 content-box
  22. 导入css的方法

    • <link href="001.css" rel="stylesheet" type="text/css" />
    • @import url("001.css");
  23. Less,Sass

    • 预编译语言:将css变成函数一样,能声明变量

    • CSS3中引入了:calc(),它也可以计算

      width:calc(10 * 10px);
      
    • 我的笔记

    • 宏定义 用关键字 @mixin 函数名(形参){函数体}

    • 宏调用 用关键字 @include 函数名(实参)

  24. 水平、垂直居中的实现方法:

    1. 弹性盒子

      display:flex;
      justfly-concent:center;
      align-item:center;
      
    2. 定位 + 位移

      .fa{
          width: 100px;
          height: 100px;
          background-color: pink;
          
          position: relative;
      }
      .son{
          width: 50px;
          height: 50px;
          background-color: skyblue;
      
          /*这个absolute要写的*/
          position: absolute;
          top: 50%;
          left: 50%;
          transform: translate(-50%, -50%);
      }
      
  25. bs3和bs4栅格有区别吗

    • bs3:浮动
    • bs4:弹性盒子
  26. 左面固定宽,右边自适应

    .left,.right{
        height: 500px;
    }
    .left{
        width: 200px;
        background-color: aqua;
        float: left;
    }
    .right{
        width: 100%;
        background-color: pink;
        /* padding-left: 200px; */
    }
    
  27. 要在IE上做一个圆角:

    1. 把句号,字体放的特别大
    2. 导入 ie-css3.htc
    3. 用图片,这个办法可老好了。

Html

  1. 行级标签:同行显示,不可设置宽高,不可设置margin-top

    • i,strong,span,a,br
  2. 块级标签:隔行显示,可设置宽高,可设置margin-top

    • div,p,h1,ul,li,ol
  3. 行内块都有哪些:imgtextarea,button,input,select

  4. 标签之间的相互转化:display:bolck,inline-block,inline

  5. 语义化标签:headernavfooter

  6. html5新增的有哪些:

    • 语义化,结构标签
    • audio,video
    • canvas
    • 表单标签input
      • email
      • url
      • number
      • range
      • date
    • 媒体标签
      • video
      • audio
      • embed:嵌入内容(包括各种媒体midi),wav,mp3
  7. input的类型都有什么

    • text
    • password
    • button
    • checkbox
    • radio
    • submit
    • files
    • html5 新增的一些:
      • email
      • url
      • number
      • range
      • date
      • month
      • color
  8. Lable 是干什么的?

    • label 尽量与 input 组合使用,点击 label ,就会取 input 框中的焦点。不过 label 中的 for 属性要写成 input 的 id 名字

      <label for="name">用户名</label>
      <input type="text" id="name">
      
  9. 如何禁止input的输入

    • readonly:提交的时候还可以读取到数据
    • disable:提交的时候都拿不到数据
  10. 如何禁止页面的复制(考试系统)

-webkit-user-select: none;
  1. a标签的target都有什么值,都是什么作用?

    <!--_blank新建一个窗口并打开-->
    <a href="http://www.baidu.com" target="_blank">百度_blank</a>
    
    <a href="http://www.baidu.com" target="_self">百度_self</a>
    <a href="http://www.baidu.com" target="_parent">百度_parent</a>
    <a href="http://www.baidu.com" target="_top">百度_top</a>
    
  2. 页面标题栏图片icon

    <link rel="icon" href="" type="image/x-icon" />
    

JS

  1. 变量声明 var,有变量提升。

  2. 函数也有变量提升,但是匿名函数就没有。

  3. 基本数据类型:

    • undefined
    • number
    • boolran
    • string
    • Symbol(ES6)

    复杂数据类型:object

  4. typeof能够返回的值:

    • undefined
    • string
    • number
    • boolean
    • symbol
    • function
    • object,(typeof null == objcet)
  5. JavaScript 内置对象都有哪些:

    • Array
      常用方法作用返回值是否改变原数组
      追加和删除
      arr.push()尾部追加追加后的数组长度改变
      arr.pop()尾部删除删除的元素改变
      arr.shift()头部删除删除的元素改变
      arr.unshift()头部追加追加后的数组长度改变
      拼接及切割
      arr.join()数组内元素拼接String
      arr1.concat(arr2)数组之间拼接拼接后的新数组
      arr.slice()切割切割的数组(左开右闭)
      arr.splice()切割切割的数组(左闭右闭)改变
      排序
      arr.sort()排序排序后的数组改变
      arr.sort((x,y) => x-y)从小到大排序排序后的数组改变
      arr.sort((x,y) => y-x)从大到小排序排序后的数组改变
      其他
      arr.reverse()翻转翻转后的数组改变
      arr.flat(层数|Infinity)拍平数组拍平后的数组
      arr.forEach((each, index, array)=>{})遍历--
    let arr = ['一','二','三','四'];
    console.log(arr.splice(2,3));	// (2) ["三", "四"]
    console.log(arr);	// (2) ["一", "二"]
    
    let arr = ['一','二','三','四'];
    console.log(arr.slice(2,3));    // ["三"]
    console.log(arr);       // (4) ["一", "二", "三", "四"]
    
    • string

      常用方法作用返回值其他说明
      分割
      str.split()字符串分割成数组数组-
      str.substring(startPos,endPos|)字符串截取字符串第二个参数规定截取结束的位置,默认是字符串尾部。
      查找
      str.charAt()根据下标找元素,如果越界的话返回空字符串寻找的元素
      str.indexOf()根据元素,找下表,如果查找不到返回 -1下标第一个’要查找的元素’,起始位置
      str.search('b')根据元素找下表下标-
      str.match(/\d+/g)参数可以是字符串或者正则表达式数组
      str.startsWith('ab')从字符串开头寻找布尔值注意:不是包含关系,一定是要在头部开始的,ends同理
      str.endsWith()从字符串尾部寻找布尔值-
      str.includes('ab')str中是否包含'ab'布尔值
      去空格
      str.trim()去掉字符串前后的空格新字符串str.replace(/^\s*|\s*$/g,'')
      str.trimStart()去前空格新字符串str.replace(/^\s*/g, '')
      str.trimEnd()去尾空格新字符串str.replace(/\s*$/g, '')
      str.replace(/\s/g, '')去除所有空格新字符串
      转换
      str.toLowerCase()转小写小写字符串
      str.toUpperCase()转大写大写字符串
      补全
      str.padStart(8,"xy")str字符串,从头开始,用xy补足长度尾8。返回补足后的新字符串
      str.padEnd(8,"xy")str字符串,从尾开始,用xy补足长度尾8。返回补足后的新字符串
      其他
      str.repeat(4)重复重复后的新字符串不会改变原字符串
    • number

      • Number.parseInt(); 取整
      • Number.parseFloat(); 保证是小数
      • Number.isInteger(); 判断是否为整数
    • boolean

    • RegExp:字符串匹配

      • 判断是否是电话号码 :

        var CheckIsPhoneNumber = /^1[34578]{1}[1-9]{1}[0-9]{8}$/;
        // 解释:第一位手机号都应该是 1,第二位手机号应该是在 3、4、5、7、8 中选一位,第三位手机号不会是 0(自己规定的条件,实际不考虑?) ,后八位可以是 0~9 的任意数。
        
    • Math:数学

      • 没有 new 方法
      • var PI = Math.PI; 不希望改的值一定要大写—ES5 的行规,但是值能改
      • var VERSION = "1.0"; 说明版本
      • 随机数的产生:语法为 Math.random(),这个值是(0,1),左开又开的,也就是说永远都不会取到 0 和 1
    • Date:日期

      • date.getFullYear(); 年份
      • date.getMonth(); 月份
      • date.getDate();
      • date.getHours();
      • getMinutes();
      • getSeconds();
  6. this的指向:最终调用者

  7. 箭头函数this的指向:和上一层作用域的this的指向一样

  8. 延时定时器,周期定时器

  9. promise().then().catch(),解决回调地狱的问题

  10. rest参数,在参数里(…arr),接收不知道个数的参数。

  11. 拓展运算符:…[1,2,3,4],拆开数组

  12. 解构赋值:var {log:l} = console

    let [a,b,c] = [1,2,3];
    console.log(a);
    console.log(b);
    console.log(c);
    
    //1
    //2
    //3
    
  13. 结构解析

    let {c,a}  = {b:"6666",a:"555"};
    console.log(a);
    console.log(c);
    
    //555
    //undefined
    
  14. 原生节点操作

    • 创建游离元素:var div = document.createElement("div");
    • 插入节点:
      • document.body.appendChild(div);
      • ul.insertBefore(creat_li,li2);,在 li2 前面插入 creat_li,注意 ulcerat_li父子关系
    • 克隆节点:li1.cloneNode(true),克隆有参数,true的话标签内容也会克隆,克隆的元素是游离的。
    • 删除节点:ul.removeChild(li1)
    • 节点查找
      • 查找父亲节点:ul.parentNode
      • 查找子节点中的第一个:ul.firstElementChild
      • 查找子结点中的最后一个:ul.lastElementChild
      • 查找兄弟节点中的上一个:ul.previousElementSibling(如果不加Element的话会输出#text,也就是找到空格,看你格式怎么写了)
      • 查找兄弟节点中的下一个:ul.nextElementSibling()
  15. JQuery的优点

    • 轻量
    • 强大的选择器
    • 完善的Ajax
    • 链式操作方法
    • 隐式迭代
  16. Jquery 可以绑定多个事件嘛?:可以

    $("table.planning_grid").on({ 
        mouseenter: function() { 
            // Handle mouseenter... 
        }, 
        mouseleave: function() { 
            // Handle mouseleave... 
        }, 
        click: function() { 
            // Handle click... 
        } 
    }, "td");
    
  17. JQuery绑定点击事件

    • $().click()
  18. JQuery节点操作

    • 创建节点:创建一个游离对象 $("<p>nihao</p>") ,然后插入

    • 插入节点:

      • append()appendTo()

        /*append 是在 box 里面的最后一位插入*/
        $("#box").append("<div>append方法</div>");
        
        $("<p>append to 方法</p>").appendTo("#box");
        
      • $("#box").prepend("<div>prepend方法</div>");

  19. JQuery动画

    • show()

    • hide()

    • 动画执行速度 speed:有三个初始的,分别是 fast、normal、slow ,时常分别是 200、400、600 毫秒,默认是 normal

    • 过度效果 easing:一种是 swing,这个是有加速度的变化,先加速,在减速
      另一种是 linear,就是线性变化,匀速变化

    • 成功回调函数 callback:当动画执行 完毕 之后才执行这个函数
      多的知识点:还有一种函数叫做 handler 处理函数,这个只要发生了,就开始执行,比方说点击事件

    • $("#div1").hide(5000,"linear",function () {
          console.log(1);
      });
      
  20. JQuery取消$符号的控制权:$.noConflict()

    • var otherName = $.noConflict() ,之后可直接使用otherName来代替$.
  21. 隐式迭代:在方法的内部会为匹配到的所有元素进行循环遍历,执行相应的方法,而不用我们再进行循环,简化我们的操作,方便我们调用

  22. JQuery对象Dom对象之间的互相转化?

    1. 转化成dom:数组下标,$("div")[0]
    2. dom 转化成 jQuery:$(dom对象)
  23. 在高版本的jquery引入prop方法后,什么时候该用prop?什么时候用attr?它们两个之间有什么区别?

    关于它们两个的区别,网上的答案很多。这里谈谈我的心得,我的心得很简单:

    • 对于HTML元素本身就带有的固有属性,在处理时,使用prop方法。

    • 对于HTML元素我们自己自定义的DOM属性,在处理时,使用attr方法。

      <input id="chk1" type="checkbox" />是否可见
      <input id="chk2" type="checkbox" checked="checked" />是否可见
      
      <script>
          // 像checkbox,radio和select这样的元素,选中属性对应“checked”和“selected”,这些也属于固有属性,因此需要使用prop方法去操作才能获得正确的结果。
          $("#chk1").prop("checked") == false
          $("#chk2").prop("checked") == true
      
          // 如果上面使用attr方法,则会出现:
          $("#chk1").attr("checked") == undefined
          $("#chk2").attr("checked") == "checked"
      </script>
      
  24. Jquery给节点加类:jq.addClass()

    $("#div1").addClass("colorSkyblue");
    

    删除类:关键字:removeClass()

    $("#div1").removeClass("colorSkyblue");
    

    切换类:关键字:toggleClass()

    $("button").click(function () {
        $("#div1").toggleClass("colorRed");
    })
    
  25. JQuery请求ajax,如何实现同步?

    $.ajax({
        url: "/greet",
        data: {name: 'jenny'},
        type: "POST",
        async: false,
        // async:是否异步处理,bool表示,默认为true;设置该值为false后,JS不会向下执行,而是原地等待服务器返回数据,并完成相应的回调函数后,再向下执行
        dataType: "json",
        success: function(data) {
            // data = jQuery.parseJSON(data);  //dataType指明了返回数据为json类型,故不需要再反序列化
            ...
        }
    });
    
  26. Jquery手动迭代

    // 参数一表示当前元素在所有匹配元素中的索引号
    // 参数二表示当前元素(DOM对象)
    $(selector).each(function(index,element){});
    
  27. 冒泡与捕获

    • 如果有捕获的话,优先捕获
    • 如何设置捕获:默认为false,true为捕获
    • 取消冒泡/捕获的方法:e.stopPropagation()
    • 事件委托
  28. 算法:

    • 排序:冒泡,快速排序
    • 查找:二分查找
  29. 防抖节流的设计:并不希望在事件持续触发的过程中那么频繁地去执行函数

    • 简书上的教程

    • 防抖:

      • 就是指触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。

        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <title>Title</title>
            <style>
                *{
                    margin: 0;
                    padding: 0;
                }
        
        
            </style>
        </head>
        <body>
            <div id="content" style="height:150px;line-height:150px;text-align:center; color: #fff;background-color:#ccc;font-size:80px;"></div>
        
        </body>
        <script>
            let num = 1;
            let content = document.getElementById('content');
        
            function count() {
                content.innerHTML = num++;
            };
            content.onmousemove = debounce(count,1000);
        
            function debounce(func, wait) {
                let timeout;
                return function () {
                    let context = this;
                    let args = arguments;
        
                    if (timeout) clearTimeout(timeout);
        
                    timeout = setTimeout(() => {
                        func.apply(context, args)
                    }, wait);
                }
            }
        </script>
        </html>
        
    • 节流:

      • **所谓节流,就是指连续触发事件但是在 n 秒中只执行一次函数。**节流会稀释函数的执行频率。
      • 对于节流,一般有两种方式可以实现,分别是时间戳版和定时器版。
  30. JS有什么组成的

    1. ECMA JavaScript
    2. BOM:浏览器模型,window
      1. history
      2. navigator
      3. document
      4. iframe
      5. screen
      6. location
    3. DOM节点模型
  31. 兼容

    1. IE6、7、8:attachEvent()
    2. 其他:addEventListener()
  32. 隐式转换

    123 + ''
    '123' - 0
    + '123'
    
  33. 惰性求值:走不走默认值

  34. 如何去除字符串中的空格:trim

  35. 如何数组中的元素去重:排序之后,一遍过滤

  36. 如何给数组元素排序,默认按照什么排的序?

    • sort方法
    • 按照 asc2码
  37. 模板字符串,魔术字符串:

  38. 对象冻结:Object.freeze

    const obj = Object.freeze(
        {name:"张三"}
    );
    
  39. ES6新增的数据结构:

    1. set:元素不会重复
    2. map:键值对,其中键可以不是string了
  40. ES6新增的数据类型:symbol:独一无二的,可以添加描述

  41. es5中类的都有哪些

    1. 构造函数
    2. 原型
    3. 工厂模式
  42. es6中类介绍一下:

    • 语法糖
    • 本质还是类
    • 其中设计的方法是挂载在原型上
    • 默认会创造一个constructor
    • 没有提升
  43. 元编程,proxy,代理

    • 建立过滤器

      //建立过滤器
      var proxy = new Proxy(target,handler);
      
    • 修改读操作

      var obj = {
          name :"霍金"
      };
      //建立 Proxy 过滤器
      var proxy = new Proxy(obj,{
          //当你在这里写了get的时候,就已经开始修改读取的方法了
          //所有的读取都走get语句,现在语句里啥都没有,所以 proxy.name 是 undefined
          get() {
      
          }
      });
      
      //通过代理来访问obj中的name属性
      console.log(proxy.name);
      //undefined
          
      
  44. function*

    • 这里新出了个关键词 yield ,类似一个暂停符,到底有啥用请看下面的例子

    • 生成器函数

      function* test() {
          yield "我是第一句";
          //yield相当于暂停符号,一步一步的执行,要用 next 手动执行这个玩意儿
      
          yield "我是第二句";
          return "yes";
      }
      var t = test();
      
      console.log(t);
      //test {<suspended>}
      
      console.log(t.next());
      //{value: "我是第一句", done: false}
      
      console.log(t.next());
      //{value: "我是第二句", done: false}
      
      //跟指针一样一直下移
      console.log(t.next());
      //{value: "yes", done: true}
      
      console.log(t.next());
      //{value: undefined, done: true}
      
  45. 继承都有哪些方法:

    • call

    • apply

      //call 和 apply的使用例子
      <script>
          function Person() {
              this.name = "xiaopang",
              this.age = 19
          }
          function show(str1,str2) {
              console.log(this.name + this.age + "hahhaa" + str1 + str2);
          }
          var p = new Person();
          /*show继承了p*/
          /*call方法直接用逗号隔开*/
          show.call(p,"政府","你妹妹");
      
          /*apply方法是用数组*/
          show.apply(p,["string1","string2"]);
          
          //输出
          //xiaopang19hahhaa政府你妹妹
          //xiaopang19hahhaastring1string2
      </script>
      
      
    • bind()

  46. 伪数组想要使用数组的方法,如何实现?

    • Array.from()

    • ;[].forEach.call(li,function (x) {
          console.log(x);
      })
      
  47. 原型和原型链解释一下:我的解释。

  48. this的指向:我的this讲解

  49. window.onload$(document).ready()有什么区别?

    • window.onload是等到所有元素,包括图片等资源都加载完之后才会执行
    • $(document).ready()是等到dom树渲染完毕就可以执行了
  50. dom选择器

  51. 什么叫字面量

    • 字面量(literal)是用于表达源代码中一个固定值的表示法。const int b = 10; //b为常量,10为字面量
  52. 严格模式是什么

    • use strict

      function f(){
      
          "use strict";
      
          this.a = 1;
      
      };
      
      f();// 报错,this未定义
      
  53. promise是什么

    • 时序:then中的函数被放到了微任务队列,而不是立即执行,等事件队列被清空之后再继续执行
    • 链式操作
    • 好处
    • promise.all([]).then()
    let promise = new Promise((resolve, reject) => {
        if (1) {
            resolve('操作成功');
        } else {
            reject('操作异常');
        }
    });
    
    function requestA() {
        console.log('请求A成功');
        return 'A请求的结果';
    }
    function requestB(res) {
        // 通过res来获得上一个返回来的结果
        console.log('上一步的结果:' + res);
        console.log('请求B成功');
        return 'B请求的结果';
    }
    function requestC(res) {
        console.log('上一步的结果:' + res);
        console.log('请求C成功');
    }
    function requestError() {
        console.log('请求失败');
    }
    
    //then处理操作成功,catch处理操作异常
    promise.then(requestA)
        .then(requestB)
        .then(requestC)
        .catch(requestError);
    // 请求A成功
    // 上一步的结果:A请求的结果
    // 请求B成功
    // 上一步的结果:B请求的结果
    // 请求C成功
    
    
  54. 深拷贝和浅拷贝

    • 深拷贝:深拷贝会开辟新的栈内存,原对象和新对象不共享同一块内存,修改新对象不会影响到原对象。

      1. JSON.parse(JSON.stringify())

        var iniArr = [1,2,{name:"peter"},function(){}];
            var newArr = JSON.parse(JSON.stringify(iniArr));
            newArr[1] = 8;
            newArr[2].name = "lily";
            console.log('JSON.parse(Json.stringfiy()):iniArr,newArr',iniArr,newArr);
        
        • JSON.stringify将对象转成JSON字符串,再用JSON.parse()把字符串解析成对象。一去一来,新的对象产生了,而且对象会开辟新的栈,实现深拷贝。
        • 这种方法虽然可以实现数组或对象的深拷贝,但不能处理函数。因为JSON.stringify() 方法是将一个JavaScript值(对象或者数组)转换为一个 JSON字符串,不能接受函数
      2. 递归

      3. JQuery

      4. extend()

    • 浅拷贝

      1. object.assign()
      2. slice
      3. concat
  55. oxFF ^ 33的结果

    • 关于进制转化和亦或计算的题

    • FF是十六进制,转成10进制为15*16 + 15 = 255,转成十进制111111111

    • 不同的为1,相同的为0

      	// tostring() 是用来把十进制 => 其他进制
      	// parseInt(x,2)  把 二进制 x => 十进制
      	33 //	 100001
      	255 // 11111111
      		// 11011110	异或之后的结果
      	var x = 255;	// 	
      	console.log(x.toString(2));
      	console.log(parseInt(11011110,2));
      
  56. 表单提交,get请求获取传递的数据

<body>
    <!-- a页面 -->
    <form action="b.html" method="get">
        <input type="text" name="wangxiaoming"/>
        <input type="submit" value="提交">
    </form>
</body>
// b页面
<script>
    console.log(window.location.href.split('?')[1]);
</script>
  1. 找到页面中所有的CheckBox

    • 考点:属性选择器
    var checkBox = document.querySelectorAll('input[type=checkbox]')
    console.log(checkBox);
    
  2. 循环一个对象的方法:

    var obj = {
        "你好1":1,
        "你好2":2,
    }
    for(x in obj){
        console.log(x);
    }
    
  3. cookie

    1. 能保存什么样的数据:键值对
    2. 怎么存中文:urlEncoder
    3. 默认的声明周期:浏览器关闭时
  4. 什么是闭包,以及优缺点

    1. 介绍:闭包就是能够读取其他函数内部变量的函数。
    2. 优点:一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中,不会在f1调用后被自动清除。
    3. 缺点:内存消耗大,不能滥用闭包,否则会造成网页的性能问题,内存泄漏
  5. 前端的优化

    1. 减少http请求

    2. 减小资源体积

    3. 控制 js 代码的体积以及按需加载

    4. 避免全局查找

    5. 避免在document上直接进行频繁的DOM操作

    6. 使用classname代替大量的内联样式修改

    7. 适当使用canvas

    8. 是尽量少使用css层级关系:因为css的规则是从右往左的。为什么CSS选择器是从右往左解析

      /* 尽量不要写成这样 */
      #div P.class {
          color: red;
      }
      
      /* 应该写成这样 */
      .class {
          color: red;
      }
      

      同时,这也是不建议使用*通配符来进行样式匹配的原因:浏览器专门建立了一个反常规思维的从右往左的匹配规则就是为了避免对所有元素进行遍历,你直接一个通配符等于之前的工作都白做了。

  6. 创建的游离元素会在dom上吗?

  7. 什么是函数柯里化?

    • 是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

    • 看一个简单的栗子

      // 普通的add函数
      function add(x, y) {
          return x + y
      }
      
      // Currying后
      function curryingAdd(x) {
          return function (y) {
              return x + y
          }
      }
      
      add(1, 2)           // 3
      curryingAdd(1)(2)   // 3
      
  8. 定时器类别

    1. 延时定时器:只触发一次

    2. 定时器:周期性的触发

    3. 如何清除定时器

      var set = setTimeout(function () {
          console.log(1);
      },1000);
      clearInterval(set);
      // 延时定时器和定时器都可以这样清除
      
  9. 创建的游离元素在哪儿?会在dom上嘛?

    • 游离元素是在dom上的,并不在html上,是在html之外的

微信小程序

  1. 跳转都有哪些方法

    • wx:navigateTo
    • wx:redirectTo
  2. 点击li变色

  3. 对外暴露怎么实现,如何引用

    //比方说我要暴露这个 testA 的函数,让他在别的 js 中也能调用
    let {log:l} = console;
    

function testA(){
l(“testA()”,1);
}
//对外暴露方法 module.exports.给对外暴露的方法起名字 = 想要调用的方法
module.exports.testA = testA;


```javascript
//这个写在Page外面
let container = require("a.js");  //先写引用的路径,把模块保存到container里

//这个可以写在 onLoad 里测试一下
container.testA();  //调用这样调用,模块.函数名
  1. 小程序的网络请求

    wx.request({
        url: 'http://192.168.199.234:8080/mwk/phoneCode',
        data: {
            userPhone: this.data.idName
        },
        method: 'get',
        success: function(res) {},
        fail: function(res) {},
        complete: function(res) {},
    })
    
  2. 小程序是如何保存页面的

  3. 微信小程序网络请求默认同步还是异步,可以改变吗

    • 异步的,不可改变

混合开发

  1. 移动应用开发的三种方式
    • Native App: 本地应用程序(原生App)
    • Web App:网页应用程序(移动web)
    • Hybrid App:混合应用程序(混合App):美团,爱奇艺,微信
  2. web 应用
    • 优点
      • 不需要下载,不需要安装,保证最新版本
      • 对于开发者相对简单
    • 缺点
      • 浏览器提供的api,大部分系统级硬件不能用
      • 性能不如原生
  3. 混合开发:native app 和 web app 的结合,最外有层壳(原生),里面放的网页系统提供的 Webview(网页渲染控件)
    • 优点
      • 兼容多平台
      • 顺利访问手机多种功能
      • App stroe中可以下载(web应用中套原生应用的外壳)
    • 缺点
      • 不确定上线时间
      • 用户体验不如本地应用
      • 性能较慢

Vue

  1. 组件之间的通信

    • 父传子:props

      • props对象{}如何设置必填项

        props: {
          items: {  // 必须提供字段
            required: true,
            default: 3,
            type: Array
          }
        }
        
    • 子传父:自定义事件this.$emit()

    • 父子链:

      this.$parent.message
      
    • 中央事件总线在这里插入图片描述

  2. 组件命名要求

    • 首字母大写命名
    • 短横线分割命名
  3. Vue的声明周期:8个,创建前后,挂载前后,更新前后,销毁前后

  4. 什么是MVVM

    • 模型,视图,视图模型
  5. 双向绑定的原理:数据劫持+发布者,订阅者模式

  6. vue网络请求Axios如何设计

    // 这里的指针是为了在axios里使用组件里的参数
    let _this = this;
    
    // 前台发送请求
    axios.get('http://localhost:3000/register', {
      params: {
        username:this.username,
        psw:this.psw
      }
    })
      .then(function (response) {
        // 提示注册成功
        // axios 中的this需要定向
        // console.log(response);
        if (response.data == '200'){
          _this.$message({
            message: `${_this.username}注册成功`,
            type: 'success'
          })
        }
      })
      .catch(function (error) {
      	// 抓取错误
        console.log(error)
      })
    
    
  7. 插槽的作用:在于内容的分发

  8. 路由是什么,如何使用

    • 制作路由连接:<router-link to="/shangcheng">商城</router-link>
    • 制作路由展示:<router-view></router-view>
    <script src="./node_modules/vue/dist/vue.js"></script>
    <script src="./node_modules/vue-router/dist/vue-router.js"></script>
    <body>
    	<div id="app">
    		<router-link to="/shangcheng">商城</router-link>
    		<router-link to="/shuma">数码</router-link>
    		<router-link to="/jiaju">家具</router-link>
    		<router-view></router-view>
    	</div>
    </body>
    <script>
    	var sc = { template:`<h1>商城组件</h1>` }
    	var sm = { template:`<h1>数码组件</h1>` }
    	var jj = { template:`<h1>家具组件</h1>` }
    	var router = new VueRouter({
    		routes:[
    			// redirect 重定向
    			{ path: '/',redirect: '/shuma' },
    			{ path: '/shangcheng',component: sc},
    			{ path: '/shuma',component: sm},
    			{ path: '/jiaju',component: jj}
    		]
    	})
    	var app = new Vue({
    		el:"#app",
    		router,
    	})
    </script>
    
    
  9. 路由的重定向:

    var router = new VueRouter({
        routes:[
            // redirect 重定向
            { path: '/',redirect: '/shuma' },
            { path: '/shangcheng',component: sc},
            { path: '/shuma',component: sm},
            { path: '/jiaju',component: jj}
        ]
    })
    
  10. 动态组件

    • component 标签上有个属性is,里面填写组件的名字

      在这里插入图片描述

  11. Vue中的 v-key是什么:

    • 元素复用
    • 虚拟DOM的Diff算法,其核心是基于两个简单的假设:1. 两个相同的组件产生类似的DOM结构,不同的组件产生不同的DOM结构。2. 同一层级的一组节点,他们可以通过唯一的id进行区分。
    • 总结一句话:为了更好的让Vue更新虚拟Dom,key来给每个节点做一个唯一标识。
    • 影响:如果不加上标识的话,在插入的时候会发生错误
  12. v-model用于哪些地方

    • input
    • textarea
  13. v-ifv-show 的区别

    • v-show 就简单得多——不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS 进行切换。display: none;
    • v-if 是“真正的”条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。
  14. data里的数据名和methods里的方法名相同会怎样?换位置也不会改变报错信息。
    会报错:Method "message" has already been defined as a data property.

  15. 有没有情况template不可用?

    • v-show

    • 补充:如果v-show里面的条件不对的话,页面渲染的时候会使用display:none把他隐藏掉

  16. v-on可以绑定多个事件吗?可以

    <div @click="fn1(),fn2()">点我</div>
    
  17. Vue-x:状态管理

  18. 服务器渲染

  19. 想请求一个插件或者api在哪个什么周期加最合适:

    • 看项目需求:如果希望在data加载完之前就要加载完API的话…

网络知识

  1. 什么是跨域

    • 同源:协议,域名,端口号都相同。

    • 同源策略是浏览器的一个安全限制,从一个源加载的文档或者脚本默认不能访问另一个源的资源。例如a.com/111/html页面不能访问b.com/person这种接口,因为他们是不用的源。

    • 注意:下面几个不受同源策略限制
      1、页面中链接(例如页面的W3School)、重定向和表单提交不受同源策略限制
      2、跨域资源的引入是不受同源策略的限制,但是js读不到其中的内容。<script src="..."></script>,<img>,<link>,<iframe>等。

  2. 如何解决跨域问题:

    1. 前端使用JSONP

    2. 后端设置响应头

      res.header('Access-Control-Allow-Origin', '*')    
      
  3. HTTP状态码:

    • 参考网址

    • 1**:服务器收到请求,需要请求者继续执行操作

    • 2**:成功,操作被成功接收并处理

    • 3**重定向,需要进一步的操作以完成请求

      • 301 :永久重定向
      • 302:临时移动
    • 4**客户端错误,请求包含语法错误或无法完成请求

      • 401:请求要求用户的身份认证
      • 403:服务器拒绝
      • 404:找不到资源
    • 5**服务器错误,服务器在处理请求的过程中发生了错误

      • 500:服务器内部错误,无法完成请求
  4. 什么是HTTP,跟HTTPS有什么区别

  5. 什么是证书:

    1. 对称加密
    2. 非对称加密
    3. 哈希(客户端数字摘要算法,本地数字签名)
    4. 证书
  6. get 和 post 的区别

    • GET - 从指定的资源请求数据,携带的数据在url里,以?分割。

    • POST - 向指定的资源提交要被处理的数据,携带的数据在响应body里。

    • GETPOST
      后退按钮/刷新无害数据会被重新提交(浏览器应该告知用户数据会被重新提交)。
      书签可收藏为书签不可收藏为书签
      缓存能被缓存不能缓存
      编码类型application/x-www-form-urlencodedapplication/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。
      历史参数保留在浏览器历史中。参数不会保存在浏览器历史中。
      对数据长度的限制是的。当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。无限制。
      对数据类型的限制只允许 ASCII 字符。没有限制。也允许二进制数据。
      安全性与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。在发送密码或其他敏感信息时绝不要使用 GET !POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。
      可见性数据在 URL 中对所有人都是可见的。数据不会显示在 URL 中。
  7. 当在地址栏里输入url之后,敲回车会发生什么?

    1. DNS域名解析
    2. 建立TCP连接
    3. 发起HTTP请求
    4. 接收响应结果
    5. 浏览器解析HTML
    6. 浏览器布局渲染

Webpack

  1. webpack是做什么的:静态模块打包器

  2. 如何打包处理页面中的图片资源

    • url-loader

    • 还需要一个file-loader

      // webpack.config.js
      const { resolve } = require('path')
      const HtmlWebpackPlugin = require('html-webpack-plugin')
      module.exports = {
      	entry: './src/index.js',
      	output:{
      		filename: 'bulit.js',
      		path: resolve(__dirname, 'build')
      	},
      	module:{
      		rules:[
      			{
      				test: /\.less$/,
      				use:[
      					'style-loader',
      					'css-loader',
      					'less-loader'
      				]
      			},
      			{
      				// 问题:处理不了	html中的图片
      				test: /\.(jpg|png|gif)$/,
      
      				// 需要下载两个包 url-loader file-loader
      				// cnpm i url-loader file-loader
      				// 如果用到一个loader可以这么写,前面并不是use
      				loader: 'url-loader',
      				options: {
      					// 图片大小小于8kb,就会被base64处理
      					// 优点: 减少请求数量(减轻服务器压力)
      					// 缺点: 图片体积会更大(文件请求速度更慢)
      					limit: 8 * 1024,
      					esModule: false,
      					// 给图片进行重命名
      					// 取图片hash值的前十位
      					// ext取图片的原扩展名
      					name: '[hash:10].[ext]'				}
      
      			},
      			{
      				test: /\.html$/,
      				// html-loader是 专门处理html  中的 img的
      				loader: 'html-loader'
      			}
      		]
      	},
      	plugins: [
      		new HtmlWebpackPlugin({
      			template:`./src/index.html`
      		})
      	],
      	mode: 'development'
      }
      
      
  3. es6语法转换成es5语法:babel

Node

  1. 什么是Node
    • 基于chrome的v8引擎的JavaScript运行时

vue-cli

  1. vue脚手架项目目录结构介绍:

    src
        - componment
        - assets
    public
    node_modules
    
  2. 简介:Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统

  3. 路由里重定向:

    const router = new VueRouter({
      routes: [
        { path: '/a', redirect: '/b' }
      ]
    })
    

人事HR面试

  1. 如何看待跳槽
  2. 你的前领导怎么样:不错

. 如何打包处理页面中的图片资源

  • url-loader

  • 还需要一个file-loader

    // webpack.config.js
    const { resolve } = require('path')
    const HtmlWebpackPlugin = require('html-webpack-plugin')
    module.exports = {
    	entry: './src/index.js',
    	output:{
    		filename: 'bulit.js',
    		path: resolve(__dirname, 'build')
    	},
    	module:{
    		rules:[
    			{
    				test: /\.less$/,
    				use:[
    					'style-loader',
    					'css-loader',
    					'less-loader'
    				]
    			},
    			{
    				// 问题:处理不了	html中的图片
    				test: /\.(jpg|png|gif)$/,
    
    				// 需要下载两个包 url-loader file-loader
    				// cnpm i url-loader file-loader
    				// 如果用到一个loader可以这么写,前面并不是use
    				loader: 'url-loader',
    				options: {
    					// 图片大小小于8kb,就会被base64处理
    					// 优点: 减少请求数量(减轻服务器压力)
    					// 缺点: 图片体积会更大(文件请求速度更慢)
    					limit: 8 * 1024,
    					esModule: false,
    					// 给图片进行重命名
    					// 取图片hash值的前十位
    					// ext取图片的原扩展名
    					name: '[hash:10].[ext]'				}
    
    			},
    			{
    				test: /\.html$/,
    				// html-loader是 专门处理html  中的 img的
    				loader: 'html-loader'
    			}
    		]
    	},
    	plugins: [
    		new HtmlWebpackPlugin({
    			template:`./src/index.html`
    		})
    	],
    	mode: 'development'
    }
    
    
  1. es6语法转换成es5语法:babel

Node

  1. 什么是Node
    • 基于chrome的v8引擎的JavaScript运行时

vue-cli

  1. vue脚手架项目目录结构介绍:

    src
        - componment
        - assets
    public
    node_modules
    
  2. 简介:Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统

  3. 路由里重定向:

    const router = new VueRouter({
      routes: [
        { path: '/a', redirect: '/b' }
      ]
    })
    

人事HR面试

  1. 如何看待跳槽
  2. 你的前领导怎么样:不错
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值