JavaScript回顧學習:數據類型

概述

ECMAScript中有5中基本數據類型:Undefined,Null,Boolean,Number,String,還有一種複雜數據類型對象(Object)Object本質上是由一組無序的名值對組成的,JavaScript一樣還定義了另外兩種特殊對象:javascript

  • 數組--->表示帶編號的值的有序組合
  • 函數--->函數是具備與它相關聯的可執行代碼的對象,經過調用函數來運行可執行代碼,並返回運算結果

綜上爲ES5的所有數據類型,ES6新出了一種數據類型爲Symbol,表示獨一無二的值。
函數,數組,對象在後續文章中會有詳解(寫完後將加上連接,提早埋坑)。本篇文章將回顧學習5種基本類型和Symbol及數據類型之間的轉化。java

基本數據類型

undefined

Undefined類型只有一個值,即undefined,在使用var聲明變量但沒有對這個變量初始化時,這個變量的值就是undefined面試

  • 注意:咱們沒有必要顯式的將一個變量初始化爲undefined。由於沒有賦值初始化的變量就是undefined這樣更有利於咱們比較賦值仍是未賦值的變量。

Null

Undefined相似,Null類型也只有一個值nullnull表示是一個空對象指針。因此當type of null的時候返回'object'數組

  • undefined不一樣的是,當咱們明確這個變量是將用來保存對象的時候,咱們最好將這個變量初始化爲null,這樣有利於咱們只要檢查當前這個對象的值是否是null就能夠知道當前的變量是否已經保存了一個對象的引用。同時也能更好的區別undefinednull

Boolean 類型

Boolean類型只有兩個值:truefalse 這個類型在開發中能夠說是用的最多的類型了,大多數判斷都是用這個類型來完成的。函數

  • 注意: 全部的其餘的類型均可以轉化爲Boolean類型。關於轉化的狀況下面會講到。

Number類型

簡而言之就是數字,分爲整數和浮點數。最基本的整數數字值是十進制整數的也就是咱們平時用的數字,除了十進制,還有八進制和十六進制。學習

  • 八進制0開頭的後面的每位數都是(0~7)如:測試

    var num = 0666; // 八進制的438

    可是若是不符合規則了,那前面的0就會被忽略,後面數值按照十進制解析,如:指針

    var num1 = 0668; // 不符合規則 解析爲668

    (嚴格模式八進制是無效的)code

  • 十六進制的前兩位是0後面跟任何十六進制的數字(0~9及A~F)

在進行計算的時候八進制和十六進制的數值都會被轉化爲十進制數值。對象

浮點數,就是通俗理解的小數。因爲舍入偏差緣由因此不要將浮點數做爲判斷依據。
數字能夠用科學計數法e表示,如:

var int = 3e3; // 表示3000,至關於3乘以10的3次冪
var float = 3e-3 // 表示0.003 ,至關於3乘以10的-3次冪

數字在javascript中是有範圍的:5e-324~1.7976931348623157e308;通常狀況是用不到的知道就行,超過範圍的數值會自動被轉換爲Infinity(區分正負)。若是出現了也能夠用isFinite()函數進行識別判斷,在範圍內轉換爲true

關於數值最後還有一個特殊的值: NaN 表明非數值英文直譯縮寫(Not a Number);用於原本是要返回數值的操做沒有返回數值就會返回NaNNaN有兩個特色須要注意一下:

  • 任何涉及NaN的操做都返回NaN
  • NaN與任何值都不相等,包括NaN自己。

由於以上兩個比較難受的特色會致使咱們無法判斷一個值是否是NaN,因此JavaScript給咱們定義了一個函數:isNaN()這個函數接受一個參數,若是能轉化位數值返回false,不能則true,如下有幾個書上很是經典的例子,請切記(面試可能會用到,哈哈哈哈哈):

isNaN(NaN)     // true
isNaN(10)      // false (10是一個數值)
isNaN('10')    // false ('10'能夠被轉化爲數值10)
isNaN('blue')  // true  (不能被轉化爲數值)
isNaN(true)    // false (能夠被轉化爲1)

手動注意一下這裏 isNaN()的參數也能夠是對象,當傳入一個對象的時候會先調用被傳入對象的valueOf()方法,而後肯定該方法返回的數值是否能夠被轉化爲數值。若是不能,再調用對象的toString()方法,再測試返回值是否能夠被轉化爲數值。之因此特別注意這裏由於通常JavaScript中的內置函數和操做符都是按照這個流程執行的。下面基於isNaN舉個栗子:

var a = {};
isNaN(a);      // true 
//執行過程
a.valueOf()    // {},不能轉化。
//而後執行
a.toString()   // 返回"[object Object]" 也不能被轉化,因此isNaN返回true

說到number類型確定要提一下3個函數:Number(),parseInt(),parseFloat().功能類似但也不是徹底相同,一個一個來講。
首先Number()能夠用於任何數據類型,另外兩個則是專門用於把字符串轉換成數值。
Number()函數的轉換規則:

  • 若是是Boolean值,truefalse將分別被轉換爲10
  • 若是是數字值則是簡單的傳入和返回
  • 若是是null,返回0
  • 若是是undefined,返回NaN
  • 若是是字符串,遵循如下規則:

    • 若是字符串中只包含數字(包括前面帶正負號),則轉換爲十進制數字(0開頭會忽略0),浮點數轉換爲浮點數
    • 若是字符串中包含有效的十六進制數,則轉換爲相同大小的十進制數
    • 若是是空字符串,則返回0
    • 若是字符串中包含除了上述以外的字符,則返回NaN
  • 若是是對象,則調用valueOf()方法,按照上面的規則調用轉換返回值,若是返回NaN,則繼續調用toString()方法,再次按照上面的規則轉換

