一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

再談JavaScript的數(shù)據(jù)類(lèi)型問(wèn)題

  JavaScript的數(shù)據(jù)類(lèi)型問(wèn)題已經(jīng)討論過(guò)很多次了,但許多人還有許多書(shū)仍然沿用著錯(cuò)誤的、混亂的一些觀(guān)點(diǎn),所以就再細(xì)講一回。

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

  從“裝B被雷劈講起

  ——這個(gè)事就讓它過(guò)去了過(guò)去了吧。在討論中我提及到該書(shū)對(duì)JavaScript類(lèi)型系統(tǒng)介紹的混亂,而argb翻出了這篇?dú)v史文章,指我的混亂更混亂。于是我列了以下幾個(gè)問(wèn)題給他:

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

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

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

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

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

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

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

  隨后argb的回復(fù)讓我覺(jué)得一切已經(jīng)混亂到不得不講的地步。因?yàn)榇饲耙矝](méi)有討論過(guò)《JavaScript征途》中的類(lèi)型系統(tǒng)問(wèn)題,于是這干脆就補(bǔ)個(gè)功課。下面認(rèn)認(rèn)真真地談?wù)劊岔槺慊貜?fù)了argb同學(xué)。

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

  再談JavaScript的數(shù)據(jù)類(lèi)型問(wèn)題

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

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

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

  對(duì)象類(lèi)型系統(tǒng)用instanceof來(lái)識(shí)別,它相當(dāng)于其它高級(jí)語(yǔ)言中的is操作/運(yùn)算。面向?qū)ο蟮亩鄳B(tài)主要通過(guò)as和is來(lái)表達(dá),對(duì)于JavaScript來(lái)說(shuō),由于是弱類(lèi)型的(沒(méi)有強(qiáng)制類(lèi)型檢查),所以不需要as。

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

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

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

  'abc'.length

  這個(gè)運(yùn)算實(shí)際上就等效于

  Object('abc').length

  最后,我們回到原始的問(wèn)題上來(lái)。所以我說(shuō):

  ====

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

  ====

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

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

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

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

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.

  翻譯過(guò)來(lái)就是:

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

  上面的描述與類(lèi)型系統(tǒng)如何劃分有什么關(guān)系嗎?沒(méi)有。關(guān)鍵在于上列5種原始值,都是可以跨語(yǔ)言來(lái)聲明或使用的。然而,要更細(xì)節(jié)地?cái)⑹鲞@一點(diǎn),需要完整地討論ECMAScript如何聲明與實(shí)現(xiàn)語(yǔ)言的全過(guò)程。

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

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

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

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

主站蜘蛛池模板: 2021精品国夜夜天天拍拍 | 国产精品深夜福利免费观看 | 成人深夜视频 | 加勒比色久综合在线 | 欧美成人高清 | 国产成人亚洲精品91专区高清 | 欧美性一交激情视频在线 | 美女免费视频一区二区三区 | 91久久精品国产91久久性色也 | 伊人开心网| 欧美性第一页 | 久草视频一区 | 狠狠做久久深爱婷婷97动漫 | 97在线观看成人免费视频 | 国产人成精品午夜在线观看 | 国产在线观看一区二区三区 | 91精品在线观看视频 | 狠狠综合久久久久综合小说网 | 精品欧美一区二区三区四区 | 99精品国产成人一区二区 | 国产xxxxx在线播放 | 一区二区三区四区在线观看视频 | 免费一区二区三区四区 | 亚洲激情视频网 | 精品国产96亚洲一区二区三区 | 夜夜揉揉日日人人视频 | 久久久久国产精品美女毛片 | 美女胸又大又黄又www的网站 | 五月婷六月丁香 | 97se色在在线视频 | 国产精品一级片 | 激情五月婷婷小说 | 国产精品免费观看视频播放 | 久久大香萑太香蕉综合网 | 乱色欧美videos黑人 | 中文字幕日韩欧美一区二区三区 | 午夜精品在线视频 | 成人综合在线视频 | 人人洗澡人人洗澡人人 | 婷婷亚洲天堂 | 国产妇乱子伦视频免费 |