Argument
同this一样是函数的内置对象,它代表的是所有实参保存的位置
它是一个伪数组(只能访问元素及长度,但是不能使用其数组相关API)
function fun() {
console.log(arguments);
for (let i = 0; i < arguments.length; i++) {
console.log(arguments[i]);
}
}
fun(1, 2, 3, "heihei")//输出结果是遍历的实参
function fun() {
for (let i = 0; i < arguments.length; i++) {
if (typeof arguments[i] == "boolean") {
console.log("执行布尔参数的代码");
} else if (typeof arguments[i] == "number") {
console.log("执行数字参数的代码");
} else if (typeof arguments[i] == "string") {
console.log("执行字符串参数的代码");
}
}
}
fun(123, true);//可以根据数据类型判断执行的代码
argument.callee
argument有个属性callee,该 属性等价于该函数对象本身
function fun(n) {
let c;
if (n == 1) {
c = 10;
} else {
c = arguments.callee(n - 1) + 2;
}
return c;
}
console.log(fun(5));
原型对象
prototype:原型对象
原型对象:保存着所有实例对象共享的属性或者方法
为什么需要原型对象
因为所有的方法应该是属性整个类族,而不是属性某个对象本身
//如何为原型对象添加新的属性和方法
Student.prototype.eat = function(food) {
console.log(this.name + ":吃" + food);
}
Student.prototype.teacher = "大黄";
let s = new Student("老王", 1, 100);
s.eat("佛跳墙");
let s1 = new Student("老绿", 2, 58);
s1.eat("满汉全席");
//如果实例化对象企图修改原型对象的数值
//就等价于为自身添加了一个自定义属性
s.teacher = "小白";
//删除自定义属性teacher
delete s.teacher;
Student.prototype.teacher = "老黄";
console.log(s.teacher, s1.teacher);
原型图
实例化对象如何访问所有的属性(自身的属性和原型上的方法或者属性)
每个实例化对象都可以直接访问自己添加的自定义属性
每个实例化对象还有一个_proto_,_proto_指向该类的原型对象protptype
每个实例对象通过prototype去访问原型对象上的属性或者方法
apply()和call()
apply和call:作用都是修改this指向
可以对类和函数的关系进行解耦
被改变this指向的方法.call(this指向,参数1,参数2...);
被改变this指向的方法.apply(this指向,【参数1,参数2...】);
面试题
apply和call及bind的异同?
1.它们都是改变this指向的函数对象的方法
2.bind通常针对于匿名函数,apply和call针对有名函数
3.call和apply的参数不同,apply需要用数组包裹起来改变this的函数的参数
4.call和apply直接调用该函数,而bind知识生成一个新的函数对象,不会调用该函数
instanceof
typrof:检测内置基本类型,任何引用类型都会返回oject
instanceof 针对引用类型进行判断
对象 instance类型:判断对象是否是该类型,返回boolen
面试题
typeof和instanceof的作用
1.typeof用来检测基本类型(string,number,boolean),所有的引用类型都返回boject
2.instanceof用来检测引用类型的具体类型,返回布尔值
3.*instanceof*拥有类型兼容规则