Riunshow / NoteBook

人生不如意事十之九八,可与人言者并无二三
3 stars 0 forks source link

面试 #4

Open Riunshow opened 5 years ago

Riunshow commented 5 years ago

css

js

网络

html

Vue

react


1. css垂直水平居中的几种方式?

2. BFC是什么?触发条件是什么

浮动元素和绝对定位元素,非块级盒子的块级容器(例如 inline-blocks, table-cells, 和 table-captions),以及overflow值不为“visiable”的块级盒子,都会为他们的内容创建新的BFC(块级格式上下文)。

3. 清除浮动

4. 什么是原型链?

原型

①所有引用类型都有一个proto(隐式原型)属性,属性值是一个普通的对象 ②所有函数都有一个prototype(原型)属性,属性值是一个普通的对象 ③所有引用类型的proto属性指向它构造函数的prototype

  var a = [1,2,3];
  a.__proto__ === Array.prototype; // true

原型链

当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的proto隐式原型上查找,即它的构造函数的prototype,如果还没有找到就会再在构造函数的prototype的proto中查找,这样一层一层向上查找就会形成一个链式结构,我们称为原型链。

  function Parent(month){
    this.month = month;
  }

  var child = new Parent('Ann');

  console.log(child.month); // Ann

  console.log(child.father); // undefined

5. 判断数据类型

6. 什么是闭包?闭包的问题怎么解决?

闭包就是能够读取其他函数内部变量的函数。

  function a() {
    return b() {
      // to do
    }
  }
  var c = a()
  c() // a()()

常见问题

  for(var i = 0; i <= 6;i++){
    setTimeout(function timer(){
      console.log(i);
    }, i * 1000);
  }//输出结果是6 6 6 6 6 6

解决办法

7. new是怎么实现的?

首先了解new做了什么,使用new关键字调用函数(new nameFunc(…))的具体步骤:

  1. 创建一个新对象: var obj = {}; function nameFunc (name) { this.name = name }

  2. 设置新对象的constructor属性为构造函数的名称,设置新对象的proto属性指向构造函数的prototype对象; obj.proto = nameFunc.prototype;

  3. 使用新对象调用函数,函数中的this被指向新实例对象: nameFunc.call(obj);  //{}.构造函数()

  4. 将初始化完毕的新对象地址,保存到等号左边的变量中 obj.name = 'nick'

注意:若构造函数中返回this或返回值是基本类型(number、string、boolean、null、undefined)的值,则返回新实例对象;若返回值是引用类型的值,则实际返回值为这个引用类型。

8. 同源策略

  1. 什么是源

  2. 什么是同源策略? 同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源。所以a.com下的js脚本采用ajax读取b.com里面的文件数据是会报错的。

    • 不受同源策略限制的:
    • 页面中的链接,重定向以及表单提交是不会受到同源策略限制的。
    • 跨域资源的引入是可以的。但是js不能读写加载的内容。如嵌入到页面中的
      <script src="..."></script>,<img>,<link>,<iframe>

9. 跨域

  1. 什么是跨域 受前面所讲的浏览器同源策略的影响,不是同源的脚本不能操作其他源下面的对象。想要操作另一个源下的对象是就需要跨域。

  2. 如何跨域

    • webpack, rollup 等工具中的 proxy代理
    • jsonp

10. 三次握手详情

TCP在传输之前会进行三次沟通,一般称为“三次握手”,传完数据断开的时候要进行四次沟通,一般称为“四次挥手”。

三次握手

11. 重绘与回流

  1. 当render tree中的一部分(或全部)因为元素的规模尺寸,布局,隐藏等改变而需要重新构建。这就称为回流(reflow)。每个页面至少需要一次回流,就是在页面第一次加载的时候。

  2. 在回流的时候,浏览器会使渲染树中受到影响的部分失效,并重新构造这部分渲染树,完成回流后,浏览器会重新绘制受影响的部分到屏幕中,该过程成为重绘。当render tree中的一些元素需要更新属性,而这些属性只是影响元素的外观,风格,而不会影响布局的,比如background-color。则就叫称为重绘。

    回流必将引起重绘,而重绘不一定会引起回流。

    回流何时发生: 当页面布局和几何属性改变时就需要回流。下述情况会发生浏览器回流:

  3. 添加或者删除可见的DOM元素;

  4. 元素位置改变;

  5. 元素尺寸改变——边距、填充、边框、宽度和高度

  6. 内容改变——比如文本改变或者图片大小改变而引起的计算值宽度和高度改变;

  7. 页面渲染初始化;

  8. 浏览器窗口尺寸改变——resize事件发生时;

    var s = document.body.style;
    s.padding = "2px"; // 回流+重绘
    s.border = "1px solid red"; // 再一次 回流+重绘
    s.color = "blue"; // 再一次重绘
    s.backgroundColor = "#ccc"; // 再一次 重绘
    s.fontSize = "14px"; // 再一次 回流+重绘
    document.body.appendChild(document.createTextNode('abc!'));// 添加node,再一次 回流+重绘

    如何减少回流、重绘

  9. 直接改变className,如果动态改变样式,则使用cssText

    // 不好的写法
    var left = 1;
    var top = 1;
    el.style.left = left + "px";
    el.style.top = top + "px";// 比较好的写法
    el.className += " className1";
    
    // 比较好的写法
    el.style.cssText += "; 
    left: " + left + "px; 
    top: " + top + "px;";
  10. 让要操作的元素进行”离线处理”,处理完后一起更新

    • 使用DocumentFragment进行缓存操作,引发一次回流和重绘;
    • 使用display:none技术,只引发两次回流和重绘;
    • 使用cloneNode(true or false) 和 replaceChild技术,引发一次回流和重绘;
  11. 不要经常访问会引起浏览器flush队列的属性,如果你确实要访问,利用缓存

    // 别这样写
    for(循环) {
    el.style.left = el.offsetLeft + 5 + "px";
    el.style.top = el.offsetTop + 5 + "px";
    }
    
    // 这样写好点
    var left = el.offsetLeft,
    top = el.offsetTop,
    s = el.style; 
    for (循环) { 
    left += 10; 
    top += 10; 
    s.left = left + "px"; 
    s.top = top + "px"; 
    }

12. vue生命周期

beforecreated:el 和 data 并未初始化 created:完成了 data 数据的初始化,el没有 beforeMount:完成了 el 和 data 初始化 mounted :完成挂载 beforeDestroy: 你确认删除XX吗 destroyed :当前组件已被删除,清空相关内容 官网

13. vue组件传参

  1. 父 -> 子组件传参
  2. 子 -> 父组件传参
  3. 兄弟组件传参
  4. 通过vuex传参

14. vue data变化触发哪个生命周期

beforeupdate -> vdom re-render & patch -> updated

15. vuex中的异步action是怎么实现的

16. vue的实现机制是什么?

vue2 object.defineProperty() get set vue3 proxy

17. 讲讲虚拟dom?

18. react与vue的比较

19. react在哪个生命周期优化

20. redux是什么?

21. redux有哪些中间件