中文字幕一区二区不卡_国产精品久久久久久久岛一牛影视_亚洲老司机在线_91久久精品美女高潮_精品国产一区二区精华_久久精品99久久久_91在线看www_国产精品污www在线观看_99久久精品免费看国产_亚洲成人av在线

細節(jié)決定成敗,聊聊JS的類型(上)

今天我們來講講JavaScript的內(nèi)容,在這個部分,我首先想跟你聊一聊類型

今天我們來講講 JavaScript 的內(nèi)容,在這個部分,我首先想跟你聊一聊類型。


(資料圖片)

JavaScript 類型對每個前端程序員來說,幾乎都是最為熟悉的概念了。但是你真的很了解它們嗎?我們不妨來看看下面的幾個問題。

為什么有的編程規(guī)范要求用 void 0 代替 undefined?

字符串有最大長度嗎?0.1 + 0.2 不是等于 0.3 么?為什么 JavaScript 里不是這樣的?

ES6 新加入的 Symbol 是個什么東西?

為什么給對象添加的方法能用在基本類型上?

如果你答起來還有些猶豫的地方,這就說明你對這部分知識點,還是有些遺漏之處的。沒關(guān)系,今天我來幫你一一補上。

我在前面提到過,我們的 JavaScript 模塊會從運行時、文法和執(zhí)行過程三個角度去剖析 JS 的知識體系,本篇我們就從運行時的角度去看 JavaScript 的類型系統(tǒng)。

運行時類型是代碼實際執(zhí)行過程中我們用到的類型。所有的類型數(shù)據(jù)都會屬于 7 個類型之一。從變量、參數(shù)、返回值到表達式中間結(jié)果,任何 JavaScript 代碼運行過程中產(chǎn)生的數(shù)據(jù),都具有運行時類型。

類型

JavaScript 語言的每一個值都屬于某一種數(shù)據(jù)類型。JavaScript 語言規(guī)定了 7 種語言類型。語言類型廣泛用于變量、函數(shù)參數(shù)、表達式、函數(shù)返回值等場合。根據(jù)最新的語言標準,這 7 種語言類型是:

Undefined;

Null;

Boolean;

String;

Number;

Symbol;

Object。

除了 ES6 中新加入的 Symbol 類型,剩下 6 種類型都是我們?nèi)粘i_發(fā)中的老朋友了,但是,要想回答文章一開始的問題,我們需要重新認識一下這些老朋友,下面我們就來從簡單到復雜,重新學習一下這些類型。

Undefined、Null

我們的第一個問題,為什么有的編程規(guī)范要求用 void 0 代替 undefined?現(xiàn)在我們就分別來看一下。

Undefined 類型表示未定義,它的類型只有一個值,就是 undefined。任何變量在賦值前是 Undefined 類型、值為 undefined,一般我們可以用全局變量 undefined(就是名為 undefined 的這個變量)來表達這個值,或者 void 運算來把任意一個表達式變成 undefined 值。

但是呢,因為 JavaScript 的代碼 undefined 是一個變量,而并非是一個關(guān)鍵字,這是 JavaScript 語言公認的設(shè)計失誤之一,所以,我們?yōu)榱吮苊鉄o意中被篡改,我建議使用 void 0 來獲取 undefined 值。

Undefined 跟 Null 有一定的表意差別,Null 表示的是:“定義了但是為空”。所以,在實際編程時,我們一般不會把變量賦值為 undefined,這樣可以保證所有值為 undefined 的變量,都是從未賦值的自然狀態(tài)。

Null 類型也只有一個值,就是 null,它的語義表示空值,與 undefined 不同,null 是 JavaScript 關(guān)鍵字,所以在任何代碼中,你都可以放心用 null 關(guān)鍵字來獲取 null 值。

Boolean

Boolean 類型有兩個值, true 和 false,它用于表示邏輯意義上的真和假,同樣有關(guān)鍵字 true 和 false 來表示兩個值。這個類型很簡單,我就不做過多介紹了。

