前端面试常见问题-持续更新

一、html&css

1.html5新增的标签属性

2.css3新增的属性

3.position定位

4.浮动

5.盒子模型

6.margin问题

7.display的属性值

8.background属性值

9.px、rem、em的区别

10. css动画和js动画的区别

     1.js是帧动画,当js在浏览器主线程运行时,主线程还有其他需要运行的js脚本、样式、计算、布局、交互等一系列任务,对其干扰线程可能出现阻塞,造成丢帧的情况。

     2. js动画通过js引擎解析,css通过 GUI渲染,效果更流畅

二、js相关问题

1.js的基本数据类型和引用数据类型

2.const,let,val的区别

3.说说作用域

在es6的let和const推出之前,js并没有块作用域的概念,只有全局作用域和函数作用域。

4.instanceof和typeof 的区别

5.隐式转换有哪些

6.闭包

7.原型和原型链

(1)、原型

      任何对象都有一个原型对象除了null,这个原型对象由对象的内置属性_proto_指向它的构造函数的prototype

      即任何对象都是由一个构造函数创建的,但是,不是每一个对象都有prototype,只有方法才有prototype。

 (2)、什么是原型链?

      原型链的核心就是依赖对象的_proto_的指向,当查找自身不存在的属性时,就一层层的扒出创建对象的构造函数,直至到Object时,就没有_proto_指向了。

        因为_proto_实质找的是prototype,所以我们只要找这个链条上的构造函数的prototype。其中Object.prototype是没有_proto_属性的,它==null。

(3)、原型链查找分析:

        当访问一个对象的成员的时候,会先在自身找有没有,如果找到直接使用。

        如果没有找到,则去原型链指向的对象的构造函数的prototype中找,找到直接使用,没找到就返回undifined或报错。

    function Person(name){

      this.name = name;

    }

    var p = new Person();

    p ---> Person.prototype --->Object.prototype---->null


8.call和apply的区别

9.new干了什么

10.this的指向

11.箭头函数

相对于普通函数的区别,新的书写方式 ,this 的改变,不能当构造函数,没有 prototype 属性,没有 arguments 对象

讨论箭头函数的 this 之前,不得不再熟悉一下 执行上下文(Execution Context),因为 this 指针(this value) 就存储在执行上下文中。

    执行上下文保存着函数执行所需的重要信息,其中有三个属性:变量对象(variable object),作用域链(scope chain),this指针(this value),它们影响着变量的解析、变量作用域、函数 this 的指向。执行上下文分为 全局执行上下文 和 函数执行上下文。

    函数预编译的 this 分下面四种情况:

        第一种: 函数自主调用 如 fun() 或者是 普通的立即执行函数(区别于箭头函数方式的立即执行函数), this 指向 window;

        第二种: 函数被调用,当函数被某个对象调用时,函数产生的执行上下文中的 this 指向 该对象;

        第三种: 通过 call() apply() bind() 方法改变 this,this 指向被传入的 第一个参数;

        第四种: 在构造函数中,this 指向被创建的 实例

        箭头函数不会创建自己的 this,它只会从自己的作用域链上找父级执行上下文的 this

        *由于箭头函数是不能通过 call() apply() bind() 方法改变 this,也不能当做构造函数

12.setTimeout、Promise、async/await 三者之间异步解决方案的区别?

13.实现节流和防抖

function throttle(fn){

            let can = true;

            return function(){

                if(!can)return;

                can = false;

                setTimeout(() => {

                    fn.apply(this,arguments);

                    can = true

                }, 2000);

            }

        }

function debounce(fn) {

    let timeout = null; // 创建一个标记用来存放定时器的返回值

    return function () {

      clearTimeout(timeout); // 每当用户输入的时候把前一个 setTimeout clear 掉

      timeout = setTimeout(() => { // 然后又创建一个新的 setTimeout, 这样就能保证输入字符后的 interval 间隔内如果还有字符输入的话,就不会执行 fn 函数

        fn.apply(this, arguments);

      }, 500);

    };

  }

14.对象深拷贝

