ms2

153 阅读5分钟

对axios的理解

原文件:www.jianshu.com/p/855bec82e…

Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。

ajax和fectch的区别

原文件:blog.csdn.net/m0_55734628…

1. 使用技术不同

  • axios 是基于 promise 实现对 ajax 技术的一种封装,而 ajax 是基于 JS 的 XMLHttpRequest 对象封装的
  • fetch 同样是基于 promise,但不是对 ajax 的封装, 和 XMLHttpRequest 对象也没有太多的关系,fetch 是 JS 的原生API,相较于 axios 对浏览器的性能有不错提升

2 请求方式

  • 二者请求方式最大的区别就是 Axios 请求的参数放到 data 属性中,以对象的方式进行传递
  • 而 Fetch 需要放到 body 属性中,以字符串的方式进行传递

Axios:

axios({
    url: 'http://www.ggbone.com/post',
    method: 'POST',
    data: {
        name: 'GGBone',
        age: 18
    }
})
.then((res) => {
    console.log('请求成功');
    return res.json()
}, (err) => {
    console.log('请求失败原因:'+ err);
})

Fetch:

fetch('http://www.ggbone.com/post', {
    method: 'POST',
    headers: {
        'content-type': 'application/json'
    },
    body: JSON.stringify({
        name: 'GGBone',
        age: 18
    })
})
.then((res) => {
    console.log('请求成功');
    return res.json()
}, (err) => {
    console.log('请求失败原因:'+ err);
})

3 请求拦截器和响应拦截器

  • 请求拦截器用于在请求时对请求数据进行处理,例如:请求头中添加token,同时还可以设置请求超时时间
  • 响应拦截器用于在请求响应时拦截响应数据,对状态码的情况做出提示,例如弹框的形式展示在页面中 Axios 的很大的一个优点就是它拥有请求拦截器和响应拦截器,而 Fetch 没有拦截器功能
