天天看點

JavaScript 對象模型-執行模型(一)

Javascript作為一個用戶端的執行腳本語言,越來越受到行内的關注。

開始在學習javascript時,根本沒有對這種語言有深層次的了解,就開始使用了。

起初隻以為js的作用主要就是做本地化資料驗證的,随着時間的增長,越發發現javascript的潛力很大。尤其在使用了Jquery和YUI之後。

首先下面這篇文章介紹的是JS的基礎。

關于JS的學習資料有很多,如果隻是用JS做做資料驗證或者DOM控制,可能和這篇文章幹系不大。但如果你對你new一個對象時,它内部操作是什麼,或者,究竟Jquery和YUI這些JS的庫,内部如何實作很感興趣的話,可能這篇文章對你會有所幫助。

這些内容本來就很枯燥,我盡量嘗試寫的易懂一些吧。本人能力有限,有誤的地方希望能指出。

浏覽器一般會先下載下傳JS檔案到本地,然後解析,再執行。

下文主要是來自richie的博文,加上我參考其他資料所注解和一些文字的修正。

主要涉及内容是:Javascript的資料類型,Prototype機制,對象模型,執行機制,閉包。

談到閉包,很多人跳過JS原理,翻查了大量的資料都不是很了解它的概念。其實要認識閉包,對JS中函數,變量,作用域這些知識的認識是必須的。

資料類型

基本資料類型:是JS語言最底層的實作。

JavaScript 對象模型-執行模型(一)

Javascript内置資料結構(build-in data structure),資料結構是不能通過JS通路的。

Javascript内置構造器(build-in constructor),在你new一個對象時會調用到。

Javascript内置對象(build-in object),我們在JS裡面可以調用的資料類型。通常我們在JS中使用時會用首字母大寫,例如Number。

注:你可以使用typeof來判斷一個變量是什麼類型。下面是基本類型:

undefined,未定義,值類型

number,數值,值類型

string,字元串,值類型

boolean,布爾值,值類型

object,對象,引用類型,一個無序屬性的集合,這些屬性的值為簡單數值類型、對象或者函數。

function,函數,引用類型,函數是對象的一種,實作上内部屬性[[Class]]值為"Function",表明它是函數類型,除了對象的内部屬性方法外,還有[[Construct]]、[[Call]]、[[Scope]]等内部屬性。函數作為函數調用與構造器(使用new關鍵字建立執行個體對象)的處理機制不一樣(Function對象除外),内部方法[[Construct]]用于實作作為構造器的邏輯,方法[[Call]]實作作為函數調用的邏輯。

另外還有擴充類型:

Date,日期對象,引用類型,based object

RegExp,正态表達式,引用類型,based function

NaN,非數字,值類型,based number

開始很容易混淆undefined和NaN,其實

undefined就是指資料沒有值(a piece of data is undefined when it has no value)。

NaN則是一個警告值,你使用了非數字參與計算(NaN is a value that isn't a number even though you're expecting the value to be one)。

有下列兩點需要記住:

1.Function, Object, Boolean, Number, String, Date, Array, RegExp等都是JavaScript語言的内置對象,它們都可以看作是函數的派生類型,例如Number instanceof Function為true,Number instanceof Object為true。在這個意義上,可以将它們跟使用者定義的函數等同看待。

2.它們各自可以代表一種資料類型,由JS引擎用native code或内置的JS代碼實作,是暴露給開發者對這些内置資料類型進行操作的接口。在這個意義上,它們都是一種抽象的概念,後面隐藏了具體的實作機制。

看完上述介紹,我們來舉幾個例子:

var num1 = new Number(123);

var num2 = 123;

var num3 = Number(123);

num1 == num2;//true

num1 === num2;//false

num2 === num3;//true

num1 instanceof Number;//true

num1 instanceof Object;//true

上面這個例子,說明了幾點:

1. "=="是比較值,"==="是引用比較。"=="在比較時會進行類型轉換(例如1=='1',是true),是以隻要使用"==="就可以了。 

2.num1是Number的執行個體,也是Object的執行個體。

3.Number(123)可以視為強制類型轉換。

4.Number(123)和直接量123是等價的。

*需要注意的是,上面的例子隻是為了說明數字的關系。在現實使用JS的時候,沒有必要使用new Number的方式去産生數字。用直接量即可。

繼續閱讀