function deepClone(source){

        const targetObj = source.constructor === Array ? [] : {}; // 判断复制的目标是数组还是对象

        for(let keys in source){ // 遍历目标

            if(source.hasOwnProperty(keys)){

            if(source[keys] && typeof source[keys] === 'object'){ // 如果值是对象,就递归一下

                targetObj[keys] = source[keys].constructor === Array ? [] : {};

                targetObj[keys] = deepClone(source[keys]);

            }else{ // 如果不是,就直接赋值

                targetObj[keys] = source[keys];

            }

            }

        }

        return targetObj;

    } 

15.setTimeout在跳转页面之后是否还会继续执行

16.多页面还单页面的区别

17.说一下设计模式有哪些

19.http缓存原理

20.常见的状态码有哪些

21.js事件流

22.get,post的区别

 1.post更安全(不会作为url的一部分,不会被缓存、保存在服务器日志、以及浏览器浏览记录中)

 2.post发送的数据量更大(get有url长度限制)

 3.post能发送更多的数据类型(get只能发送ASCII字符)

   4.post支持4种提交格式

    application/x-www-form-urlencoded,multipart/form-data,application/json,text/xml

最重要的一条,post在真正接受数据之前会先将请求头发送给服务器进行确认,然后才真正发送数据

  post请求的过程:

  1.浏览器请求tcp连接(第一次握手)

  2.服务器答应进行tcp连接(第二次握手)

3.浏览器确认,并发送post请求头(第三次握手,这个报文比较小,所以http会在此时进行第一次数据发送)

  4.服务器返回100 continue响应

  5.浏览器开始发送数据

  6.服务器返回200 ok响应


get请求的过程

    1.浏览器请求tcp连接(第一次握手)

  2.服务器答应进行tcp连接(第二次握手)

  3.浏览器确认,并发送get请求头和数据(第三次握手,这个报文比较小,所以http会在此时进行第一次数据发送)

  4.服务器返回200 ok响应

23.js事件循环机制,宏任务与微任务有哪些

常见的微任务有Promise、process.nextTick、MutationObserver

常见的宏任务:script、setTimeout、setInterval、setImmediate

发出疑问:到底是宏任务优先还是微任务优先?(个人观点:微任务优于宏任务)

Event Loop执行顺序为:

先执行宏任务script,并执行里面的同步任务;执行栈为空后查询是否存在微任务,存在就立即执行,然后开始下一轮的事件循环

24.实现响应式数据

var oldArrayProto = Array.prototype;

    var arrProto = Object.create(oldArrayProto);

    ['push', 'pop', 'shift', 'unshift', 'splice'].forEach(methodName => {

        arrProto[methodName] = function () {

            console.log("进来额")

            update() // 触发视图更新

            oldArrayProto[methodName].call(this, ...arguments)

        }

    })

    function update(val) {

        console.log("数据发生了变化",obj.nums);

    }

    function define(target,key,value){

        observer(value)

        Object.definePrototype(target,key,{

            get(){

                return value;

            },

            set(val){

                if(val !== value){

                    value = val;

                    observer(value);

                    update()

                }

            }

        })

    }

    function observer(obj){

        if(typeof obj !== 'object' || obj === null) {

            reutrn obj;

        }

        if(Array.isArray(obj)){

            obj._proto_ = arrProto;

        }

        for(let key in obj){

            define(obj,key,obj[key]);

        }

    }

25. 0.1+0.2 = ?  js为什么会有精度问题?

JS 数字类型只有number类型,number类型相当于其他强类型语言中的double类型(双精度浮点型),不区分浮点型和整数型。

number 有四种进制表示方法,十进制,二进制,八进制和十六进制

由于Js的所有数字类型都是双精度浮点型(64位)采用 IEEE754 标准

计算机中的数字都是以二进制存储的,如果要计算 0.1 + 0.2 的结果,计算机会先把 0.1 和 0.2 分别转化成二进制,然后相加,最后再把相加得到的结果转为十进制,0.1 和 0.2 在转换为二进制时就发生了一次精度丢失,而对于计算后的二进制又有一次精度丢失 。

26. try catch的作用域

27.获取url ?后的参数

28.jquery的链式调用和promise的链式调用

    jquery的方法都是挂在在原型上的,每次调用内部方法会返回this,返回当前的实例对象

    promise的then,每次都会返回一个新的promise

29.async 和defer的区别

    

你可能感兴趣的:(前端面试常见问题-持续更新)