js的call方法與apply方法的區(qū)別在于第二個參數(shù)的不同,他們都有2個參數(shù),第一個為對象(即需要用對象a繼承b,那么此時第一個參數(shù)就為a,沒有則為null),call方法第二個參數(shù)為一個列表,可以是
創(chuàng)新互聯(lián)建站主營天元網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都app軟件開發(fā),天元h5微信小程序開發(fā)搭建,天元網(wǎng)站營銷推廣歡迎天元等地區(qū)企業(yè)咨詢
1
| obj.call( null , 1,2,3,4);
|
而apply第二個參數(shù)為數(shù)組。這就是區(qū)別,下面來說說對它們的認(rèn)識。
apply最常用的就是查找數(shù)組中的最大與最小值,還可以將2個數(shù)組合并:
1
2
3
4
5
6
7
8
9
| var max=Math.max.apply( null ,array);
var min=Math.min.apply( null ,array);
var arr1= new Array( "1" , "2" , "3" );
免費(fèi)會員網(wǎng)
var arr2= new Array( "4" , "5" , "6" );
Array.prototype.push.apply(arr1,arr2); //向數(shù)組尾部添加一項(xiàng)并更新length ,返回數(shù)組長度。
|
這里的Array.prototype.push本身是不能合并2個數(shù)組的,如下:
1
2
3
4
5
6
7
| 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
|
疑問:
1
2
3
4
5
6
7
| var arr1 = [ '1' , '2' , '3' ];
var arr2 = [ '4' , '5' , '6' ];
arr1.push(arr2);
alert(arr1); //返回卻是1,2,3,4,5,6呢?不解
|
當(dāng)然,apply與call也可以用來繼承類的方法。
簡單的舉個例子:
創(chuàng)建對象的四種寫法:
第一種
1
2
3
4
5
6
7
8
9
| 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();
|
第二種
1
2
3
4
5
6
7
| var People1 = {
name : 'ming' ,
show : function (){
alert( this .name);
}
}
People1.show();
|
第三種:用prototype去為對象增加屬性或者方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| 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();
|
第四種
1
2
3
4
5
6
7
| var People2 = new Object();
People2.name = 'A' ;
People2.show = function (){
alert( "ok" );
}
alert(People2.name);
|
這里用people1去繼承people
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| 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
|
今天就到這里了,太晚了,明天再整理數(shù)據(jù)類型的知識點(diǎn)。
到此處參考的資料:
http://www.cnblogs.com/KeenLeung/archive/2012/11/19/2778229.html
========================================================
6-22 11點(diǎn)繼續(xù)學(xué)習(xí):js數(shù)據(jù)類型,參數(shù)傳遞的問題。
原始數(shù)據(jù)類型(5種)
1、number
2、string
是唯一沒有固定大小的原始類型。
因?yàn)槲覀兌贾涝碱愋偷闹荡鎯υ跅V?,因?yàn)榇笮」潭?,?nèi)存較小,查找起來快;引用類型的值存在堆中,而引用的變量中存的是其值的地址,地址是固定的,所以存在棧中,但它的值是存在堆中的,變量中存的是它的地址。
3、undefind
當(dāng)聲明變量后沒有初始化,并不是未定義變量
1
2
3
| var oTemp;
alert( typeof oTemp); //輸出 "undefined"
alert( typeof oTemp2); //輸出 "undefined"
|
前面的代碼對兩個變量輸出的都是 “undefined”,即使只有變量 oTemp2 從未被聲明過。如果對 oTemp2 使用除 typeof 之外的其他運(yùn)算符的話,會引起錯誤,因?yàn)槠渌\(yùn)算符只能用于已聲明的變量上。
當(dāng)函數(shù)無明確返回值時,返回的也是值 “undefined”,如下所示:
1
2
3
| function testFunc() {
}
alert(testFunc() == undefined); //輸出 "true"
|
4、null
表示尚未存在的對象,如果函數(shù)或方法要返回的是對象,那么找不到該對象時,返回的通常是 null。
1
| alert( null == undefined); //輸出 "true"
|
這是因?yàn)橹?undefined 實(shí)際上是從值 null 派生來的,因此 ECMAScript 把它們定義為相等的。
5、boolean
引用數(shù)據(jù)類型,常見的有Object,Array,Function,Date。
所有的傳參都是傳遞的值。
簡單的原始數(shù)據(jù)傳參
1
2
3
4
5
6
7
8
9
10
11
| function show(num){
var a = 5;
num = a;
alert(num);
}
show(2); //返回5
|
因?yàn)橹刀际谴嬖跅V校灾祩鬟f。
引用類型的傳參,例子一
1
2
3
4
5
6
| function setName(obj){
obj.name = 'abc' ;
}
var person= new Object();
setName(person);
alert(person.name);
|
初始化一個對象person,person指向的是對象本身的地址,然后通過函數(shù)將person對象設(shè)置一個name屬性值為’abc’;這里始終 要記住的是,傳遞過來的地址,是用在函數(shù)內(nèi)部聲明的局部變量obj來保存,相當(dāng)于將person對象地址值賦值給obj。因?yàn)閛bj和person指向的 是同一個對象,當(dāng)obj變化后,person也會表現(xiàn)出來。
再來看這個例子
1
2
3
4
5
6
7
8
| function setName(obj){
obj.name = 'abc' ;
obj = new Object();
obj.name = "def" ;
}
var person= new Object();
setName(person);
alert(person.name); //abc
|
在函數(shù)中可以看到,將函數(shù)內(nèi)部的局部變量obj重新賦值了一個新的對象地址。此時obj就不在指向person了,那當(dāng)然結(jié)果返回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 中數(shù)據(jù)類型
http://www.jb51.net/article/29703.htm