zoukankan      html  css  js  c++  java
  • 由js apply与call方法想到的js数据类型(原始类型和引用类型)

    原文地址:由js apply与call方法想到的js数据类型(原始类型和引用类型)

    js的call方法与apply方法的区别在于第二个参数的不同,他们都有2个参数,第一个为对象(即需要用对象a继承b,那么此时第一个参数就为a,没有则为null),call方法第二个参数为一个列表,可以是

    obj.call(null, 1,2,3,4);
    

      

    而apply第二个参数为数组。这就是区别,下面来说说对它们的认识。

    apply最常用的就是查找数组中的最大与最小值,还可以将2个数组合并:

    var max=Math.max.apply(null,array);
     
     var min=Math.min.apply(null,array);
     
    var arr1=new Array("1","2","3");
     
    var arr2=new Array("4","5","6");
     
    Array.prototype.push.apply(arr1,arr2);//向数组尾部添加一项并更新length ,返回数组长度。
    

      

    这里的Array.prototype.push本身是不能合并2个数组的,如下:

    var arr1 = ['1','2','3'];
     
    var arr2 = ['4','5','6'];
     
    alert(Array.prototype.push(arr1,arr2));//返回2
     
    alert(Array.prototype.push.apply(arr1,arr2));//返回6
    

      

    疑问:

    var arr1 = ['1','2','3'];
     
    var arr2 = ['4','5','6'];
     
    arr1.push(arr2);
     
    alert(arr1);//返回却是1,2,3,4,5,6呢?不解
    

      

    当然,apply与call也可以用来继承类的方法。

    简单的举个例子:

    创建对象的四种写法:

    第一种

    function People(name, sex){
     this.name = name;
     this.sex = sex;
     this.show = function(){
     alert(this.name+'sex'+this.sex+'say hello');
     }
     }
     var ming = new People('y', 'nan');
     ming.show();
    

      

    第二种

    var People1 = {
    name : 'ming',
    show : function(){
    alert(this.name);
    }
    }
    People1.show();
    

      

    第三种:用prototype去为对象增加属性或者方法

    function CicleTwo(r){
     
    this.r = r;
     
    }
     
    CicleTwo.prototype.area = function () {
     
    console.log('第二种:'+Math.PI * this.r * this.r) ;
     
    };
     
    //测试
     
    var newCicleTwo = new CicleTwo(3);
     
    newCicleTwo.area();
    

      

    第四种

    var People2 = new Object();
    People2.name = 'A';
    People2.show = function(){
    alert("ok");
    }
     
    alert(People2.name);
    

      

    这里用people1去继承people

    function People(name, sex){
    this.name = name;
    this.sex = sex;
    this.show = function(){
    alert(this.name+'sex'+this.sex+'say hello');
    }
    }
    var ming = new People('y', 'nan');
    // ming.show();
     
    var People1 = {
    name : 'ming',
    show : function(){
    alert(this.name);
    }
    }
    // People1.show();
     
    People1.show.apply(ming);//弹出y,而不是ming,说明继承了people中的名字y
    

      



    今天就到这里了,太晚了,明天再整理数据类型的知识点。

    到此处参考的资料:

    http://www.cnblogs.com/KeenLeung/archive/2012/11/19/2778229.html

    ========================================================

    6-22  11点继续学习:js数据类型,参数传递的问题。

    原始数据类型(5种)

    1、number

    2、string

    是唯一没有固定大小的原始类型。

    因为我们都知道原始类型的值存储在栈中,因为大小固定,内存较小,查找起来快;引用类型的值存在堆中,而引用的变量中存的是其值的地址,地址是固定的,所以存在栈中,但它的值是存在堆中的,变量中存的是它的地址。

    3、undefind

    当声明变量后没有初始化,并不是未定义变量

    var oTemp;
    alert(typeof oTemp);  //输出 "undefined"
    alert(typeof oTemp2);  //输出 "undefined"
    

      

    前面的代码对两个变量输出的都是 “undefined”,即使只有变量 oTemp2 从未被声明过。如果对 oTemp2 使用除 typeof 之外的其他运算符的话,会引起错误,因为其他运算符只能用于已声明的变量上。

    当函数无明确返回值时,返回的也是值 “undefined”,如下所示:

    function testFunc() {
    }
    alert(testFunc() == undefined);  //输出 "true"
    

      

    4、null

    表示尚未存在的对象,如果函数或方法要返回的是对象,那么找不到该对象时,返回的通常是 null。

    alert(null == undefined);  //输出 "true"
    

      

    这是因为值 undefined 实际上是从值 null 派生来的,因此 ECMAScript 把它们定义为相等的。

    5、boolean

     引用数据类型,常见的有Object,Array,Function,Date。

    所有的传参都是传递的值。

    简单的原始数据传参

    function show(num){
     
    var a = 5;
     
    num = a;
     
    alert(num);
     
    }
     
    show(2);//返回5
    

    更清楚的一个例子:

    var a = 1;
    function foo(x) {
        x = 2;
    }
    foo(a);
    console.log(a); // 仍为1, 未受x = 2赋值所影响
    

      

    因为值都是存在栈中,以值传递,x只是a的一个副本而已,并不影响a本身。

    引用类型的传参,例子一

    function setName(obj){
    obj.name = 'abc';
    }
    var person=new Object();
    setName(person);
    alert(person.name);
    

      

    初始化一个对象person,person指向的是对象本身的地址,然后通过函数将person对象设置一个name属性值为’abc’;这里始终要记住的是,传递过来的地址,是用在函数内部声明的局部变量obj来保存,相当于将person对象地址值赋值给obj。因为obj和person指向的是同一个对象,当obj变化后,person也会表现出来。

    再来看这个例子

    function setName(obj){
    obj.name = 'abc';
    obj = new Object();
    obj.name = "def";
    }
    var person=new Object();
    setName(person);
    alert(person.name);//abc
    

      

    在函数中可以看到,将函数内部的局部变量obj重新赋值了一个新的对象地址。此时obj就不在指向person了,那当然结果返回abc而不是def。

    参考资料:

    http://www.w3school.com.cn/js/pro_js_primitivetypes.asp

    http://www.zhihu.com/question/27114726

    http://www.zhihu.com/question/27114726

    javascript 中数据类型

    http://www.jb51.net/article/29703.htm

  • 相关阅读:
    1. SSTI(模板注入)漏洞(入门篇)
    Golang之协程同步
    Mysql 中的事务与锁
    QUIC协议
    原子操作与内存屏障之三——内存屏障
    原子操作与内存屏障之二——原子操作
    原子操作与内存屏障之一——CPU缓存
    KVM性能优化
    KVM配置及维护
    Linux中KVM桥接的配置
  • 原文地址:https://www.cnblogs.com/jhmydear/p/4593196.html
Copyright © 2011-2022 走看看