在學習過傳統的面向對象語言後,如java c++,轉學javascript 卻有點不適應,特別是javascript 中所謂的object(對象) function(函數),有時候會被搞暈。於是乎簡單整理了下面的一些概念性的東西,方便學習和理解,會結合一點java面向對象的知識加以說明。
先了解幾個概念:
1.首先Object 在ECMAScripe 中是指什麼,在ECMAScripe 中有5種簡單數據類型:Undefined,Null,Boolean,Number,String. 還有一種複雜數據類型,那就是Object.
2.引用類型---java中的類的概念
引用類型的值--- java中對象的概念
3.函數---- java 中方法的概念
4.var --- 申明變量的一個操作符,因為js 的變量是鬆散類型的,所謂鬆散就是可以用來保存任何數據,變量僅僅用來表示一個佔位符而已,所以變量也不必指定什麼String ,int ,直接var 就可以了,注意對象可以用var 聲明.
5.Object(), 是什麼--- java中Object 的構造方法, js 中Object 的構造函數。
Object
js 是可以動態的添加屬性和方法的。
比如創建一個Object 實例
var obj = new Object();
變量obj 就是new Object() 的對象。
接下來:
var obj = new Object();obj.name = 'Zeng';obj.age = 12;obj.fun = function () { console.log(this.name+this.age);}但這樣封裝性不太好,所以比較經常使用的是對象字面量表示法
var obj = { name:'Zeng', age:12, fun:function () { console.log(this.name+this.age); }}obj.fun(); // 打印出: Zeng12對象屬性的訪問:
1,採用中括號
console.log(obj["name"]);
2,採用點, 建議採用此方式
console.log(obj.name );
function
函數對於任何語言來說都是重要的一部分,函數是js的叫法,你也可以理解為就是java 的方法,c 語言的函數,都一樣的。 不過在申明和使用上, js 的函數可很大不同。
函數的一個示例:
function fun() { return "例子";}console.log(fun()); // 輸出: '例子'還可以這樣:
var fun = function() { return "使用表達式創建函數"};console.log(fun()); // 輸出: "使用表達式創建函數"上面例子你會注意到函數沒有函數名,只有一個變量名fun ,表達式尾部還有一個;分號,
你可以把它當作聲明一個變量的表達式就好理解了,聲明其它變量是這麼寫的:
var name = "Zeng"; // 有變量名,還有分號
來一個帶參數的例子:
function fun() { return arguments[0] + arguments[1] + arguments[2];}console.log(fun("這是","一個","例子")); // 輸出:“這是一個例子”是不是有點奇怪,首先我創建的函數沒有帶參數的,在調用的時候有給參數,在函數里面也能獲得參數並返回。
其實這裡是要說明一點,js 函數不介意傳遞進來幾個參數,也不在乎參數是什麼類型!原因是函數內部接收參數是用一個數組來儲存的!
數組也就是上面的arguments , 數組當然不介意你傳幾個參數進來,有參數我加一,沒參數我就是null 。
咱們可以利用這個特性做個例子:
模仿方法的重載--利用參數個數的不同執行不同反應
function fun() { if(arguments.length == 1){ return arguments[0]*10; } if(arguments.length == 2){ return (arguments[0]+arguments[1])*10; } return 10;}console.log(fun(11,111)); // 返回1220 ! ! ! !沒有重載:
上面例子是模仿函數的重載,為什麼要模仿呢,我自己創建幾個不同參數的函數不久可以了。
function fun( num1) { return "只有一個參數的函數"}function fun( num1,num2) { return "有兩個參數的函數";}console.log(fun(11)); // 輸出“有兩個參數的函數”明明調用的是帶一個參數的函數,執行的確是帶兩個參數的函數。原因:js定義了兩個相同名字的函數,該名字只屬於後定義的函數! ! ! 所以在js 中沒有重載這一特性。
函數名是指針:
var fun = function(num1,num2) { return num1+num2;};var new_fun = fun;fun = null; // 將函數置nullconsole.log(new_fun(10,20)); //輸出:30console.log(fun(10,20)); //拋出異常:fun is not a function可看出儘管fun = null; 但在此之前var new_fun = fun; 也就是指針也指向了new_fun 了,所以new_fun () 函數還能執行,並且函數體沒有置null
函數也可以作為值來使用:
function add(fun,num) { return fun(num);}function add_10(num) { return num+10;}console.log(add(add_10,200)); // 輸出: 210可以這麼解釋:
function add( 函數, 參數) { return 函數( 傳遞過來的參數);}函數的arguments.callee
這是一個遞歸的示例
function fun(num) { if(num<=1){ console.log(num ); return 1 ; }else { console.log(num ); return num * arguments.callee(num-1); }}console.log(fun(3)); // 輸出6