面试题相关2

1函数柯里化

函数柯里化就是我们给一个函数传入一部分参数,此时就会返回一个函数来接受剩余的参数

 function sum(a){

            return function(b){

                return function (c){

                    return a+b+c

                }

            }

        }

        console.log(sum(1)(2)(3))

2.Js基础数据类型

Null 数值 布尔 字符串 undefined Symbol

3.判断数据类型方法

(1)通过constructor可以直接找到元素的构造函数类型,这种方法能够区分引用数据类型到底是那种类型,(null 和 undefined 没有constructor)

(2)instanceof来判断引用类型到底属于哪种类型

(3)使用typeof来判断基本数据类型

(4)Object.prototype.toString.call()精确确定类型(强烈推荐)

4深拷贝

   创建一个新的对象和数组,将原对象的各项属性的“值”(数组的所有元素)拷贝过来,是“值”而不是“引用”

5.Flex布局

6.z-index

7.Http1.1  长连接 connection:keep-alive

8.事件捕获的三个阶段(事件冒泡 事件捕获 事件委托)

     一个事件的处理过程主要有三个阶段:捕获,目标,冒泡

   阻止事件委托和冒泡:在事件函数中执行event.stopPropagation()

 

 

9内存泄露:闭包 定时器

10.This.$set()

   当我们发现给对象加了一个属性,在控制台能打印出来,但却没有更新到视图上,也许这个时候就需要用到

     官方解释:向响应式对象中添加一个属性,并确保这个新属性同样是响应式的,且触发视图更新,他必须用于响应式对象上添加新属性,因为Vue无法探测普通的新增属性

 

11生命周期keep-alive

 

12.路由跳转

 

13.HTTP HTTPS区别 七层网络模型哪一层?

14.cookie 本地存储 会话存储

15.Css选择优先级

!important> style >id>class>标签>通配符

16.虚拟DOM

    虚拟dom想当于在js和真实dom中间加了一个缓存,利用dom diff算法避免了没必要的dom操作,从而提高性能

17.export 和export default的区别

   export暴露是接口,可以在变量前使用

   export default  暴露的是变量,指定了默认输出,因此一个模块只能存在已一个,导入时可以不用加{},而export可以存在多个,这个是俩的区别之一

18.三次握手的过程

19.N的阶乘

function factor(num){

            var result = 1;

            while(num){

                result *= num;

                num --;

            }

            return result;

        }

 

20.

""==[]

console.log(["123"]==["123"])//两个引用数据类型 地址不同

21.new过程

     let a = new Foo(‘小明’,age:20)

  (1)创建一个对象

var obj ={};

(2)原型赋值,将隐式原型__proto__属性赋值给prototype显示原型

obj.__proto__ =Foo.prototype;

(3)函数执行Foo,通过call()将this指向obj对象吗,给obj添加属性

Foo.call(obj,’小明’,20)

(4)返回obj对象

return obj

22.Set Map

set

 const s = new Set();

        [2,3,4,5,2,2].forEach(x=>s.add(x))

        for(let i of s){

            console.log(i)//2 3 4 5

            // 通过add()方法向Set结构加入成员,结果表明不会添加重复的值

            // Set函数可以接受一个数组(或者具有iterable接口的其他数组结构)作为参数,用来初始化

 

        }

        const items = new Set([1,2,3,4,5,5,5,5]);

      console.log(items.size)  

      console.log(items.has(1))

      console.log(items.clear())

    console.log(items)  

    //   size属性是集合的大小 Set原型上身上的方法,

    // add(value)添加值, 返回set本身

    // delete(value) 删除值,返回布尔值

    // has()判断是否有值,返回布尔值

    // clear()清空Set,没有返回值

    // forEach(value=>{console.log(value)}) 遍历Set

map

 //  map

    // 使用new关键字和map构造函数可以创建一个映射;

    const m = new Map();

    //如果想在创建的同时初始化实例,可以给Map构造函数传入一个可以迭代的对象,需要包含健/值对数组。

    // 可迭代对象的每个健/值对都会按照迭代顺序插入到新映射实例中:

    const m1 = new Map([["key1","val1"],["key2","val2"],["key3","val3"]]);

    // alert(m1.size)//3

 

    const mm = new Map();

    const o = {p:'Hello Word'};

    mm.set(o,'content')

    mm.set(o,'ccccccc')

 console.log(mm.has(o))  

  console.log(mm.get(o))

  console.log(mm)

  const map = new Map([

    ['name','张三'],

    ['title','Author']

  ]);

  console.log(map.size)

  map.set('1','')

  console.log(map)

//   Map构造函数接受数组作为参数,实际上执行的是下面的算法

  const item = [

     ['name','张三'],

     ['title','Author']

  ];

  const map1 = new Map();

  item.forEach(([key,value])=> map1.set(key,value))

区别:(1)两种方法具有极快的查找速度

(2)Map和set都不允许健重复

(3)初始化需要值不一样,Map需要的是一个二维数组,而set需要的是一维数组Array数组。

(4)Map是键值对的存在,键和值是分开的:Set没有value只有key;value就是Key

  

 

重绘和回流

Visibility:hidden opacity()

diff算法

在数据发生变化时,vue是先根据真实DOM生成一颗virtual (虚拟)DOM,当virtual DOM某个节点的数据改变后会生成一个新的Vnode,然后Vnode和oldVnode作对比,发现不一样的地方就直接修改在真实DOM上,然后使oldVnode的值为Vnode,来实现更新节点。

原理阐述:

  • 先去同级比较,然后再去比较子节点
  • 先去判断一方子有子节点一方没有子节点的情况
  • 比较都有子节点的情况
  • 递归比较子节点
posted @ 2023-03-02 23:54  景沁同学  阅读(24)  评论(0)    收藏  举报