標籤:
原文地址:由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資料類型(原始類型和參考型別)