String

我們來看看字符串是否有最大長度。

String 用于表示文本數(shù)據(jù)。String 有最大長度是 2^53 - 1,這在一般開發(fā)中都是夠用的,但是有趣的是,這個所謂最大長度,并不完全是你理解中的字符數(shù)。

因為 String 的意義并非“字符串”,而是字符串的 UTF16 編碼,我們字符串的操作 charAt、charCodeAt、length 等方法針對的都是 UTF16 編碼。所以,字符串的最大長度,實際上是受字符串的編碼長度影響的。

Note:現(xiàn)行的字符集國際標準,字符是以 Unicode 的方式表示的,每一個 Unicode 的碼點表示一個字符,理論上,Unicode 的范圍是無限的。UTF 是 Unicode 的編碼方式,規(guī)定了碼點在計算機中的表示方法,常見的有 UTF16 和 UTF8。 Unicode 的碼點通常用 U+??? 來表示,其中 ??? 是十六進制的碼點值。 0-65536(U+0000 - U+FFFF)的碼點被稱為基本字符區(qū)域(BMP)。

JavaScript 中的字符串是永遠無法變更的,一旦字符串構(gòu)造出來,無法用任何方式改變字符串的內(nèi)容,所以字符串具有值類型的特征。

JavaScript 字符串把每個 UTF16 單元當作一個字符來處理,所以處理非 BMP(超出 U+0000 - U+FFFF 范圍)的字符時,你應(yīng)該格外小心。

JavaScript 這個設(shè)計繼承自 Java,最新標準中是這樣解釋的,這樣設(shè)計是為了“性能和盡可能實現(xiàn)起來簡單”。因為現(xiàn)實中很少用到 BMP 之外的字符。

Number

下面,我們來說說 Number 類型。Number 類型表示我們通常意義上的“數(shù)字”。這個數(shù)字大致對應(yīng)數(shù)學中的有理數(shù),當然,在計算機中,我們有一定的精度限制。

JavaScript 中的 Number 類型有 18437736874454810627(即 264-253+3) 個值。

JavaScript 中的 Number 類型基本符合 IEEE 754-2008 規(guī)定的雙精度浮點數(shù)規(guī)則,但是 JavaScript 為了表達幾個額外的語言場景(比如不讓除以 0 出錯,而引入了無窮大的概念),規(guī)定了幾個例外情況:

NaN,占用了 9007199254740990,這原本是符合 IEEE 規(guī)則的數(shù)字;

Infinity,無窮大;

-Infinity,負無窮大。

另外,值得注意的是,JavaScript 中有 +0 和 -0,在加法類運算中它們沒有區(qū)別,但是除法的場合則需要特別留意區(qū)分,“忘記檢測除以 -0,而得到負無窮大”的情況經(jīng)常會導致錯誤,而區(qū)分 +0 和 -0 的方式,正是檢測 1/x 是 Infinity 還是 -Infinity。

根據(jù)雙精度浮點數(shù)的定義,Number 類型中有效的整數(shù)范圍是 -0x1fffffffffffff 至 0x1fffffffffffff,所以 Number 無法精確表示此范圍外的整數(shù)。

同樣根據(jù)浮點數(shù)的定義,非整數(shù)的 Number 類型無法用(= 也不行) 來比較,一段著名的代碼,這也正是我們第三題的問題,為什么在 JavaScript 中,0.1+0.2 不能 =0.3:

1console.log(0.1+0.2==0.3);

這里輸出的結(jié)果是 false,說明兩邊不相等的,這是浮點運算的特點,也是很多同學疑惑的來源,浮點數(shù)運算的精度問題導致等式左右的結(jié)果并不是嚴格相等,而是相差了個微小的值。所以實際上,這里錯誤的不是結(jié)論,而是比較的方法,正確的比較方法是使用 JavaScript 提供的最小精度值:

