apply和call的高级用法
1. 求数组中的最小值,借用 apply方法
// var min = Math.min(11,2,4,5);
// console.log(min); // 2
var arr = [11,2,4,5];
console.log(Math.min.apply(Math,arr)); // 2 apply将数组展开2. 求数组等具体数据类型,借用 call方法
// toString方法数 Object的方法,其他数据类型都对 toString方法进行了重写
var obj = {};
console.log(obj)
console.log(obj.toString()); // [object Object]
// 数组的 toString方法
var arr = [1,2];
console.log(arr.toString()); // 1,2
// 直接调用父类 Object的 toString方法,改变 this为 arr数组
console.log(Object.prototype.toString.call(arr)); // [object Array]
var num = 4;
console.log(num.toString());理解:这是因为toString为Object的原型方法,而Array ,function等类型作为Object的实例,
都重写了toString方法。不同的对象类型调用toString方法时,根据原型链的知识,调用
的是对应的重写之后的toString方法(function类型返回内容为函数体的字符串,Array类型返回元素组成的字符串…..),而不会去调用Object上原型toString方法
(返回对象的具体类型),所以采用obj.toString()不能得到其对象类型,只能将obj转换为字符串类型;
因此,在想要得到对象的具体类型时,应该调用Object上原型toString方法。
var arr=[1,2,3];
console.log(Array.prototype.hasOwnProperty("toString")); // true
console.log(arr.toString()); // 1,2,3
delete Array.prototype.toString; //delete操作符可以删除实例属性
console.log(Array.prototype.hasOwnProperty("toString")); // false
// 删除后直接找到父类Object的toString方法
console.log(arr.toString()); // "[object Array]"删除了Array的toString方法后,同样再采用arr.toString()方法调用时,不
再有屏蔽Object原型方法的实例方法,因此沿着原型链,arr最后调用了Object
的toString方法,返回了和Object.prototype.toString.call(arr)相同的结果

