由js apply與call方法想到的js資料類型(原始類型和參考型別)

來源:互聯網
上載者:User

標籤:

原文地址:由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

由js apply與call方法想到的js資料類型(原始類型和參考型別)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.