console.log( Math.abs(0.1 + 0.2 - 0.3) <= Number.EPSILON);

檢查等式左右兩邊差的絕對值是否小于最小精度,才是正確的比較浮點數(shù)的方法。這段代碼結(jié)果就是 true 了。

Symbol

Symbol 是 ES6 中引入的新類型,它是一切非字符串的對象 key 的集合,在 ES6 規(guī)范中,整個對象系統(tǒng)被用 Symbol 重塑。

在后面的文章中,我會詳細敘述 Symbol 跟對象系統(tǒng)。這里我們只介紹 Symbol 類型本身:它有哪些部分,它表示什么意思,以及如何創(chuàng)建 Symbol 類型。

Symbol 可以具有字符串類型的描述,但是即使描述相同,Symbol 也不相等。

我們創(chuàng)建 Symbol 的方式是使用全局的 Symbol 函數(shù)。例如:

var mySymbol = Symbol("my symbol");

一些標準中提到的 Symbol,可以在全局的 Symbol 函數(shù)的屬性中找到。例如,我們可以使用 Symbol.iterator 來自定義 for…of 在對象上的行為:

var o = new Objecto[Symbol.iterator] = function() {    var v = 0    return {    next: function() {        return { value: v++, done: v > 10 }        }    }};for(var v of o)console.log(v); // 0 1 2 3 ... 9

代碼中我們定義了 iterator 之后,用 for(var v of o) 就可以調(diào)用這個函數(shù),然后我們可以根據(jù)函數(shù)的行為,產(chǎn)生一個 for…of 的行為。

這里我們給對象 o 添加了 Symbol.iterator 屬性,并且按照迭代器的要求定義了一個 0 到 10 的迭代器,之后我們就可以在 for of 中愉快地使用這個 o 對象啦。

這些標準中被稱為“眾所周知”的 Symbol,也構(gòu)成了語言的一類接口形式。它們允許編寫與語言結(jié)合更緊密的 API。

Object

Object 是 JavaScript 中最復雜的類型,也是 JavaScript 的核心機制之一。Object 表示對象的意思,它是一切有形和無形物體的總稱。

下面我們來看一看,為什么給對象添加的方法能用在基本類型上?

在 JavaScript 中,對象的定義是“屬性的集合”。屬性分為數(shù)據(jù)屬性和訪問器屬性,二者都是 key-value 結(jié)構(gòu),key 可以是字符串或者 Symbol 類型。

關(guān)于對象的機制,后面會有單獨的一篇來講述,這里我重點從類型的角度來介紹對象類型。提到對象,我們必須要提到一個概念:類。

因為 C++ 和 Java 的成功,在這兩門語言中,每個類都是一個類型,二者幾乎等同,以至于很多人常常會把 JavaScript 的“類”與類型混淆。

事實上,JavaScript 中的“類”僅僅是運行時對象的一個私有屬性,而 JavaScript 中是無法自定義類型的。

JavaScript 中的幾個基本類型,都在對象類型中有一個“親戚”。它們是:

Number;

String;

Boolean;

Symbol。

所以,我們必須認識到 3 與 new Number(3) 是完全不同的值,它們一個是 Number 類型, 一個是對象類型。

Number、String 和 Boolean,三個構(gòu)造器是兩用的,當跟 new 搭配時,它們產(chǎn)生對象,當直接調(diào)用時,它們表示強制類型轉(zhuǎn)換。

Symbol 函數(shù)比較特殊,直接用 new 調(diào)用它會拋出錯誤,但它仍然是 Symbol 對象的構(gòu)造器。JavaScript 語言設(shè)計上試圖模糊對象和基本類型之間的關(guān)系,我們?nèi)粘4a可以把對象的方法在基本類型上使用,比如:

console.log("abc".charAt(0)); //a

甚至我們在原型上添加方法,都可以應(yīng)用于基本類型,比如以下代碼,在 Symbol 原型上添加了 hello 方法,在任何 Symbol 類型變量都可以調(diào)用。

