个人总结,欢迎指正
this 是 JavaScript 中的一个关键字。它通常被运用于函数体内,依赖于函数调用的上下文条
件,与函数被调用的方式有关。
this指向
- 全局上下文中,不管是严格模式还是非严格模式,this都指向全局对象
- 函数上下文,非严格模式:this 指的是全局对象,严格模式:this为undefined
- 箭头函数的this:离它最近的外层普通函数的this,而且不能改变
- new关键字调用函数时,this指向实例对象
- 对象的方法调用时,指向该对象
- constructor调用时,指向返回的这个对象
- 基于Function.prototype上的 apply 、 call 和 bind 调用模式,这个函数的 this指向除了使用new 时会被改变,其他情况下都不会改变。若为空默认是指向全局对象。
改变this指向(执行上下文)的方法有哪些?他们有什么异同?
方法:call()、apply()、bind()。
相同点:
- 都能改变this指向(执行上下文);
- 调用他们的对象必须是Function 。
不同点:
-
call()第二个参数是参数列表,而apply()的第二个参数是数组或类数组(ES5后);
-
bind()的返回值是一个函数;
-
call()、apply()是立即执行,bind()要手动调用才能执行。
call()、apply()那个性能更好?为什么?
call()性能比apply()性能好一些,因为apply()的第二个参数是数组或类数组,在参数超过三个
的时候,函数在执行时,解析数组获取参数是非常耗费性能的。
数组和类数组的区别
数组:可以通过角标调用,如 array[0];具有长度属性length;可以通过 for 循环或forEach方
法,进行遍历。
类数组:就是具备与数组特征类似的对象。
类数组,还是比较常用的,只是我们平时可能没注意到。比如,我们获取 DOM 节点的方法,
返回的就是一个类数组。再比如,在一个方法中使用 arguments 获取到的所有参数,也是一个
类数组。
但是需要注意的是:类数组无法使用 forEach、splice、push 等数组原型链上的方法,毕竟它
不是真正的数组。
数组常用的方法有哪些?
判断数组有哪些方法?
-
Array.isArray():如果值是一个Array返回true;否则, false。
-
Object.prototype.toString.call(arg):数组返回[object Array]。
-
instanceof:如果是一个Array返回true;否则, false。用法:arr instanceof Array 。
-
对象构造函数的 constructor判断:如果是一个Array返回true;否则, false。用法:arr.constructor === Array。
-
Array 原型链上的 isPrototypeOf:如果是一个Array返回true;否则, false。用法:Array.prototype.isPrototypeOf(arr)。
-
Object.getPrototypeOf:如果是一个Array返回true;否则, false。用法:Object.getPrototypeOf(arr) === Array.prototype。
不写了,再写怕没有尽头了(^-^)!