原文地址:由js apply與call方法想到的js數據類型(原始類型和引用類型)javascript
js的call方法與apply方法的區別在於第二個參數的不一樣,他們都有2個參數,第一個爲對象(即須要用對象a繼承b,那麼此時第一個參數就爲a,沒有則爲null),call方法第二個參數爲一個列表,能夠是html
obj.call(null, 1,2,3,4);
而apply第二個參數爲數組。這就是區別,下面來講說對它們的認識。java
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個數組的,以下:app
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也能夠用來繼承類的方法。學習
簡單的舉個例子:測試
建立對象的四種寫法:this
第一種.net
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種)
一、number
二、string
是惟一沒有固定大小的原始類型。
由於咱們都知道原始類型的值存儲在棧中,由於大小固定,內存較小,查找起來快;引用類型的值存在堆中,而引用的變量中存的是其值的地址,地址是固定的,因此存在棧中,但它的值是存在堆中的,變量中存的是它的地址。
三、undefind
當聲明變量後沒有初始化,並非未定義變量
var oTemp; alert(typeof oTemp); //輸出 "undefined" alert(typeof oTemp2); //輸出 "undefined"
前面的代碼對兩個變量輸出的都是 「undefined」,即便只有變量 oTemp2 從未被聲明過。若是對 oTemp2 使用除 typeof 以外的其餘運算符的話,會引發錯誤,由於其餘運算符只能用於已聲明的變量上。
當函數無明確返回值時,返回的也是值 「undefined」,以下所示:
function testFunc() { } alert(testFunc() == undefined); //輸出 "true"
四、null
表示還沒有存在的對象,若是函數或方法要返回的是對象,那麼找不到該對象時,返回的一般是 null。
alert(null == undefined); //輸出 "true"
這是由於值 undefined 其實是從值 null 派生來的,所以 ECMAScript 把它們定義爲相等的。
五、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