javascript 基礎上

來源:互聯網
上載者:User

一、JavaScript最初其實是過程式的

追溯到1.0時代的JavaScript,其實是過程式的。它的基本特性有只有兩項,一項是能夠直接放在網頁的HTML
標籤中去接管事件,例如:

<input type="button" onclick="alert('hello')">

第二項則是支援一種簡單的物件建構器(函數)。其實這個時代的構造器不如說是初始化函數更合適,它應當
這樣寫:

function MyObject() {
  this.xxx = '...';
  this.yyy = '...';
}
obj = new MyObject();

所以,早期的JavaScript無可置疑地背上了“基於對象的過程式指令碼語言”的名頭,這一點也不冤枉。除了
上面兩項特性,JavaScript有著一些一般性的指令碼語言的性質,例如:
 -整個.js檔案一次性裝載到執行環境(例如WEB瀏覽器)中,在經曆一次文法分析之後,開始逐行執行;
 -在上述文法分析周期,(具名的)函數和用"var"聲明的變數被預先處理在一個標識符表中,以便指令碼代碼使用;
 -從全域的程式碼或函數調用開始執行,整個過程中執行不到的代碼不被查錯(除第一步中的文法檢錯外)。
也具有通常的過程式語言的性質,例如:
 -有if/for/while/switch等語句;
 -用function來聲明函數,使用"(..)"來聲明它的形式參數表,以及表示函數調用和傳參;
 -類似於C語言的基本文法,包括使用"{..}"來表示代碼塊,以及使用"!="等運算子號;
 -一個類似於Java語言的對象操作運算子"."號,和屬性、方法這樣的基本概念。

好了,現在你看到了一個基本的JavaScript語言,它的代碼只有象C一樣的函數與語句行,支援非常簡單的面
向對象編程。OK,這其實也差不多是JavaScript的全部……嗯……全部的文法基礎觀念。如果你用過一門哪怕
稍稍入門一點的程式語言,你都會覺得JavaScript其實挺簡單的。

是啊,“寫個函數,然後調用它”,就這麼簡單。例如:

function hi() {
  alert('hello, world.');
}
hi();

二、稍微複雜一點的是資料類型

JavaScript有六種基礎資料型別 (Elementary Data Type),分為兩類。一類是實值型別,即undefined,string, number和boolean;一類
是參考型別,即function和object。檢測資料X是何種類型,可以簡單地使用"typeof X"來返回一個字串。

實值型別與參考型別在其它進階語言中,是用“訪問過程中是傳值還是傳引用”來區別的。簡單說,在下面函數
中:

function foo(X) {
}
X傳入的是值本身,還是一個指向該值的引用(你可以想象成指標),表明了X是何種類型。與其它語言不同的
是,JavaScript不在調用入口上加指示字來說明傳值的方法,例如:

function foo(var X) {
  // 一般進階語言中,var表明總是傳入變數X的引用
}

而是,簡單的由指令碼引擎根據實際傳入的X的資料類型來決定如何傳值。例如:

function foo(X) {
  ...
}
foo('123'); // <- 字串'123'值
foo(aObj);  // <- aObj是一個對象引用

能這樣處理的關鍵,在於JavaScript類型系統足夠簡潔。六種基本類型包括了三個哲學化的觀念:能執行的
與不能執行的;對象或非對象;有(值)或無(值)。顯然,理解這種哲學性的思想並不容易,因為更複雜一層
的、自包含的邏輯是:函數也是對象、值也是對象、無值也是值。

這就是JavaScript類型系統的全部了。如果你想簡單的用用,那麼你記住下面的就夠了:
 -string、number、boolean三種簡單實值型別是用來傳給網頁顯示的;
 -object用來存放其它的object、funtion或上述簡單實值型別,並用'.'運算通過一個屬性名稱找到它們;
 -undefined是用來檢測資料有效無效的;
 -function是用來執行的。
當然,如果你要成為思想家或者語言學的瘋子,那麼去思考上面的哲學化命題吧,我不攔著你。

