由js apply與call方法想到的js數據類型(原始類型和引用類型)

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

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

javascript 中數據類型

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

相關文章
相關標籤/搜索