• call()与apply()区别typeof和instanceof的区别


    摘自  http://www.cnblogs.com/qzsonline/archive/2013/03/05/2944367.html

    一、方法的定义 
    call方法: 
    语法:call(thisObj,Object)
    定义:调用一个对象的一个方法,以另一个对象替换当前对象。
    说明:
    call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。 
    如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。 

    apply方法: 
    语法:apply(thisObj,[argArray])

    apply传入的是数组,call方法后面传入的是数组中的对象
    定义:应用某一对象的一个方法,用另一个对象替换当前对象。 
    说明: 
    如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。 
    如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。

    function Animal(name) {
        this.name = name;
        this.showName = function() {
            console.log(this.name);
        };
    }
    
    function Cat(name) {
        Animal.call(this, name);
    }
    Cat.prototype = new Animal();
    
    function Dog(name) {
        Animal.apply(this, name);
    }
    Dog.prototype = new Animal();
    
    var cat = new Cat("Black Cat"); //call必须是object
    
    var dog = new Dog(["Black Dog"]); //apply必须是array
    
    cat.showName();
    dog.showName();
    
    console.log(cat instanceof Animal);
    console.log(dog instanceof Animal);
    

     模拟call apply 的this替换

    function Animal(name) {
        this.name = name;
        this.showName = function() {
            alert(this.name);
        };
    };
    
    function Cat(name) {
        this.superClass = Animal;
        this.superClass(name);
        delete superClass;
    }
    
    var cat = new Cat("Black Cat");
    
    cat.showName();
    
    var arr1 = new Array();
    for(var i=0;i<3;i++){
          arr1[i] =i
    }
    console.log(arr1)
    var arr2 = new Array();
    for(var m=0;m<3;m++){
          arr2[m]=m
    }
    /*call()和apply()方法*/
    arr1.push.apply(arr1,arr2);
    console.log(arr1);//[0, 1, 2, 0, 1, 2]
    arr1.push.call(arr1,arr2);
    console.log(arr1);// [0, 1, 2, 0, 1, 2, {0,1,2}]
    // console.log(ccc);
    arr11 = Array.prototype.push.apply(arr1,arr2);
    console.log(arr11);//输出数组总数

    typeof和instanceof的区别

    摘自 http://blog.csdn.net/u014421556/article/details/52083215

    typeof来判断变量的基本类型

    但是这个方法不适用于来判断数组,因为不管是数组还是对象,都会返回object,这就需要我们需求其他的方法。

    有几种方法可以拿来判断:

    1、constructor属性

    这个属性在我们使用js系统或者自己创建的对象的时候,会默认的加上,例如:

    var arr = [1,2,3];  //创建一个数组对象

    arr.prototype.constructor = Array;  //这一句是系统默认加上的

    所以我们就可以这样来判断:

    var arr = [1,2,3,1]; 

    alert(arr.constructor === Array);   // true

    2、instanceof

    instanceof是检测对象的原型链是否指向构造函数的prototype对象的,所以我们也可以用它来判断:


    var arr = [1,2,3]; 

    alert(arr instanceof Array);   // true

    判断数组最终方案

     var arr = [1,2,3]; 
    
    function isArrayFn(obj){  //封装一个函数
    
    if (typeof Array.isArray === "function") { 
    
    return Array.isArray(obj); //浏览器支持则使用isArray()方法
    
    }else{                     //否则使用toString方法
    
    return Object.prototype.toString.call(obj) === "[object Array]"; 
    
    } 
    
    } 
    
    alert(isArrayFn(arr));// true
  • 相关阅读:
    LearnMoreStudyLess《如何高效学习》斯科特.杨
    Asp.net 生成多个Excel打包zip进行下载(建立在Aspose.Cells.dll生成Excel,建立在ICSharpCode.SharpZipLib.dll打包zip)
    【面经】美团测试1,2,3面,一起来聊聊?
    【python】面试高频:浅拷贝 vs 深拷贝、'==' vs 'is'
    【图解Http 学习摘要】五、HTTPS 中的加密、证书介绍,不一直使用 HTTPS 的原因
    【图解Http 学习摘要】四、HTTP 缺点
    【图解Http 学习摘要】三、HTTP 协议基础、四次挥手
    【图解Http 学习摘要】二、IP,TCP 和 DNS、三次握手
    【图解Http 学习摘要】一、http介绍、TCP/IP 协议族
    【杂谈】关于常见架构的整理,单应用、微服务、SOA、分布式和集群
  • 原文地址:https://www.cnblogs.com/NB-JDzhou/p/7119748.html
Copyright © 2020-2023  润新知