axios.interceptors.request.use((config) => {
  // 在请求之前对请求参数进行处理
  return config;
});
axios.interceptors.response.use((config) => {
  (response) => {
    return response.data
  },
  (error) => {
    // 定义一个变量:存储网络错误信息
    let message = ''
    // http状态码
    const status = error.response.status
    switch (status) {
      case 401:
        message = 'Token过期'
        break
      case 403:
        message = '无权访问'
        break
 
      ...
 
      default:
        message = '无网络'
    }
    // 提示错误信息
    ElMessage({
      type: 'error',
      message: message,
    })
    return Promise.reject(error)
  },
)
 
// 发送GET请求
axios.get("http://www.ggbone.com/").then((response) => {
  console.log(response.data);
});

可以通过重写全局Fetch方法实现Fetch的拦截器

fetch = ((originalFetch) => {
  return (...arguments) => {
    const result = originalFetch.apply(this, arguments);
    return result.then(console.log("请求已发送"));
  };
})(fetch);
 
fetch("http://example.com/")
  .then((response) => response.json())
  .then((data) => {
    console.log(data);
  });

4 响应超时

Axios 设置响应超时非常简单,直接设置timeout属性就可以了,而Fetch设置起来就远比Axios麻烦,这也是很多人更喜欢Axios而不太喜欢Fetch的原因之一

axios({
  method: "post",
  url: "http://example.com/",
  timeout: 4000, // 请求4秒无响应则会超时
  data: {
    firstName: "David",
    lastName: "Pollock",
  },
})
  .then((response) => {
    /* 处理响应 */
  })

5 对于数据格式的转化

Axios 会自动对数据格式进行转化,Fetch则不同,它需要手动转化。

// axios
axios.get("http://example.com/").then(
  (response) => {
    console.log(response.data);
  },
  (error) => {
    console.log(error);
  }
);
 
// fetch
fetch("http://example.com/")
  .then((response) => response.json()) // 需要对响应数据进行转换
  .then((data) => {
    console.log(data);
  })
  .catch((error) => console.error(error));

6 兼容性

Axios 可以兼容IE浏览器,而 Fetch 在 IE浏览器和一些老版本浏览器上没有受到支持,如果想要支持 Fetch 一般需要其他库的支持

new操作符的原理

原文件:blog.csdn.net/weixin_5815…

定义: new操作符用于创建一个给定构造函数的实例对象。

image.png

2.new操作符的执行过程

1.创建了一个空对象;

2.将空对象的原型,指向于构造函数的原型

3.将空对象作为构造函数的上下文(改变this指向

image.png

image.png

3.手写流程,如果实现:

function Fun( age,name ){
    this.age = age;
    this.name = name;
}
function create( fn , ...args ){
    //1. 创建了一个空的对象
    var obj = {}; //var obj = Object.create({})
    //2. 将空对象的原型,指向于构造函数的原型
    // Object.setPrototypeOf(obj,fn.prototype);
    obj.__proto__ = fn.prototype;
    //3. 将空对象作为构造函数的上下文,改变this指向,即obj绑定到构造函数上,便可以访问构造函数中的属性,即obj.fn(args))
    var result = fn.apply(obj,args);
    //4. 对构造函数有返回值的处理判断
    // 如果返回的result是一个对象则返回
    // new方法失效,否则返回obj
    return result instanceof Object ? result : obj;
}
// 测试一下
console.log( create(Fun,18,'张三')   )

深拷贝的实现方法

原文件:blog.csdn.net/m0_53808238…

浅拷贝 : 只是将数据中所有的数据引用下来,依旧指向同一个存放地址,拷贝之后的数据修改之后,也会影响到原数据的中的对象数据。例如:Object.assign(),...扩展运算符

深拷贝: 将数据中所有的数据拷贝下来,对拷贝之后的数据进行修改不会影响到原数据。

一、使用 JSON 转换

这是最简单的方法。

JSON.parse(JSON.stringify(obj))

JSON.parse(JSON.stringify(obj))深拷贝的问题

1、如果obj里面存在时间对象,JSON.parse(JSON.stringify(obj))之后,时间对象变成了字符串。
2、如果obj里有RegExp、Error对象,则序列化的结果将只得到空对象。
3、如果obj里有函数,undefined,则序列化的结果会把函数, undefined丢失。
4、如果obj里有NaN、Infinity和-Infinity,则序列化的结果会变成null。
5、JSON.stringify()只能序列化对象的可枚举的自有属性。如果obj中的对象是有构造函数生成的, 则使用JSON.parse(JSON.stringify(obj))深拷贝后,会丢弃对象的constructor。
6、如果对象中存在循环引用的情况也无法正确实现深拷贝。

二、使用递归

const deepClone = obj => {
  if (typeof obj !== 'object' || obj === null) {
    return obj;
  }
  let result = Array.isArray(obj) ? [] : {};
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      result[key] = deepClone(obj[key]);
    }
  }
  return result;
}

三、借助插件

Lodash

const obj1 = {a: {b: 2}};
const obj2 = cloneDeep(obj1);

babel实现的原理

image.png

谈谈对MVVM的认识

先说mvc:所有通信都是单向的:提交一次反馈一次,通信一次相互制约。

  • 视图(View):用户界面。(传送指令到 Controller)
  • 控制器(Controller):业务逻辑(完成业务逻辑后,要求 Model 改变状态)
  • 模型(Model):数据保存(将新的数据发送到 View,用户得到反)

image.png

用户对View的操作交给了Controller处理,在Controller中响应View的事件调用Model的接口对数据进行操作,一旦Model发生变化便通知相关视图进行更新。

2.MVVM定义

  • model:服务器的业务逻辑操作
  • view:用户界面
  • ViewModel:核心枢纽

image.png

过程:把view和model关联起来的就是View Model。ViewModel负责把Model的数据同步到view显出来,还负责把view修改同步到Model。

  1. 各部分之间的通信,都是双向的。

  2. View 与 Model 不发生联系,都通过ViewModel传递。

vue之间如何通信的

1. children、parent、$refs

image.png

image.png

2. procide inject

image.png

attr、listeners

image.png

vuex

略。。。

如何理解vue的响应模式(观察者模式)?

image.png

image.png image.png

image.png

image.png

image.png

image.png

vue中key的作用?

image.png

vue中的query、params的区别?

image.png

image.png

image.png