摘要:重新認識類型數(shù)據(jù)類型重學(xué)前端系列筆記前言最新在看大神的專欄重學(xué)前端,感慨頗多,收益也頗多。實際上是能夠表示的最小精度。也可以是對象類型這個類型是新增的一個類型。主要用于解釋字符集等。
title: 1. 重新認識 JavaScript 類型
date: 2019-03-27 11:12:47 +0800
tags: [JavaScript數(shù)據(jù)類型]
categories: 重學(xué)前端系列筆記
最新在看witter大神的專欄《重學(xué)前端》,感慨頗多,收益也頗多。覺得自己該重建一下前端的知識體系,所以跟著寫下這個筆記。
變量聲明跟賦值,是兩個概念。
let a?是屬于變量聲明階段,這個階段所有的變量的值都是 undefined?。a = 12JS**?解析引擎。這個變量是什么類型以及它的值多少。
當(dāng) JavaScript?執(zhí)行的時候,如果遇到致命錯誤便會停止往下執(zhí)行。
//bad聲明方式 var a=b=2; // good var a=12,b=23; // 但是更期望使用let聲明,不用變量提升 let a = 12;怎么準確的判斷數(shù)據(jù)類型
let str = "你是誰,我是戰(zhàn)無不勝的孫悟空" Object.prototype.toString.call(str) // [object,String]; let arr = [1,4,56]; Object.prototype.toString.call(arr) // [object,Array];JavaScript現(xiàn)有常見類型
Null
Undefined
String
Boolean
Number
Symbol
Object
現(xiàn)在JavaScript常見類型是這么多,其中只有 Symbol? 是 ES6?新提出來的,其余都是 ES6?之前早就熟悉的類
這個類型表示:定義了但是為空
Null 類型也只有一個值,就是 null,它的語義表示空值,與 undefined 不同,null 是 JavaScript 關(guān)鍵字,所以在任何代碼中,你都可以放心用 null 關(guān)鍵字來獲取 null 值。
(1)Undefined這個類型表示:變量定義了但是未賦值
任何變量在賦值前是 Undefined 類型、值為 undefined,一般我們可以用全局變量 undefined(就是名為 undefined 的這個變量)來表達這個值
它同樣的表示一個變量的值,它并非一個關(guān)鍵詞,這是 JavaScript? 語言公認的設(shè)計失誤之一,所以,所以,我們?yōu)榱吮苊鉄o意中被篡改,我建議使用 void 0?來來獲取 Nudefined?值。
它與 Null?的不同就是,Null?是 JavaScript?的關(guān)鍵字,在開發(fā)中可以自由的獲取 Null?類型的變量
(2)Boolean這個類型表示:邏輯上的真和假
它有兩個值:true?和 false?
它屬于 JavaScript?中的內(nèi)置對象,可以通過 new?關(guān)鍵詞創(chuàng)造實例對象
(3)String這個類型表示:表示文本數(shù)據(jù)
這個類型具有長度單位的,最大的長度 2^53-1?,
這個 String?并非文本意義的字符串,而是字符串的 UTF16?編碼,我們?nèi)粘2僮髯址褂玫?length?charAt?都是針對 UTF16?編碼
字符串的最大長度是受經(jīng)過 UTF16?編碼之后的字符長度限制
補充編碼知識Note:現(xiàn)行的字符集國際標(biāo)準,字符是以 Unicode 的方式表示的,每一個 Unicode 的碼點表示一個字符,理論上,Unicode 的范圍是無限的。UTF 是 Unicode 的編碼方式,規(guī)定了碼點在計算機中的表示方法,常見的有 UTF16 和 UTF8。 Unicode 的碼點通常用 U+??? 來表示,其中 ??? 是十六進制的碼點值。 0-65536(U+0000 - U+FFFF)的碼點被稱為基本字符區(qū)域(BMP)。(4)Number
這個類型表示:通常意義的數(shù)字類型
它是 JavaScript?的內(nèi)置對象,可以通過 new?關(guān)鍵字創(chuàng)造實例
它類型有 **2^64-2^53+3**?個值
在為了避免計算的時候出錯,借鑒生活中的數(shù)學(xué),引入了 NaN?(這個可以用來檢測是否為數(shù)字類型)、Infinity(正無窮大)、-Infinity(負無窮大)
在加減法中 -0+0 **沒有很大的區(qū)別,但是在除法中就會很大的區(qū)別了
console.log(.00001 / -0); //結(jié)果:-Infinity console.log(.00000000001 / 0); //結(jié)果: Infinity
根據(jù)雙精度浮點數(shù)的定義,Number 類型中有效的整數(shù)范圍是-0x1fffffffffffff 至0x1fffffffffffff,所以 Number 無法精確表示此范圍外的整數(shù)。所以在非整數(shù)面前是無法使用 ==?或者 ===?進行比較的
console.log( .1 + .2 == .3 ); //結(jié)果:false; console.log(.1 + .2); // 結(jié)果:0.30000000000000004
正確的比較兩邊數(shù)值是否相等,應(yīng)該比較左右兩邊差的絕對值是否小于最小精度
console.log(Math.abs(.1 + .2 - .3) <=Number.EPSILON); // true
Number.EPSILONES6?Number 的一個常量。(5)Object
Number.EPSILON?實際上是 JavaScript 能夠表示的最小精度。誤差如果小于這個值,就可以認為已經(jīng)沒有意義了,即不存在誤差了。
這個類型表示:對象,它是一切有形和無形物體的總稱
它是屬性的集合,是 key-value?結(jié)構(gòu)
key : 可以是字符串類型。也可以是symbol類型
value :可以是字符串,可以是數(shù)值類型。也可以是對象類型
(6)Symbol這個類型是 **ES6**?新增的一個類型。其實說實話,到現(xiàn)在還不太清楚這個類型的作用,以及用法
它是一切非字符串的對象 key 的集合
Symbol 可以具有字符串類型的描述,但是即使描述相同,Symbol 也不相等
// 創(chuàng)建 Symbol 類型 let symbol = Symbol("其實,我是一個好人"); console.log(symbol)
這個類型還是有很多不懂,之后有了新收獲,再過來更新吧
類型轉(zhuǎn)換 (0)string → Number(字符串轉(zhuǎn)成數(shù)值類型)常見都是借助 JavaScript?中的內(nèi)置方法進行轉(zhuǎn)換,例如 **parseInt**? **parseFloat**?都是將字符串轉(zhuǎn)化成數(shù)值類型。但是? **parseInt**?是遇到非數(shù)值就停下,而??**parseFloat**?遇到不屬于數(shù)字行列才會停,
**parseInt**?**parseFloat**??轉(zhuǎn)化的字符串,如果第一個字符不是數(shù)字的話,就會返回?NaN
除了上述的兩種,還有 JavaScriptMath? NaN?
還有一種就是利用裝箱操作,利用 NumberNaN**
如果字符串的字符都是數(shù)字。那么可以使用四則運算,也可以進行隱士轉(zhuǎn)換
console.log(parseInt("6340.54")); // 結(jié)果:6340 console.log(parseFloat("4.648781655wr我是1"));結(jié)果:4.648781655 console.log(Number("2.2.22")); // 結(jié)果:NaN console.log(Number("5464646")) // 結(jié)果: 5464646(1)Number → string (數(shù)字轉(zhuǎn)化成字符串)
字符串拼接
let str = 121343454545; str = str+ ""; console.log(typeof(str)) // 結(jié)果:string
裝箱轉(zhuǎn)換
let str = 13243545646; console.log( typeof( String(str) ) ) // 結(jié)果:string(2)裝箱操作轉(zhuǎn)換
在 **JavaScript**?中,類型之間存在裝箱轉(zhuǎn)換操作
let str = 1323; console.log(typeof (String(str))); // string console.log(typeof (Symbol(str))) // symbol其他的數(shù)據(jù)類型
List? 和? Record?: 用于描述函數(shù)傳參過程。
**Set**?:主要用于解釋字符集等。
Completion Record?:用于描述異常、跳出等語句執(zhí)行過程。
Reference?:用于描述對象屬性訪問、delete 等。
Property Descriptor?:用于描述對象的屬性。
Lexical Environment? 和? Environment Record?:用于描述變量和作用域。
Data Block?:用于描述二進制數(shù)據(jù)。
程序 = 算法 + 數(shù)據(jù)結(jié)構(gòu)始發(fā)于
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/104441.html
摘要:使用表明你的比較不會涉及任何的隱形的類型轉(zhuǎn)換。當(dāng)對不同類型的數(shù)據(jù)進行比較的時候你要首先把它們進行顯示的類型轉(zhuǎn)換。然后再進行比較這樣會使你的程序更加清晰。 1、JavaScript 嚴格模式 通過在程序最開始假如一個字符串字面量 use strict ,即可開啟嚴格模式 嚴格模式可以讓JS代碼擁有更好的兼容性,更強的健壯性 在嚴格模式下,重新聲明 arguments 會報錯,非嚴格模式...
摘要:什么是適配器模式適配器模式將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口,使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。中的適配器模式在前端項目中,適配器模式的使用場景一般有以下三種情況庫的適配參數(shù)的適配和數(shù)據(jù)的適配。 1 什么是適配器模式 適配器模式(Adapter):將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口,使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。 在...
摘要:對象重新認識面向?qū)ο竺嫦驅(qū)ο髲脑O(shè)計模式上看,對象是計算機抽象現(xiàn)實世界的一種方式。除了字面式聲明方式之外,允許通過構(gòu)造器創(chuàng)建對象。每個構(gòu)造器實際上是一個函數(shù)對象該函數(shù)對象含有一個屬性用于實現(xiàn)基于原型的繼承和共享屬性。 title: JS對象(1)重新認識面向?qū)ο? date: 2016-10-05 tags: JavaScript 0x00 面向?qū)ο?從設(shè)計模式上看,對象是...
摘要:什么是裝飾器模式向一個現(xiàn)有的對象添加新的功能,同時又不改變其結(jié)構(gòu)的設(shè)計模式被稱為裝飾器模式,它是作為現(xiàn)有的類的一個包裝。中的裝飾器模式中有一個的提案,使用一個以開頭的函數(shù)對中的及其屬性方法進行修飾。 1 什么是裝飾器模式 showImg(https://segmentfault.com/img/remote/1460000015970102?w=1127&h=563); 向一個現(xiàn)有的對...
閱讀 1856·2021-10-09 09:44
閱讀 3388·2021-09-28 09:35
閱讀 1375·2021-09-01 10:31
閱讀 1663·2019-08-30 15:55
閱讀 2708·2019-08-30 15:54
閱讀 932·2019-08-29 17:07
閱讀 1378·2019-08-29 15:04
閱讀 2005·2019-08-26 13:56