ECMAScript中有5中基本數據類型:Undefined
,Null
,Boolean
,Number
,String
,還有一種複雜數據類型對象(Object)
,Object
本質上是由一組無序的名值對組成的,JavaScript一樣還定義了另外兩種特殊對象:javascript
綜上爲ES5的所有數據類型,ES6新出了一種數據類型爲Symbol
,表示獨一無二的值。
函數,數組,對象在後續文章中會有詳解(寫完後將加上連接,提早埋坑)。本篇文章將回顧學習5種基本類型和Symbol
及數據類型之間的轉化。java
Undefined
類型只有一個值,即undefined
,在使用var
聲明變量但沒有對這個變量初始化時,這個變量的值就是undefined
。面試
undefined
。由於沒有賦值初始化的變量就是undefined
這樣更有利於咱們比較賦值仍是未賦值的變量。跟Undefined
相似,Null
類型也只有一個值null
。null
表示是一個空對象指針。因此當type of null
的時候返回'object'
數組
undefined
不一樣的是,當咱們明確這個變量是將用來保存對象的時候,咱們最好將這個變量初始化爲null
,這樣有利於咱們只要檢查當前這個對象的值是否是null
就能夠知道當前的變量是否已經保存了一個對象的引用。同時也能更好的區別undefined
和null
Boolean類型只有兩個值:true
和false
這個類型在開發中能夠說是用的最多的類型了,大多數判斷都是用這個類型來完成的。函數
簡而言之就是數字,分爲整數和浮點數。最基本的整數數字值是十進制整數的也就是咱們平時用的數字,除了十進制,還有八進制和十六進制。學習
八進制0開頭的後面的每位數都是(0~7)如:測試
var num = 0666; // 八進制的438
可是若是不符合規則了,那前面的0就會被忽略,後面數值按照十進制解析,如:指針
var num1 = 0668; // 不符合規則 解析爲668
(嚴格模式八進制是無效的)code
在進行計算的時候八進制和十六進制的數值都會被轉化爲十進制數值。對象
浮點數,就是通俗理解的小數。因爲舍入偏差緣由因此不要將浮點數做爲判斷依據。
數字能夠用科學計數法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);用於原本是要返回數值的操做沒有返回數值就會返回NaN
,NaN
有兩個特色須要注意一下:
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
值,true
和false
將分別被轉換爲1
和0
null
,返回0
undefined
,返回NaN
若是是字符串,遵循如下規則:
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
NaN
(Number()
返回0
)0
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
差很少,區別有一下幾點:
🌰:
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
以單引號或者雙引號開頭結尾表示
特色: 字符串是不可變的,也就是說,字符串一旦建立它的值就不能改變。要改變某個變量保存的字符串,首先要銷燬原來的字符串,而後再用另外一個包含新值得字符串填充該變量
字符串有length屬性,可是若是字符串中若是包括以十六進制表示Unicode字符\unnn
這種格式的字符在length裏算一個長度,這時length返回的就不是精確的字符數目了
轉換字符串的方法:
toString()
: 數值、布爾值、對象和字符串都有toString()
方法,注意的是null
和undefined
沒有這個方法,換言之toString()
沒法將null
和undefined
轉換爲字符串,當數值調用toString()
時可傳入參數2,8,10……等數字的轉換基數(進制數)默認爲10String()
可將任何類型轉換爲字符串。執行規則:若是值有toString()
方法則調用該方法並返回對應的值(沒有參數),null
返回"null"
undefined
返回""undefined
小技巧: 待轉換的值+ ""
可轉換爲字符串
是一組數據和功能的集合。能夠經過new
操做符後跟要穿件的對象類型名稱來建立。建立Object
類型的實例併爲其添加屬性、方法,就能夠建立自定義對象。Object
類型是全部實例的基礎從繼承的角度來說就是祖宗。Object
的每一個實例都有下列屬性和方法:
constructor
: 保存着用於建立當前對象的函數(構造函數)hasOwnProperty(propertyName)
:用於檢查給定的屬性在當前對象屬性中是否存在(不是在實例的原型中)。propertyName
必須以字符串形式指定isPrototypeOf(Object)
: 用於檢查傳入的對象是不是當前對象的原型propertyIsEnumerable(propertyName)
: 用於檢查給定屬性是否能使用 for-in
語句來枚舉toLocaleString()
: 返回對象的字符串表示,該字符串與執行環境的地區對應(例如,若是是Date類型則返回的數據中與地區相關,在中國返回的格式是"2019/7/27 下午8:12:23"
)toString()
: 返回對象的字符串表示valueOf()
: 返回對象的字符串、數值或布爾值表示。ES6 增長了一個新的基本數據類型 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
要細說徹底能夠但拉出來一篇文章來講了,因此這裏簡單介紹一下最基本的用法,後續若是寫的話,我會在這裏添加連接放縱了好長一段時間了,以前的計劃擱置了許久,如今開始重啓。各位老鐵共同進步,共勉。