舉幾個例子:

var num1 = Number('Hello world') // NaN
var num2 = Number('') // 0
var num3 = Number('0000000000020') // 20
var num4 = Number(true) // 1

再次手動注意一下 +操做符與Number()函數相同 ,以下例:

var str = '1212' 
+str // 1212

parseInt()只轉換字符串,規則大致能夠整理爲一下幾種:

  • 它會忽略字符串前面的空格,若是第一個非空格字符串不是數字或者正負號就會返回NaN
  • 空字符串返回NaNNumber()返回0
  • 按順序解析每個字符直至遇到非數字字符或結尾
  • 浮點數會轉換爲整數
  • 能夠添加第二個參數做爲轉換基數(即多少進制),若是不填第二個參數ES5以後沒法解析8進制數會直接忽略前導0
  • 若第二個參數爲16可忽略前導0x

🌰:

var num1 = parseInt('1111cc') // 1111
var num2 = parseInt('') // NaN
var num3 = parseInt('0xA') // 10
var num4 = parseInt('11.1') // 11
var num5 = parseInt('070') // 70
var num6 = parseInt('AF',16) // 175
var num7 = parseInt('AF') // NaN (未指定16進制且未帶前導0x)

爲了不錯誤解析,建議使用此函數時帶着第二個參數
parseFloat()的用法跟parseInt差很少,區別有一下幾點:

  • 沒有第二個參數(只解析十進制數)
  • 只識別第一個小數點
  • 始終忽略前導0

🌰:

var num1 = parseFloat('1111cc') // 1111
var num2 = parseInt('0xA') // 0
var num3 = parseInt('11.1') // 11.1
var num4 = parseInt('11.1.11') // 11.1
var num5 = parseInt('011.1') // 11.1

String類型

以單引號或者雙引號開頭結尾表示
特色: 字符串是不可變的,也就是說,字符串一旦建立它的值就不能改變。要改變某個變量保存的字符串,首先要銷燬原來的字符串,而後再用另外一個包含新值得字符串填充該變量
字符串有length屬性,可是若是字符串中若是包括以十六進制表示Unicode字符\unnn這種格式的字符在length裏算一個長度,這時length返回的就不是精確的字符數目了
轉換字符串的方法:

  • toString(): 數值、布爾值、對象和字符串都有toString()方法,注意的是nullundefined沒有這個方法,換言之toString()沒法將nullundefined轉換爲字符串,當數值調用toString()時可傳入參數2,8,10……等數字的轉換基數(進制數)默認爲10
  • String() 可將任何類型轉換爲字符串。執行規則:若是值有toString()方法則調用該方法並返回對應的值(沒有參數),null返回"null" undefined返回""undefined

小技巧: 待轉換的值+ ""可轉換爲字符串

Object類型

是一組數據和功能的集合。能夠經過new操做符後跟要穿件的對象類型名稱來建立。建立Object類型的實例併爲其添加屬性、方法,就能夠建立自定義對象。
Object類型是全部實例的基礎從繼承的角度來說就是祖宗。
Object的每一個實例都有下列屬性和方法:

  • constructor: 保存着用於建立當前對象的函數(構造函數)
  • hasOwnProperty(propertyName):用於檢查給定的屬性在當前對象屬性中是否存在(不是在實例的原型中)。propertyName必須以字符串形式指定
  • isPrototypeOf(Object): 用於檢查傳入的對象是不是當前對象的原型
  • propertyIsEnumerable(propertyName): 用於檢查給定屬性是否能使用 for-in 語句來枚舉
  • toLocaleString(): 返回對象的字符串表示,該字符串與執行環境的地區對應(例如,若是是Date類型則返回的數據中與地區相關,在中國返回的格式是"2019/7/27 下午8:12:23")
  • toString(): 返回對象的字符串表示
  • valueOf(): 返回對象的字符串、數值或布爾值表示。

Symbol

ES6 增長了一個新的基本數據類型 symbol. 不過,和其餘基本數據類型相比,它有點不同凡響,由於它沒有字面量的表現形式,並且建立的方式也有點奇怪,只能經過調用全局函數Symbol()來完成。

使用Symbol時注意:

  • symbol能夠轉化爲字符串(兩種方式,前面已經介紹了。),能夠轉換爲boolean,可是不能轉化爲Number
  • 使用Symbol()時最好爲其傳入參數,容易區分;因爲symbol的值是獨一無二的,即便是傳入相同的參數,兩者的值也是不等的。
  • 做爲屬性名時不能經過.調用需用[]

🌰:

let symbol1 = Symbol('a');
let symbol2 = Symbol('a');

let obj = {
    [symbol1]: '噫嗚嗚噫',
    [symbol2]: '哦哦哦哈哈哈哈'
}
console.log(symbol1 === symbol2) // false
console.log(obj.symbol1)  // undefined
console.log(obj[symbol1]) // 噫嗚嗚噫
symbol1.toString() // "Symbol('a')"
Number(symbol1) // Uncaught TypeError: Cannot convert a Symbol value to a number
Boolean(symbol1) // true

symbol要細說徹底能夠但拉出來一篇文章來講了,因此這裏簡單介紹一下最基本的用法,後續若是寫的話,我會在這裏添加連接放縱了好長一段時間了,以前的計劃擱置了許久,如今開始重啓。各位老鐵共同進步,共勉。

相關文章
相關標籤/搜索