重學前端-學習筆記-JavaScript類型

說明

重學前端是程劭非(winter)在極客時間開的一個專欄,在此主要整理個人學習筆記。若有侵權,請聯繫我,謝謝。 前端

七種語言類型

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

Undefined、Null

undefined表示未定義,只有一個值,就是undefined。任何變量在賦值前都是undefined類型。在js裏是個變量,但不是關鍵字,爲了防止被重寫,在js裏用void 0來獲取undefined值。通常不會把變量賦值爲undefined,這樣能夠保證全部值爲undefined的變量都是未賦值的狀態bash

undefined === void 0;//true函數

這篇文章解釋了void 0 與 undefined學習

null表示定義了可是爲空,在js裏是關鍵字,也只有一個值,null。ui

Boolean

有兩個值,true和false,true和false是js關鍵字。this

String

String用於表示文本數據,它的意義不是「字符串」,而是字符串的UTF16編碼,string的長度是受字符串編碼的長度影響。最長2^53-1。編碼

Number

例外狀況spa

  • NaN
  • Infinity
  • -Infinity

區別+0和-0的方法,檢測1/x是infinity仍是-infinityprototype

非整數的Number類型沒法用==(或===)來計較,這是浮點數的精度問題code

0.1+0.2 == 0.3 //false

使用 JavaScript 提供的最小精度值來比較浮點數

Math.abs(0.1+0.2-0.3)<=Number.EPSILON //true

檢測左右兩邊差的絕對值是否是小於最小精度

Symbol

ES6引入的新類型,表示獨一無二的值。

用Symbol()函數建立symbol。 symbol函數的參數的做用是描述,爲了輸出的時候區分是哪個值,所以相同參數的symbol函數返回的symbol值是不同的。

var a = Symbol('a')
var b = Symbol('a')

console.log(a == b)  //false
複製代碼

Object

爲何給對象添加的方法能夠用在基本類型上?

. 運算符提供了一個裝箱操做,它會根據基本類型構造一個臨時對象,使得它能夠調用對應的對象方法

在js中,對象是「屬性的集合」,屬性分爲數據屬性和訪問器屬性,二者的結構都是key-value,key能夠是字符串或者symbol類型。

js中的幾個基本類型,在對象類型都有一個「親戚」,它們是:

  • Number
  • String
  • Boolean
  • Symbol

Number、String、Boolean三個構造器是兩用的,當用new搭配時,它們產生對象,當直接用時,表示強制類型轉換。symbol構造器不能用new調用。

var a = Boolean(1)
var b = new Boolean(1)

console.log(typeof a)  //boolean, a是true
console.log(typeof b)  //object,b是true
複製代碼

平常代碼能夠把用在對象的方法用在基本類型上

console.log('abc'.charAt(0))  // a
//charAt(index),index是字符串的下標,返回在該下標的字符,超出下標值的話返回空字符串
複製代碼

在原型上添加方法,也能夠應用於基本類型上

String.prototype.hello = () =>  console.log('hello')
var str = String('abc');

console.log(typeof str)  // string
str.hello()  // hello
複製代碼

類型轉換

js是弱類型語言,全部經常會發生類型轉換。 == 和加減乘除大於小於,都會發生類型轉換

類型轉換規則表

StringToNumber

支持十進制、八進制、十六進制的轉換。

  • 30;
  • 0b111;
  • 0o13;
  • 0xFF

還有科學計數法和正負號

  • 1e3;
  • -1e-2。

parseInt 和 parseFloat 並不使用這個轉換,支持的語法和這裏不盡相同。在不傳入第二個參數的狀況下,parseInt只支持16進制前綴‘0x’,並且會忽略非數字字符,就是不支持科學計數法。parseFloat是直接當十進制來轉換。

多數狀況下,用Number比parseInt和parseFloat好。

NumberToString

數字轉字符串是按十進制,當number太多或過小時,會用科學計數法表示

裝箱轉換

string、boolean、number、symbol在對象中都有對應的類,裝箱轉換就是把基本類型轉換成對應的對象。

symbol沒法用new調用,可是能夠用call方法來強迫產生裝箱。

定義一個函數,函數只有return this,而後用call方法到一個symbol類型的值上,就會產生一個SymbolObject。

var symbolObject = (function(){ return this; }).call(Symbol("a"));

    console.log(typeof symbolObject); //object
    console.log(symbolObject instanceof Symbol); //true
    console.log(symbolObject.constructor == Symbol); //true
複製代碼

使用內置的Object函數,能夠在js代碼中顯示調用裝箱能力。

var symbolObject = Object(Symbol('a'));

console.log(typeof symbolObject)  // object
console.log(symbolObject instanceof Symbol) // true
console.log(symbolObject.constructor === Symbol) // true
複製代碼

拆箱轉換

就是把對象類型轉換成基本類型。

拆箱轉換會嘗試調用valueOf和toString,若是這兩個方法都不存在,或者沒有返回基本類型,會返回類型錯誤TypeError

相關文章
相關標籤/搜索