this引出的一部分知识点

147 阅读2分钟

个人总结,欢迎指正

this 是 JavaScript 中的一个关键字。它通常被运用于函数体内,依赖于函数调用的上下文条

件,与函数被调用的方式有关。

this指向

  1. 全局上下文中,不管是严格模式还是非严格模式,this都指向全局对象
  2.  函数上下文,非严格模式:this 指的是全局对象,严格模式:this为undefined
  3.  箭头函数的this:离它最近的外层普通函数的this,而且不能改变
  4.  new关键字调用函数时,this指向实例对象 
  5.  对象的方法调用时,指向该对象 
  6. constructor调用时,指向返回的这个对象
  7. 基于Function.prototype上的 apply 、 call 和 bind 调用模式,这个函数的 this指向除了使用new 时会被改变,其他情况下都不会改变。若为空默认是指向全局对象。

改变this指向(执行上下文)的方法有哪些?他们有什么异同?

方法:call()、apply()、bind()。

相同点:

  1. 都能改变this指向(执行上下文);
  2. 调用他们的对象必须是Function 。

不同点:

  1. call()第二个参数是参数列表,而apply()的第二个参数是数组或类数组(ES5后);

  2. bind()的返回值是一个函数;

  3. call()、apply()是立即执行,bind()要手动调用才能执行。

call()、apply()那个性能更好?为什么?

call()性能比apply()性能好一些,因为apply()的第二个参数是数组或类数组,在参数超过三个

的时候,函数在执行时,解析数组获取参数是非常耗费性能的。

数组和类数组的区别

数组:可以通过角标调用,如 array[0];具有长度属性length;可以通过 for 循环或forEach方

法,进行遍历。

类数组:就是具备与数组特征类似的对象。

类数组,还是比较常用的,只是我们平时可能没注意到。比如,我们获取 DOM 节点的方法,

返回的就是一个类数组。再比如,在一个方法中使用 arguments 获取到的所有参数,也是一个

类数组。  

但是需要注意的是:类数组无法使用 forEach、splice、push 等数组原型链上的方法,毕竟它

不是真正的数组。

数组常用的方法有哪些?

请移步查看数组的常用方法

判断数组有哪些方法?

  1. Array.isArray():如果值是一个Array返回true;否则, false。

  2. Object.prototype.toString.call(arg):数组返回[object Array]。

  3. instanceof:如果是一个Array返回true;否则, false。用法:arr instanceof Array 。

  4. 对象构造函数的 constructor判断:如果是一个Array返回true;否则, false。用法:arr.constructor === Array。

  5. Array 原型链上的 isPrototypeOf:如果是一个Array返回true;否则, false。用法:Array.prototype.isPrototypeOf(arr)。

  6. Object.getPrototypeOf:如果是一个Array返回true;否则, false。用法:Object.getPrototypeOf(arr) === Array.prototype。

不写了,再写怕没有尽头了(^-^)!