apply和call的高级用法


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());

理解:这是因为toStringObject的原型方法,而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]"

删除了ArraytoString方法后,同样再采用arr.toString()方法调用时,不
再有屏蔽Object原型方法的实例方法,因此沿着原型链,arr最后调用了Object
toString方法,返回了和Object.prototype.toString.call(arr)相同的结果


文章作者: Mr. Zhan
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Mr. Zhan !
 上一篇
vue引入图片url变量问题 vue引入图片url变量问题
vue引入图片url变量问题 引入方式 普通引入 <template> // 普通引入 <img src = "../assets/images/01.jpg"> // webpack编译处理后: <
2020-05-21 Mr. Zhan
下一篇 
基于vue-cli3的vue项目移动端样式适配 基于vue-cli3的vue项目移动端样式适配
rem 布局 - 插件 postcss-pxtorem的配置 安装插件 npm i lib-flexible postcss-px2rem 在 public 中的 index.html 中删除 meta 标签 flexible会为页面根据
2020-05-12 Mr. Zhan
  目录