三、能用鼻子想通的就是直接量了

或許很多人都搞不明白JavaScript中的直接量聲明,然而它確實是非常簡單的。既然我們大多數進階語言都
支援常量聲明,甚至最原始的組合語言也支援立即值——例如:

// in C
#define ABYTE  256
// in delphi
const
  ABYTE = 256
; in asm
mov ah, 256
那麼JavaScript當然……必然……可以面無愧色地支援直接量了——他們其實是一個概念。例如:

// in javascript
var
  aByte = 256

只不過在理解的時候,一定要切記:所有上述的代碼中,所謂直接量或立即值,是指那個'256',而不是那
個變數或常量的標識符ABYTE/aByte。更進一步的,你要知道JavaScript支援了8種直接量聲明:
--------------------
數值:支援整數,浮點和0x等進位首碼,以及……等等;
布爾值:true/false;
無值:undefined;
函數:function() { ... },也稱為匿名函數;
字串:使用'..'或"..",支援多行和轉義符;
Regex:使用/../..,支援g,i,m等正則配置;
數組:使用[..],支援嵌套數組;
對象:使用{...},支援嵌套對象聲明;
--------------------
你可以把上述字元量作為一個個體,用在代碼——我的意思是運算式或語句行——的任意位置。用鼻子就可以
進行的推論是:

//既然可以寫:
  aaa = 'hello, ' + 'world';

//那麼就必然可以寫:
  bbb = [1,2,3] + [4,5,6];

//同樣也就必然可以寫:
  ccc = /abc/ + /cdf/

//同樣:
// ……

如上的,你可以把所有的直接量放在運算式或語句中間。偶爾的,因為文法解析的必要,你可能需要用一對
括弧把這個直接量括起來——否則文法上會出現歧義,例如下面這個:

  ddd = (function() {}) + (function() {})
好了,直接量原本就這麼簡單,你只需要期望自己還有一個沒退化的鼻子就好了。

四、原型繼承

原型繼承可能是這個世界上最簡單不過的東西了。

我們假定一個對象是一張表——偉大的Anders就支援我這個假設,他說JavaScript的對象是“屬性包”——
這樣的一個表中存放的就是“name=value”這樣的“名字/值”對。當我們想用下面的代碼:

aObj.name
去找值(value)時,就在表裡查一下(用delphi的人應該記得TStringList吧)。對象,哦,所謂對象——在
我曾經的理解裡——就是“帶有繼承關係的結構體(struct/record)”。那麼,繼承關係是?

是這樣,如果上面的尋找不成功,對於原型繼承來說,只需要在aObj這個對象的“原型”中找一下,就成了。
這個原型也是一個對象,記錄在構造器函數的prototype屬性中。例如:

function MyObject() {
  // ...
}
MyObject.prototype = xxx;

var aObj = new MyObject()
zzz = aObj.name;

當在aObj中找不到name這個屬性時,按照上面的規則,就會去xxx這個對象中找,也就是試圖找找"xxx.name"。
由於xxx本身也是一個對象,也會有一個構造器函數(例如xxxObject()),因此當xxx.name也找不到時,就會
去xxxObject.prototype裡面去找……如此……如此深層次的挖掘,直到再也找不到……就返回undefined。

多簡單啊,所謂原型繼承,只不過是一個簡單的檢索規則。

反過來說,你需要讓aObj能訪問到某個成員,也只需要修改一下它(或它們——一指類似aObj的執行個體)的原型
就好了。這在JavaScript中是非常常用的。例如你想讓所有的string都有某個屬性:

String.protoype.MyName = 'string'
又例如你想讓所有的對象都有某個屬性(或方法,或其它什麼東東),那麼:

Object.prototype.getMyName = function() {
  return this.MyName;
}

多麼美好,現在String也能getMyName了,函數也能getMyName了,所有沒有名字的也有名字了——當然,名
字是undefined。

 

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/aimingoo/archive/2008/10/06/3022379.aspx

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.