0%

前端面试复习

学习ssh大佬的文章

HTML

https://rainylog.com/post/ife-note-1/

1.语义化

  • 语义化标签,易修改易维护,无障碍阅读支持,利于SEO

    SEO:搜索引擎优化(技术:语义化H5;撰稿:使用访问者词汇,图文并茂;声望:其他站点的链接)

  • 结构语义化

    他们不对内容有什么本质的影响,只是页面结构规范

  • 头部<header>

    用法一:标注内容的标题

    用法二:页面的页眉

  • 导航栏<nav>

    两种用法

    ><!-- 案例一 -->  一组只是链接的附加内容
    ><nav>
    <!-- 此处是链接 -->
    <aside></aside>
    <aside></aside>
    ></nav>
    ><!-- 案例二 -->  附加内容中除了链接还有其他模块
    ><aside>
    <nav>
      <!-- 此处是链接 -->
    </nav>
    <section></section>
    <div></div>
    ></aside>
  • 附注<aside>

    它不仅仅是侧栏,也表示周围和主要文本没有密切关系的内容,说明附加内容,解释说明,相关链接等

    • 通常为广告区域,搜索,分享链接
    • 其中的<section>规定一个带有标题的区域(与主题内容并列显示的小块区域,独立内容(如:表单),文章分类区块)
  • 页脚<footer>

    常包含版权信息,法律限制等之类的文本或链接。

    >// 含有其他内容时
    
    ><div>
    <aside>
    <!-- 其它内容 -->
    </aside>
    
    <footer>
      <!-- 法律、版权、来源、联系信息等 -->
    </footer>
    ></div>
  • 主要内容<main>

    标识主体内容,通常是<body>的子标签,可以帮助屏幕阅读工具识别页面主要部分

  • 文章<article>

    应该包含完整的标题,文庄署名,发布时间,正文

    • 文章中包含插图时,使用新的 语义化标签<figure>
    ><article>
    <h1>标题</h1>
    <p>
      <!-- 内容 -->
    </p>
    <figure>
      <img src="#" alt="插图">
      <figcaption>这是一个插图</figcaption>
    </figure>
    ></article>

    <img>alt属性可以略去

    <figcaption>应该被放置在<figure>的第一个或最后一个)

CSS基础面试题

1.50道CSS基础题

