天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

再談JavaScript的數(shù)據(jù)類型問題

  JavaScript的數(shù)據(jù)類型問題已經(jīng)討論過很多次了,但許多人還有許多書仍然沿用著錯誤的、混亂的一些觀點,所以就再細講一回。

  提及這個討論的原因在于argb同學(xué)在我的MSN博客(現(xiàn)在變成了wordproess,在這里)上的一段回復(fù),又更早的起源則是兩年前關(guān)于《JavaScript征途》一書的大討論:

  從“裝B被雷劈講起

  ——這個事就讓它過去了過去了吧。在討論中我提及到該書對JavaScript類型系統(tǒng)介紹的混亂,而argb翻出了這篇歷史文章,指我的混亂更混亂。于是我列了以下幾個問題給他:

  =============

  我想很難很快速地解釋你的問題。那么,接著你的思路,我就問幾個問題好了:

  1、函數(shù)是不是類型?是什么類型?

  2、為什么說JavaScript中的函數(shù)是第一型的?

  3、undefined如何包裝成object?即使你所說的是筆誤,那么對于一切都是對象的JavaScript,undefined是什么?

  4、true與Boolean(true)在類型上有什么不同?

  最后強調(diào)一下你的用詞問題:Undefined是類型,undefined是值,undefined是類型的名稱。此外,應(yīng)留意JavaScript中存在著值類型與引用類型。

  隨后argb的回復(fù)讓我覺得一切已經(jīng)混亂到不得不講的地步。因為此前也沒有討論過《JavaScript征途》中的類型系統(tǒng)問題,于是這干脆就補個功課。下面認認真真地談?wù)劊岔槺慊貜?fù)了argb同學(xué)。

  再次感謝argb。若非如此,我這篇功課還要欠很久。有讀者與朋友們的關(guān)心,總是好的。答疑釋解,于人于已,皆成美事。

  再談JavaScript的數(shù)據(jù)類型問題

  =============

  首先我們談兩點體會。其一,JavaScript不是純粹的面向?qū)ο笳Z言,它是混合語言,所以所謂一切面向?qū)ο蠹仁切麄饔谜Z,也是一種語言處理技巧。僅從面向?qū)ο髞砝斫膺@個語言的類型,會犯很多錯誤。其二,ECMAScript的描述總是很準(zhǔn)確而又遲滯于這門語言的發(fā)展。所以要理解一些現(xiàn)象,既要從JavaScript的歷史中去找,也要考慮到JavaScript現(xiàn)在的發(fā)展。ECMAScirpt是一個標(biāo)準(zhǔn)的、規(guī)范化的參考,但不是全部。

  接下來說說類型。JavaScript既是過程式語言,也是面向?qū)ο蟮恼Z言。這一定程度上,也表現(xiàn)為:它事實上有兩套類型系統(tǒng)。第一套類型系統(tǒng)是用typeof來識別,這是這個語言的基本類型系統(tǒng),只有六種類型,即undefined、number、boolean、string、object與function。我一般也稱之為基礎(chǔ)類型系統(tǒng)。之所以稱為基礎(chǔ),是因為第二套類型系統(tǒng)是以它為基礎(chǔ),從object這一種類型中發(fā)展起來的,即對象類型系統(tǒng)。

  對象類型系統(tǒng)用instanceof來識別,它相當(dāng)于其它高級語言中的is操作/運算。面向?qū)ο蟮亩鄳B(tài)主要通過as和is來表達,對于JavaScript來說,由于是弱類型的(沒有強制類型檢查),所以不需要as。

  對象類型系統(tǒng)與基礎(chǔ)類型系統(tǒng)存在映射關(guān)系,例如基礎(chǔ)類型的string影射到對象系統(tǒng)中的String。但這只是影射,所以本質(zhì)上來說string類型不是String類型。兩者本質(zhì)上不同。具體來說,undefined, string, number和boolean是值類型;object與function是引用類型。由于String、Number與Boolean在基礎(chǔ)類型中都屬于object類型,是Object()的子類,因此是引用類型。Function()也是引用類型。所有引用類型都可以看著Object()的子類,所以任意函數(shù)也是Object()的子類。例如"<匿名函數(shù)> instanceof Object"返回true。

  undefined是值類型,它沒有對應(yīng)的對象類型我們通常可以稱之為Undefined類型,但它沒有對應(yīng)的構(gòu)造器。undefined只有一個值,即undefined。準(zhǔn)確地說,undefined表明聲明(或產(chǎn)生)了但沒有值的變量。而Null也是一個類型,null是它的惟一值(按照語言規(guī)則,null也是一個關(guān)鍵字)。Null類型是對象類型,亦即是引用類型。所以Null與Undefined本質(zhì)的不同,是它們分屬在不同的類型系統(tǒng)中,解釋著不同類型系統(tǒng)中的無的概念。一般來說,DOM中的某個屬性或成員如果無值,應(yīng)該使用null;而JavaScript運算過程中如果出現(xiàn)無值,應(yīng)該使用undefined。

  上面強調(diào)要從兩套類型系統(tǒng)的角度來理解上述類型。而這兩個類型系統(tǒng)在JavaScript中是可以混用的,實現(xiàn)這一特性的技術(shù)被稱為類包裝。這是JavaScript對Java的主要借鑒,也是后來的.NETJava的主要借鑒之一類包裝也被稱為裝箱(以及拆箱)。JavaScript中的類包裝過程出現(xiàn)然屬性存取中,即.運算符或[]運算符。當(dāng)這兩個運算符發(fā)現(xiàn)左操作數(shù)x是一個值類型數(shù)據(jù)時,將隱式地調(diào)用Object(x)過程將它轉(zhuǎn)為對象,因此

  'abc'.length

  這個運算實際上就等效于

  Object('abc').length

  最后,我們回到原始的問題上來。所以我說:

  ====

  JavaScript 里面有6種基本類型,對象是其中一種,各種對象是對象(object)這一種類型中的子類(類型)。

  ====

  是沒有什么錯誤的。而朱先生在他的書中說:JavaScript 語言只有 3 種最原始的數(shù)據(jù)類型:數(shù)值型、字符串型和布爾型。JavaScript 還定義了幾個特殊的數(shù)據(jù)類型,如空類型(null)和未定義類型(undefined)。基本數(shù)據(jù)類型按值傳送,而復(fù)雜數(shù)據(jù)類型按引用傳送。

  這幾個觀點都不太靠譜。其一,這三種是原始的數(shù)據(jù)類型沒錯,但并不是只有3種,這個稍后一點我再說。其二,空類型與未定義類型這兩種說法都是錯的,應(yīng)該是Null類型和Undefined類型小寫的,是它們的值;首字母大寫才是它們的類型。其三,undefined也是按值傳遞的,然而在朱先生的分類里頭,就不知道如何歸屬。他起碼提到了:原始數(shù)據(jù)類型,特殊數(shù)據(jù)類型,值(傳遞的)類型,引用(傳遞的)類型。這樣復(fù)雜的分類,會更容易讓讀者混淆。

  最后說一下原始的數(shù)據(jù)類型。這個用詞在ECMAScript里面有,稱為"primitive types",但這個概念主要是從primitive values"里面引申出來的,而非單獨作為一個類型分類的依據(jù)ECMAScript中只提到過一次primitive type,并且也沒有稱之為types。ECMAScript用primitive values"來說明一些類型的原始值,例如Boolean Types具有原始值true/false。但這并沒有說明Boolean對象類型與值類型之間的差異或關(guān)系,例如不能表明true與Boolean(true)之間有什么不同。

  ECMAScript中使用primitive values",并陳述了這些原始值的定義,主要是ECMAScript要兼顧JavaScript語言的實現(xiàn)方案。在ECMAScript中相當(dāng)大的一部分是在描述一個語言的實現(xiàn),許多地方需要將一個對象轉(zhuǎn)換成primitive values",或使用primitive values"這樣的名詞來講述它的實際實現(xiàn)但我必須強調(diào),這與類型系統(tǒng)的定義與規(guī)劃沒什么關(guān)系。例如ECMA講述屬性(property)這一概念時,原文是:

