1. 從新認識 JavaScript 類型


title: 1. 從新認識 JavaScript 類型
date: 2019-03-27 11:12:47 +0800
tags: [JavaScript數據類型]
categories: 重學前端系列筆記javascript


前言

最新在看witter大神的專欄《重學前端》,感慨頗多,收益也頗多。以爲本身該重建一下前端的知識體系,因此跟着寫下這個筆記。
前端

補充*

  • 變量聲明跟賦值,是兩個概念。
  • let a 是屬於變量聲明階段,這個階段全部的變量的值都是 undefined 。a = 12JS** 解析引擎。這個變量是什麼類型以及它的值多少。
  • JavaScript 執行的時候,若是遇到致命錯誤便會中止往下執行。
//bad聲明方式
var a=b=2;
// good
var a=12,b=23;
// 可是更指望使用let聲明,不用變量提高
let a = 12;

怎麼準確的判斷數據類型

let str = "你是誰,我是望風披靡的孫悟空"
Object.prototype.toString.call(str) // [object,String];
let arr = [1,4,56];
Object.prototype.toString.call(arr) // [object,Array];

JavaScript現有常見類型

  • Null
  • Undefined
  • String
  • Boolean
  • Number
  • Symbol
  • Object

如今JavaScript常見類型是這麼多,其中只有 Symbol  是 ES6 新提出來的,其他都是 ES6 以前早就熟悉的類
java

(0)Null

  • 這個類型表示:定義了可是爲空
  • Null 類型也只有一個值,就是 null,它的語義表示空值,與 undefined 不一樣,null 是 JavaScript 關鍵字,因此在任何代碼中,你均可以放心用 null 關鍵字來獲取 null 值。

(1)Undefined

  • 這個類型表示:變量定義了可是未賦值
  • 任何變量在賦值前是 Undefined 類型、值爲 undefined,通常咱們能夠用全局變量 undefined(就是名爲 undefined 的這個變量)來表達這個值
  • 它一樣的表示一個變量的值,它並不是一個關鍵詞,這是 JavaScript  語言公認的設計失誤之一,因此,因此,咱們爲了不無心中被篡改,我建議使用 void 0 來來獲取 Nudefined 值。
  • 它與 Null 的不一樣就是,Null 是 JavaScript 的關鍵字,在開發中能夠自由的獲取 Null 類型的變量

(2)Boolean

  • 這個類型表示:邏輯上的真和假
  • 它有兩個值:true 和 false 
  • 它屬於 JavaScript 中的內置對象,能夠經過 new 關鍵詞創造實例對象

(3)String

  • 這個類型表示:表示文本數據
  • 這個類型具備長度單位的,最大的長度 2^53-1 ,
  • 這個 String 並不是文本意義的字符串,而是字符串的 UTF16 編碼,咱們平常操做字符使用的 length charAt 都是針對 UTF16 編碼
  • 字符串的最大長度是受通過 UTF16 編碼以後的字符長度限制

補充編碼知識

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

(4)Number

  • 這個類型表示:一般意義的數字類型
  • 它是 JavaScript 的內置對象,能夠經過 new 關鍵字創造實例
  • 它類型有 **2^64-2^53+3** 個值
  • 在爲了不計算的時候出錯,借鑑生活中的數學,引入了 NaN (這個能夠用來檢測是否爲數字類型)、Infinity(正無窮大)、-Infinity(負無窮大)
  • 在加減法中 -0+0 **沒有很大的區別,可是在除法中就會很大的區別了
console.log(.00001 / -0); //結果:-Infinity
console.log(.00000000001 / 0); //結果: Infinity
  • 根據雙精度浮點數的定義,Number 類型中有效的整數範圍是-0x1fffffffffffff 至0x1fffffffffffff,因此 Number 沒法精確表示此範圍外的整數。因此在非整數面前是沒法使用 == 或者 === 進行比較的
console.log( .1 + .2 == .3 ); //結果:false;
console.log(.1 + .2);  // 結果:0.30000000000000004
  • 正確的比較兩邊數值是否相等,應該比較左右兩邊差的絕對值是否小於最小精度
console.log(Math.abs(.1 + .2 - .3) <=Number.EPSILON); // true
Number.EPSILONES6  Number 的一個常量。
Number.EPSILON 其實是 JavaScript 可以表示的最小精度。偏差若是小於這個值,就能夠認爲已經沒有意義了,即不存在偏差了。

(5)Object

  • 這個類型表示:對象,它是一切有形和無形物體的總稱
  • 它是屬性的集合,是 key-value 結構
  • key : 能夠是字符串類型。也能夠是symbol類型
  • value :能夠是字符串,能夠是數值類型。也能夠是對象類型

(6)Symbol

  • 這個類型是 **ES6** 新增的一個類型。其實說實話,到如今還不太清楚這個類型的做用,以及用法
  • 它是一切非字符串的對象 key 的集合
  • Symbol 能夠具備字符串類型的描述,可是即便描述相同,Symbol 也不相等
// 建立 Symbol 類型
let symbol = Symbol("其實,我是一個好人");
console.log(symbol)
  • 這個類型仍是有不少不懂,以後有了新收穫,再過來更新吧

類型轉換

(0)string → Number(字符串轉成數值類型)

  • 常見都是藉助 JavaScript 中的內置方法進行轉換,例如 **parseInt**  **parseFloat** 都是將字符串轉化成數值類型。可是  **parseInt** 是遇到非數值就停下,而  **parseFloat** 遇到不屬於數字行列纔會停,
  • **parseInt** **parseFloat**  轉化的字符串,若是第一個字符不是數字的話,就會返回 NaN
  • 除了上述的兩種,還有 JavaScriptMath  NaN 
  • 還有一種就是利用裝箱操做,利用 NumberNaN**
  • 若是字符串的字符都是數字。那麼可使用四則運算,也能夠進行隱士轉換
console.log(parseInt("6340.54")); // 結果:6340
 console.log(parseFloat("4.648781655wr我是1"));結果:4.648781655
 console.log(Number("2.2.22")); // 結果:NaN
 console.log(Number("5464646")) // 結果: 5464646

(1)Number → string (數字轉化成字符串)

  • 字符串拼接
let str = 121343454545;
str = str+ "";
console.log(typeof(str)) // 結果:string
  • 裝箱轉換
let str = 13243545646;
console.log( typeof( String(str) ) ) // 結果:string

(2)裝箱操做轉換

  • **JavaScript** 中,類型之間存在裝箱轉換操做
let str = 1323;
 console.log(typeof (String(str))); // string
 console.log(typeof (Symbol(str))) // symbol

其餘的數據類型

  • List  和  Record : 用於描述函數傳參過程。
  • **Set** :主要用於解釋字符集等。
  • Completion Record :用於描述異常、跳出等語句執行過程。
  • Reference :用於描述對象屬性訪問、delete 等。
  • Property Descriptor :用於描述對象的屬性。
  • Lexical Environment  和  Environment Record :用於描述變量和做用域。
  • Data Block :用於描述二進制數據。

程序 = 算法 + 數據結構

始發於算法

相關文章
相關標籤/搜索