Symbol.prototype.hello = () => console.log("hello");var a = Symbol("a");console.log(typeof a); //symbol,a并非對象a.hello(); //hello,有效
1234Symbol.prototype.hello=()=>console.log("hello");vara=Symbol("a");console.log(typeofa);//symbol,a并非對象a.hello();//hello,有效

所以我們文章開頭的問題,答案就是. 運算符提供了裝箱操作,它會根據(jù)基礎(chǔ)類型構(gòu)造一個臨時對象,使得我們能在基礎(chǔ)類型上調(diào)用對應(yīng)對象的方法。

?

更多精彩內(nèi)容請點:開發(fā)者網(wǎng)站代碼查看

?

關(guān)鍵詞:
責任編輯:hn1007
中文字幕一区二区不卡_国产精品久久久久久久岛一牛影视_亚洲老司机在线_91久久精品美女高潮_精品国产一区二区精华_久久精品99久久久_91在线看www_国产精品污www在线观看_99久久精品免费看国产_亚洲成人av在线
亚洲人亚洲人成电影网站色| 欧美激情一区二区在线| 在线观看免费亚洲| 91久久国产综合久久| 欧美日韩亚洲国产综合| 一区二区三区精品久久久| 丁香啪啪综合成人亚洲小说| 久久久久久综合| 国产高清不卡一区| 91激情五月电影| 亚洲成人你懂的| 日韩女优制服丝袜电影| 久久国产精品一区二区| 亚洲精品一区二区三区蜜桃下载| 久久激情五月婷婷| 国产欧美视频在线观看| 色综合久久久久| 洋洋av久久久久久久一区| 色哟哟一区二区在线观看| 日韩三级视频在线看| 亚洲国产日产av| 久久伊99综合婷婷久久伊| 午夜久久电影网| 国产日韩欧美麻豆| 91精品福利在线一区二区三区 | 日本一区二区在线不卡| 在线视频中文字幕一区二区| 亚洲免费观看高清完整版在线观看 | 国产色一区二区| 国产精品久久久久一区二区三区| 日本韩国欧美一区| 国产很黄免费观看久久| 久久久亚洲国产美女国产盗摄 | 日韩女优视频免费观看| 久久精品无码一区二区三区| 欧美视频在线一区| 成人免费视频网站在线观看| 亚洲视频你懂的| 日韩在线a电影| 中文一区一区三区高中清不卡| 国产午夜精品久久| 综合分类小说区另类春色亚洲小说欧美 | 粉嫩绯色av一区二区在线观看| 激情久久五月天| 成人在线一区二区三区| 欧美日韩在线播放一区| 日韩一区二区电影网| 精品成人在线观看| 国产精品美女久久久久av爽李琼| 69p69国产精品| 欧美日韩免费电影| 欧洲激情一区二区| 色网综合在线观看| 91片在线免费观看| www.欧美日韩国产在线| 国产91精品精华液一区二区三区| 另类的小说在线视频另类成人小视频在线| 图片区小说区区亚洲影院| 精品国产露脸精彩对白| 婷婷一区二区三区| 99久精品国产| 天堂在线亚洲视频| 99天天综合性| 极品少妇xxxx偷拍精品少妇| 国产伦精品一区二区三区免费| 喷水一区二区三区| 欧美综合天天夜夜久久| 久久精品av麻豆的观看方式| 精品国产三级电影在线观看| 波多野结衣中文字幕一区二区三区 | 成人久久18免费网站麻豆| 在线播放欧美女士性生活| 日本不卡中文字幕| 日韩免费电影一区| 99久久精品国产网站| 91亚洲精品久久久蜜桃| 欧美精品在线观看一区二区| 依依成人综合视频| 91精品婷婷国产综合久久性色| 国产精品电影院| 在线观看免费成人| 亚洲香肠在线观看| 精品少妇一区二区三区视频免付费 | 综合久久久久久久| 亚洲欧洲日韩综合一区二区| 色综合久久中文综合久久97| 午夜精品福利在线| 日韩视频免费观看高清完整版 | 久久久亚洲高清| 九九精品视频在线看| 国产亚洲精品aa午夜观看| 国产精品一区二区在线播放| 精品理论电影在线观看| 极品少妇一区二区| 欧美大胆人体bbbb| 欧美色男人天堂| 日韩高清不卡在线| 国产精品美日韩| 日韩欧美色综合| 成人av电影免费在线播放| 婷婷夜色潮精品综合在线| 91精品在线观看入口| 国产精品不卡在线| 久久亚洲综合色一区二区三区| 综合久久久久综合| 老司机精品视频在线| a美女胸又www黄视频久久| 日韩欧美国产一区二区在线播放 | 欧美午夜精品电影| 一本色道综合亚洲| 日韩一区二区三区四区| 国产午夜久久久久| 亚洲视频在线一区二区| 亚洲一区免费在线观看| 久久精品国产色蜜蜜麻豆| 亚洲成av人片www| 精品动漫一区二区三区在线观看| 欧美群妇大交群的观看方式| 亚洲国产中文字幕在线视频综合 | 亚洲一区在线看| 美女在线一区二区| 在线观看国产日韩| 中文字幕欧美区| 日韩avvvv在线播放| 91成人在线精品| 亚洲精品视频免费看| 国产一区二区三区香蕉| 国产成人在线免费| 91精品免费在线| 亚洲成人黄色影院| 91视频你懂的| 日韩免费高清视频| 日韩黄色一级片| 国产精品欧美久久久久无广告| 国产露脸91国语对白| 日韩一级高清毛片| 一区二区三区欧美视频| www.欧美.com| 成人黄页在线观看| 国产精品欧美一区喷水| 美女视频网站黄色亚洲| 久久精品国内一区二区三区| 成人免费视频app| 国产精品资源在线看| 中文字幕一区二区在线观看| 99久久er热在这里只有精品15| 五月婷婷综合在线| 国产精品久久久久久妇女6080| 亚洲精品国产一区二区精华液| 亚洲高清视频中文字幕| 国产精品麻豆欧美日韩ww| 91色porny| 一本色道久久综合亚洲91 | 亚洲va欧美va人人爽| 欧美极品aⅴ影院| 亚洲自拍都市欧美小说| 久久影院午夜论| 国产一区91精品张津瑜| 成人黄动漫网站免费app| 中日韩免费视频中文字幕| 91国产免费看| 欧美日韩性生活| 99国产精品久久久| 国产麻豆精品久久一二三| 五月婷婷激情综合网| 亚洲免费在线观看| 精品久久久久av影院| 一本到三区不卡视频| 国产精品99久久久久久似苏梦涵| 一区二区三区高清在线| 久久久国产精华| 成人高清视频免费观看| 国产自产v一区二区三区c| 国产精品二区一区二区aⅴ污介绍| 日韩精品一区二区三区视频| 久草热8精品视频在线观看| 久久综合色8888| 99久久免费国产| 国产在线视频一区二区三区| 日韩国产欧美在线观看| 中文字幕欧美日本乱码一线二线| 欧美刺激脚交jootjob| 欧美日韩成人激情| 日韩欧美国产成人一区二区| 欧美在线视频不卡| 91啪亚洲精品| 亚洲成人免费电影| 91免费观看在线| 亚洲大尺度视频在线观看| 在线观看精品一区| 欧美日韩激情一区| 精品久久久久久久久久久久包黑料| 精品卡一卡二卡三卡四在线| 亚洲精品第一国产综合野| 精品一区二区三区视频在线观看| 99久久精品费精品国产一区二区| 欧美不卡激情三级在线观看| 亚洲视频免费观看| 日本成人超碰在线观看| 久久国产三级精品|