Properties are containers that hold other objects, primitive values, or functions. A primitive value is a member of one of the following built-in types: Undefined, Null, Boolean, Number, and String; an object is a member of the remaining built-in type Object; and a function is a callable object. A function that is associated with an object via a property is a method.

  翻譯過來就是:

屬性可以包括其它對象、原始值或函數(shù)。一個原始值(primitive value)是以下內(nèi)建類型的一個成員(即一個值,value):Undefined, Null, Boolean, Number, 以及String;一個對象(object)是其它內(nèi)建對象類型的一個成員(實例,instance),函數(shù)(function)是一個可調(diào)用的對象。如果一個函數(shù)作為一個對象的屬性,則我們稱為方法(method)。

  上面的描述與類型系統(tǒng)如何劃分有什么關(guān)系嗎?沒有。關(guān)鍵在于上列5種原始值,都是可以跨語言來聲明或使用的。然而,要更細節(jié)地敘述這一點,需要完整地討論ECMAScript如何聲明與實現(xiàn)語言的全過程。

  所以如果將primitive value"作為類型系統(tǒng)來討論,就會相當(dāng)?shù)亓钊嘶靵y了。這也是我一開始提出那幾個問題的原因。

  最后,強調(diào)一點。function是類型。所以你提到:函數(shù)不是類型,函數(shù)是函數(shù),是類型(type)為object的一個分類(class),大概是所有混亂的總和了。關(guān)于第一型(first-class data types)的問題就不再講了,以前已講得太多。大家自己翻吧。

it知識庫再談JavaScript的數(shù)據(jù)類型問題,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: seyeye在清在线 | 广东95后小情侣酒店自拍流出 | 中文无码有码亚洲 欧美 | 中文字幕亚洲欧美日韩2019 | 小小水蜜桃视频高清在线观看免费 | 在线观看亚洲免费视频 | FREEHDXXXX学生妹 | 日日射夜夜干夜夜插在线播放 | 超碰国产亚洲人人 | 亚洲精品黄色 | 九九热这里只有精品2 | 92精品国产成人观看免费 | 男人天堂999| 午夜片无码区在线观看 | 久久人妻AV一区二区软件 | 99国产在线视频有精品视频 | 97亚洲狠狠色综合久久久久 | 亚洲精品蜜夜内射 | 国产精品久久久久久搜索 | 最近中文字幕2019免费版日本 | 欧美香蕉大胸在线视频观看 | 首页 国产 亚洲 中文字幕 | 最新黄yyid| 国产成人综合在线观看 | 日本xxxx裸体xxxx | 成人区在线观看免费视频 | 伊人久久天堂 | 亚洲精品久久久久久偷窥 | 阿离被扒开双腿疯狂输出 | bl 纯肉 高Hbl被强文 | 精品免费久久久久久影院 | 精品人妻一区二区三区视频53 | 在线播放成人无码日 | 韩国演艺圈悲惨在线 | 青青青久久 | 老司机午夜影院味味 | 国产精品一区二区免费 | 精品久久中文字幕有码 | 男人扒开添女人屁股 | 久久精品在现线观看免费15 | 大香伊蕉在人线国产97 |