每个函数都包含两个非继承而来的方法:apply()和call(),两者用途都是在特定的作用域中调用函数,他们能够改变函数赖以运行的作用域。
一:this.method.apply(this,arguments)
1,apply 的第二个参数是 array like object,可以用来传递不确定个数的参数,类数组对象 (Array-like Object) 是类似数组一样有length属性和索引属性的对象。
2,Array.from 方法从一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例。
3,arguments 是常见的类数组,并不是随便取的一个变量名,而是一个保留字,代表程序执行时所在函数传进来的所有参数,是一个类似于数组的对象(可以通过 arguments[0] , arguments[2] 取得值,可以用 arguments.length 获得长度,但是没有数组的 slice split 等方法)。
4,**arguments 的长度取决于, 当前函数(arguments.callee ,此例中是调用 this.method 的“父级函数” )**在执行时传进来的参数数量。所以当我们想设计比较灵活的API,需要不确定参数个数的函数时,它就特别有用。
5,arguments有一个callee属性,该属性是一个指针,指向拥有这个arguments对象的函数。
二:深浅拷贝
.
e
x
t
e
n
d
(
)
的
深
拷
贝
和
.extend()的深拷贝和
.extend()的深拷贝和.extend()的浅拷贝
js中有简单类型和引用类型的区分,对于简单类型不存在深拷贝和浅拷贝的区分,对于引用类型浅拷贝只是简单复制一个指针指的是同一个地址,而深拷贝会重新开辟一块内存空间把对象一层层复制出去。
浅拷贝(false 默认):如果第二个参数对象有的属性第一个参数对象也有,那么不会进行相同参数内部的比较,直接将第一个对象的相同参数覆盖。
深拷贝(true):如果第二个参数对象有的属性第一个参数对象也有,还要继续在这个相同的参数向下一层找,比较相同参数的对象中是否还有不一样的属性,如果有,将其继承到第一个对象,如果没有,则覆盖。
var object1 = {
apple: 0,
banana: {
weight: 52,
price: 100
},
cherry: 97
};
var object2 = {
banana: {
price: 200
},
durian: 100
};
//默认情况浅拷贝
//object1--->{"apple":0,"banana":{"price":200},"cherry":97,"durian":100}
//object2的banner覆盖了object1的banner,但是weight属性未被继承
//$.extend(object1, object2);
//深拷贝
//object1--->{"apple":0,"banana":{"weight":52,"price":200},"cherry":97,"durian":100}
//object2的banner覆盖了object1的banner,但是weight属性也被继承了呦
$.extend(true,object1, object2);
console.log('object1--->'+JSON.stringify(object1));
三:typeof 判断的类型