https://segmentfault.com/a/1190000013325778

  1. 标准css盒子模型,低版本IE盒子模型区别

    • box-sizing
    • JS获取盒子模型对应宽高(dom.style.width内联样式;window.getComputedStyle(dom.width实际样式大小;dom.getBoundingClientRect().width通过视口距离实际大小)
    • 父子边距重叠(父元素设置BFC)兄弟元素重叠(给下面的套个BFC父盒子;下面的设置inline-box)
  2. css选择器有哪些?那些属性可以继承?优先级?

  1. 如何居中div?居中一个浮动元素?居中一个绝对定位元素

  2. display有哪些值?

  3. position的值?

  4. CSS3新特性?

  5. Flexbox?

  6. CSS三角?

  7. 常见兼容性问题(默认内外边距?Chrome中文文本>=12px?超链接失效?love hate

  8. 为什么要初始化CSS样式?

  9. absolute的containing block计算方式?

  10. 不同浏览器下,visibility属性的collapse属性值的区别?(hidden,visible)

  11. display:none和visibility:hidden区别?

  12. position,display,overflow,float属性重叠会?

  13. 对BFC规范的理解(块级格式化上下文block formatting context)?BFC

  14. 浮动?清除浮动?

  15. 上下外边距重合?

  16. 设置元素浮动后,元素的display值是?

  17. 移动端布局使用过媒体查询嘛?媒体查询

  18. css预处理器less,sass

  19. css优化提高性能的方法?

  20. 浏览器是怎样解析CSS选择器的?

  21. 在网页中一个使用奇数还是偶数的字体?

  22. margin和padding分别适合在什么场景?

  23. 元素竖向的百分比设定是相对于容器的高度嘛?

  24. 全屏滚动

  25. 响应式设计

  26. 视差滚动效果

  27. ::before和:after中单引号和双引号的区别?伪元素

  28. 对line-height理解?文本垂直居中(多行,单行)

  29. 怎么让Chrome支持小于12px字号?

  30. 让一碗面字体变清晰,变细css怎么做?(win,ios)

  31. 如果要手动写动画,最好的时间间隔是多少?60hz

  32. li与li之间看不见的空白间隙是怎么产生的?如何解决? letter-spacing: -3px;

  33. 有一个高度自适应的div,里面有两个div,一个高度为100px,希望另一个填满剩余高度?子绝父相

  34. png,jpg,gif图片格式解释?webp格式?

  35. CSS Sprites精灵图?

2.Flex 布局

Flex

  • 传统布局基于盒子模型,display属性position属性float属性
  • Flex布局就是弹性布局,用来为盒子模型提供最大的灵活性

3.什么是BFC

可以参考BFC-三元

定义:浮动元素和绝对定位元素,非块级盒子的块级容器(比如:inline-blocks,table-cells,和table-captions),以及overflow值不为“visiable”的块级盒子,都会创建新的BFC

渲染规则:

  • 垂直方向外边距重叠

    避免外边距塌陷

  • BFC区域不会和浮动元素的box重叠

    防止浮动导致父元素高度坍塌

  • BFC是一个独立容器,不受外面元素影响

  • 计算BFC高度时,浮动元素也参与计算

JS基础

1.讲一讲JS数据类型

最新ES标准规定8种数据类型

  • 6 种原始类型,有typeof运算符检查

    • Boolean typeof instance === "boolean"
    • Undefined typeof instance === "undefined"
    • Number typeof instance === "number"
    • BigInt typeof instance === "bigint"
    • String typeof instance === "string"
    • Symbol typeof instance === "symbol"
  • 结构类型

  • 结构根基元

    • null typeof instance === "object"

2.讲一讲Map和Set

Map和Set

  1. Map的key相对普通对象来说更加灵活,普通对象的key只能以基础数据类型作为key值,并且所有传入的key值都会被转化为string类型,而Map的key可以是各种数据类型

    Map使用SameValueZero 算法来比较键是否相等(和“===”差不多),只是NaN被看做等于NaN(也可以被作为键值)

  2. Set

    特殊的类型集合,“值的集合”,不重复

    • 重复使用同一个值调用 set.add(value) 并不会发生什么改变

3.WeakMap和Map之间的区别?

WeakMap

  1. WeakMap 的键必须是对象,不能是原始值
  2. key值是弱引用,在 weakMap 中使用一个对象作为键,并且没有其他对这个对象的引用 —— 该对象将会被从内存(和map)中自动清除。
  3. 不能迭代,并且无法获取所有当前内容。

使用场景:用户数据的存储(删除用户,回收内存);缓存数据

4.原型链

  • 用于:继承(call,原型链,组合继承),instanceof
  • in检查对象属性(原型链上有也true),obj.hasOwnProperty()Object.getPrototypeOf/Object.setPrototypeOf

5.this?

  • this是在执行上下文创建时确定的一个在执行过程中不可更改的变量。
  1. 严格模式和非严格模式不一样window/undefined
  2. 函数独立调用时window/undefined;对象方法,;构造函数(new:创建一个临时对象,绑定原型,属性赋值,将临时对象return);箭头函数;

优先级: new > call、apply、bind > 对象.方法 > 直接调用。

  • 闭包:产生原因,作用域(两种:全局作用域和函数作用域);表现形式:返回一个函数。刚刚已经举例,作为函数参数传递(回调函数,最直接的表现);引到es6的let块级作用域。

6.深拷贝和浅拷贝

  • 浅拷贝 一般指把对象的第一层拷贝到一个新对象中

实现方式

  1. Object.assign() 可以把可枚举属性拷贝给目标对象
  2. 函数库lodash的.clone方法
  3. …展开运算符
  4. Array.prototype.concat() 字符串连接函数,返回新字符串
  5. Array.prototype.slice() 提取字符串函数
  • 深拷贝
  1. JSON.parse(JSON.stringify()) 可以处理数组和对象,但不能处理函数和正则(正则变成空对象,函数变成null)
  2. 函数库lodash的_.cloneDeep()
  3. jquery中的$.extend(deepCopy, target, object1, [objectN]) 返回合并后的新对象
  4. 手写递归算法 –遍历对象直到里面都是基本数据类型,然后再去复制,就是深拷贝

7.事件冒泡和事件捕获

  • 如何设置两者
  1. 事件冒泡:event.target,停止:

  2. 事件捕获:

    element.addEventListener(event, function, useCapture)第三个参数

event : 必须,不要on前缀 “click” ,react中onClick,

function : 必须,事件对象会作为第一个参数传入e.target

useCapture:布尔值,决定是捕获阶段,还是冒泡阶段(默认false)

  • 应用:事件代理

事件冒泡机制,点击了 li 后会冒泡到 ul ,此时就会触发绑定在 ul 上的点击事件,再利用 target 找到事件实际发生的元素,就可以达到预期的效果。

  • 如何阻止事件冒泡?

event.stopPropagation(),(当前元素的其他行为还会触发)event.stopImmediatePropagation() 其他处理程序不再执行,不要在没有需要的情况下停止冒泡!替代方法:自定义事件;数据在一个处理程序中被存event对象中,可以在另一个处理程序中使用。

  • 如何阻止默认事件?
if(e && e.preventDefault) {
  //非IE浏览器
  e.preventDefault();
} else {
  //IE浏览器(IE11以下)
  window.event.returnValue = false;
}
//return false;   //或者不写上面的判断直接写这句

框架篇

  1. 框架的优势:

    组件化—天然分层—生态—开发效率

    • MVC(view层,Model层,Control层(逻辑集中,与View层一一对应,何谈复用))
    • MVP(Model 层和 View 层都必须通过 Presenter 层来传递信息,MV复用性好)
    • MVVM(View和ViewModel 是进行绑定的,改变ViewModel 就会直接作用到View视图上)(数据绑定方式:发布-订阅模式(vm. set( ' property', value)),数据劫持(通过 Object.defineProperty()来劫持各个属性的setter,getter),脏值检查(通过 setInterval() 定时轮询检测数据变动),angular.js,指定事件触发)
  2. 虚拟DOM优势:跨平台(虚拟DOM本质上是JavaScript对象,而DOM与平台强相关);保证性能下限

  3. 生命周期:挂载阶段、更新阶段、卸载阶段

  4. setState到底是异步还是同步?

    • 在合成事件(onClick等)和钩子函数中是“异步”的(也是批量更新,原理)
    • 原生事件和setTimeout 中都是同步
  5. React 复用组件逻辑

    • Mixins:还是使用createClass时遗留的产物(不支持es6,Mixins 引入了隐式的依赖关系,会导致名称冲突)

    • HOC:一个纯函数,接受一个组件作为参数,返回一个新的组件(connect 是一个返回高阶组件的高阶函数)注意:不要在render中使用,需复制静态方法,refs不被传递(被React.forwardRef((props,ref)=>{})解决)

    • render props:嵌套过深!

    • HOOKS:简洁: React Hooks解决了HOC和Render Props的嵌套问题;解耦: React Hooks可以更方便地把 UI 和状态分离;解决了类组件的几大问题:this 指向容易错误,分割在不同声明周期中的逻辑和维护代码复用成本高;

      React.memo并不能完全替代shouldComponentUpdate(因为拿不到 state change,只针对 props change)

  6. fiber算法单线程调度算法reconcilation 算法实际上是递归,想要中断递归是很困难的,React 16 开始使用了循环来代替之前的递归(将递归diff,拆分为小任务,老生代垃圾回收!),时间分片思想(异步渲染模式)

  7. redux:类flux架构,状态管理(单一数据源,状态只读,改变由纯函数进行)

  8. react-redux:Provider+connect

  9. 中间件

    1. thunk 中间件

      dispatch一个action
      action可以是一个函数 并接收一个dispath函数
      可以在action的函数中进行异步操作
      接受到数据后再dispatch一个action 此action必须是一个对象包含type和数据
      reducer拦截到action的type和数据返回新的state

    2. saga 中间件

      dispatch一个action
      action只能是对象 并且type必须是reducer没有的
      sagas.js拦截此type并执行另一个函数进行异步操作
      接受到数据后再dispatch一个action 并且type必须是reducer存在的
      reducer拦截到action的type和数据返回新的state

    3. 原生

      在componentDidMount生命周期函数里 执行异步操作 接受到数据后dispatch一个action
      此action必须是一个对象包含type和数据
      reducer拦截到action的type和数据返回新的state

  10. react-router

  • 实现原理:依赖 history 库,通过路由匹配,决定应该展示什么样的组件。保证视图和 URL 的同步(hash,h5API,memory)

  • link和a的区别:(link不会重新渲染页面;link最终会被渲染为a;link的to,query,hash会组合为href;内部实现上使用脚本拦截了浏览器的默认行为,然后调用了history.pushState 方法)

  • 路由有几种模式:

    1. HashRouter(URL中的哈希部分保证页面和url同步,window.location.hashhashchange无法记录历史回退)
    2. BrowseRouter(利用h5的history API,pushStatepopState)
    3. MemoryRouter:不存储history,所有路由过程保存在内存里,不能进行前进后退
    4. NativeRouter:经常配合ReactNative使用,多用于移动端
    5. StaticRouter:设置静态路由,需要和后台服务器配合设置
  • switch作用:排他性路由,采用 <Switch>,只有一个路由会被渲染,并且总是渲染第一个匹配到的组件,更好进行路由匹配

  • 重定向:采用 Redirect 进行重定向

  • history中push和replace:一个路由栈,push会新增一条记录,replace替换当前(项目中props.history.push(/singers/${id});)

    获取history对象(import { useHistory } from “react-router-dom”;或者let history = this.props.history;)

  1. react有什么坑点?
  • JSX做表达式判断时候,需要强转为boolean类型

    render() {
      const b = 0;
      return (
        <div>
          {b && <div>test</div>}
        </div>
      );
    }

    如果不使用 !!b 进行强转数据类型,会在页面里面输出 0。

  • 遍历子节点的时候,不要用 index 作为组件的 key 进行传入

  • 尽量不要在 componentWillReviceProps 里使用 setState,如果一定要使用,那么需要判断结束条件,不然会出现无限重渲染,导致页面崩溃。(实际不是componentWillReviceProps会无限重渲染,而是componentDidUpdate)

  • 给组件添加ref时候,尽量不要使用匿名函数,因为当组件更新的时候,匿名函数会被当做新的prop处理,让ref属性接受到新函数的时候,react内部会先清空ref,也就是会以null为回调参数先执行一次ref这个props,然后在以该组件的实例执行一次ref,所以用匿名函数做ref的时候,有的时候去ref赋值后的属性会取到null。

1.React

有没有用过React Hooks?

  • 常见的API有哪些?都有什么作用?
  • 如何使用HOOKS在依赖改变时重新发送请求?
  • 写过自定义HOOK吗?解决了那些问题?
  • 讲讲React Hooks的闭包陷阱,怎么解决?

工具

1.webpack基础知识

  1. 介绍webpackJavaScript 应用程序的静态模块打包器,当 webpack 处理应用程序时,会递归构建一个依赖关系图,其中包含应用程序需要的每个模块,然后将这些模块打包成一个或多个 bundle
  2. 核心概念
    • entry: 入口
    • output: 输出
    • loader: 模块转换器,用于把模块原内容按照需求转换成新内容
    • 插件(plugins): 扩展插件
module.exports = {
  entry: {
    main: "./src/index.js",
  },
  output: {
    //打包js文件的输出src前缀,这里是根路径
    publicPath: "/",
    filename: "[name].js",
    path: path.resolve(__dirname, "dist"),
  },
  mode: "development",

  //开启web服务器并实时重新加载。dist目录放在内存中
  devServer: {
    contentBase: "./dist",
    open: true,
    hot: true,
  },

  //webpack5 Dev-server有点问题,需要加对象web
  target: "web",
  //打包文件和源文件映射source-map
  // cheap:性能好,无需精确列;
  // module:不只映射当前文件
  // inline:不生成.map文件,而行内集成
  devtool: "eval-cheap-module-source-map",

  module: {
    rules: [
      {
        test: /\.m?js$/,
        exclude: /node_modules/,
        use: {
          loader: "babel-loader",
          options: {
            presets: [
              [
                "@babel/preset-env",
                {
                  targets: {
                    edge: "17",
                    firefox: "60",
                    chrome: "67",
                    safari: "11.1",
                  },
                  useBuiltIns: "usage",
                  //只对需要的语法进行补充
                },
              ],
            ],
            //库文件编写,防止全局污染时使用
            plugins: [
              [
                "@babel/plugin-transform-runtime",
                {
                  absoluteRuntime: false,
                  corejs: 2,
                  helpers: true,
                  regenerator: true,
                  version: "7.0.0-beta.0",
                },
              ],
            ],
          },
        },
      },
      {
        test: /\.(jpg|png|gif)$/,
        use: {
          loader: "url-loader",
          options: {
            name: "[name].[ext]",
            outputPath: "images/",
            limit: 204800,
          },
        },
      },
      {
        test: /\.css$/,
        use: ["style-loader", "css-loader"],
      },
      {
        test: /\.scss$/,
        use: [
          "style-loader",
          { loader: "css-loader", options: { importLoaders: 2 } },
          "sass-loader",
          "postcss-loader",
        ],
      },
    ],
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: "./src/index.html",
    }),
    new CleanWebpackPlugin({
      cleanAfterEveryBuildPatterns: ["dist"],
    }),
    new webpack.HotModuleReplacementPlugin(),
  ],
};

// 修改了默认配置文件名时
// npx webpack --config webpackconfig.js

// entry后接字符串是对象main的简写;
// entry: {
//   main: "./src/index.js"
// }

// module.rules就是配置除js文件外的打包文件手段
// {
//   test: /\.jpg$/,
//   use: {
//     loader: "file-loader",
//   },
// },

// 如果想自定义打包文件名称/位置
// 添加options.name属性
// options: {
//   name: "[name].[ext]",
//   outputPath: "images/",
// },
// 这里[name] [ext] [hash]都是占位符
// 在dist目录下新建images文件存放打包的图片

// 和fiile - loader类似的url - loader工具
// 帮我们吧小图片直接base64编码在js文件中
// 添加一个配置项: limit: 20480,   也就是20kb

// css文件 / scss文件打包
// css:
// 首先css - loader整合css到一个文件
// 然后style - loader将这个css挂载到页面的head部分
// scss:
// 安装node - Sass sass - loader
// 先由sass-loader解析.scss文件为css

性能优化

1.讲一讲web各个阶段的性能优化?

React 16 加载性能优化指南

2.webpack代码分割怎么做?

webpack的代码分割(路由懒加载同理)

细看

https://github.com/xieranmaya/blog/issues/3)