js知识点复习

浅拷贝与深拷贝

  • 浅拷贝

    1
    2
    3
    4
    5
    6
    7
    8
    function extendCopy(p, c) {
    var c = c || {};
    for (var i in p) {
    c[i] = p[i];
    }
    c.uber = p;
    return c;
    }
    1
    2
    3
    // ES2015 的语法,性能良好
    var a = {};
    var b = Object.assign({}, a);
  • 深拷贝

    • 递归方法

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      function deepCopy(p, c) {
      var c = c || {};
      for (var i in p) {
      if (typeof p[i] == 'object') {
      c[i] = p[i].constructor === Array ? [] : {};
      deepCopy(p[i], c[i]);
      } else {
      c[i] = p[i];
      }
      }
      return c;
      }
    • JSON 对象的提供的方法,性能不太理想

      1
      2
      var a = {};
      var b = JSON.parse(JSON.stringify(a));

      能够处理JSON格式的所有数据类型,但是对于正则表达式类型、函数类型等无法进行深拷贝,而且会直接丢失相应的值,还有就是它会抛弃对象的constructor。也就是深拷贝之后,不管这个对象原来的构造函数是什么,在深拷贝之后都会变成Object。

什么是跨域

拥有相同的协议、端口和主机,那么就属于同一个源(origin)。反之,不符合条件的都是跨域。

GET 和 POST 的区别

  • GET 和 POST 长度的限制问题
    GET 是通过 URL 提交数据,因此 GET 可提交的数据量就跟 URL 所能达到的最大长度有直接关系。实际上 HTTP 协议对 URL 长度是没有限制的;限制 URL 长度大多数是浏览器或者服务器的配置参数;同样的,HTTP 协议没有对 POST 进行任何限制,一般是受服务器配置限制或者内存大小。

  • GET 和 POST 的安全性
    GET 是通过 URL 方式请求,可以直接看到,明文传输。POST 是通过请求 header 请求,可以开发者工具或者抓包可以看到,同样也是明文的。GET 请求会保存在浏览器历史纪录中,还可能会保存在 Web 的日志中。

  • 对服务器状态的影响
    根据 http 的设计,GET 应该对服务器状态没有修改,而 POST 应该对服务器状态做修改。

  • 幂等
    幂等是指同一个请求方法执行多次和仅执行一次的效果完全相同。按照 RFC 规范,PUT,DELETE 和安全方法都是幂等的,POST 语义不是幂等的。

  • 总结

    改变服务器状态 不改变服务器状态
    幂等 PUT GET
    不幂等 POST

原型、原型链、继承

prototype:构造函数中的属性,指向该构造函数的原型对象。

constructor:原型对象中的属性,指向该原型对象的构造函数

_proto_:实例中的属性,指向 new 这个实例的构造函数的原型对象

apply|call|bind 组成的黑魔法

1
2
3
4
5
Function.prototype.bind.apply(
targetFunction,
[target].concat(Array.prototype.slice.call(arguments)),
);
//返回一个接收任意数量参数,函数体为targetFunction(即目标函数),函数执行上下文为target的绑定函数

vue2.x 官方文档中新建一个已初始化的数组方式

1
2
3
const length = 5; // length是个number类型
let initValueArr = Array.apply(null, { length }); // initValueArr是一个长度为5的已初始化数组
console.log(initValueArr); // [undefined, undefined, undefined, undefined, undefined]

Object.seal 封闭对象

Object.seal()方法封闭一个对象,阻止添加新属性并将所有现有属性标记为不可配置。当前属性的值只要可写就可以改变。

1
2
3
4
5
6
7
8
9
const a = {
b: 1,
};
Object.seal(a);
a.b; // 1
a.b = 2;
a.b; // 2
a.c = 1;
a.c; // undefined

Object.freeze 冻结对象

Object.freeze() 方法可以冻结一个对象,冻结指的是不能向这个对象添加新的属性,不能修改其已有属性的值,不能删除已有属性,以及不能修改该对象已有属性的可枚举性、可配置性、可写性。该方法返回被冻结的对象。
如果一个属性的值是个对象,则这个对象中的属性是可以修改的,除非它也是个冻结对象。数组作为一种对象,被冻结,其元素不能被修改。没有数组元素可以被添加或移除。