JavaScript 語言的每個值,都屬於某一種數據類型。JavaScript 的數據類型,共有六種。(ES6 又新增了第七種 symbol 類型的值)數組
數值(number):整數和小數(好比1和3.14);函數
字符串(string):文本(好比Hello World);spa
布爾值(boolean):表示真僞的兩個特殊值,即true(真)和false(假);prototype
undefined:表示「未定義」或不存在,即因爲目前沒有定義,因此此處暫時沒有任何值;設計
null:表示空值,即此處的值爲空。code
對象(object):各類值組成的集合。對象
symbol:由Symbol()函數生成,表示獨一無二的值。blog
一般,數值、字符串、布爾值這三種類型,合稱爲原始類型(primitive type)的值,即它們是最基本的數據類型,不能再細分了。對象則稱爲合成類型(complex type)的值,由於一個對象每每是多個原始類型的值的合成,能夠看做是一個存放各類值的容器。至於undefined和null,通常將它們當作兩個特殊值。ip
對象是最複雜的數據類型,又能夠分紅三個子類型。狹義的對象(object)、數組(array)、函數(function)字符串
JavaScript 有三種方法,能夠肯定一個值究竟是什麼類型。typeof運算符、instanceof運算符 、Object.prototype.toString方法
typeof運算符能夠返回一個值的數據類型。
let a; console.log(typeof a);//undefined let b=1; console.log(typeof b);//number let c='1'; console.log(typeof c);//string let d=true; console.log(typeof d);//boolean let e=function(){}; console.log(typeof e);//function let f=[1,2,3]; console.log(typeof f);//object let g=null; console.log(typeof g);//object let h={}; console.log(typeof h);//object let i=Symbol(); console.log(typeof i);//symbol
數值、字符串、布爾值分別返回number、string、boolean。函數返回function、undefined返回undefined,對象數組和null都返回了object。
函數也是對象,爲何typeof 運算符會返回 function呢?上面說過了function 也是一個對象,可是與普通的對象不一樣,其內部有一個call方法,用來表示這個對象是能夠調用的。
typeof操做符在判斷Object時,若是內部實現了[[Call]]方法,就返回function
console.log(typeof Object); // function console.log(typeof Array);// function
上面已經能夠看到了,對象數組與null都返回了object,那麼咱們怎麼區分呢?
instanceof運算符返回一個布爾值,表示對象是否爲某個構造函數的實例。剩下兩種的具體的用法後面會在作詳細的介紹。
let h={}; console.log(h instanceof Object);// true let f=[1,2,3]; console.log(f instanceof Array);// true
null的類型是object,這是因爲歷史緣由形成的。1995年的 JavaScript 語言初版,只設計了五種數據類型(對象、整數、浮點數、字符串和布爾值),沒考慮null,只把它看成object的一種特殊值。後來null獨立出來,做爲一種單獨的數據類型,爲了兼容之前的代碼,typeof null返回object就無法改變了。
null與undefined均可以表示「沒有」,含義很是類似。將一個變量賦值爲undefined或null,老實說,語法效果幾乎沒區別。相等運算符(==)甚至直接報告二者相等。我我的認爲 null是我規定了它是空,而undefined 是我什麼都沒作的空,大概意思就是我努力了但什麼都沒獲得和我沒努力因此沒獲得
console.log(undefined==null);//true
下面列舉一下變量爲undefined的幾種狀況。NaN數值一節介紹
// 定義一個變量但爲賦值 let i; console.log(i);//undefined // 接收的參數未傳值 function f(x){ console.log(x) } f();//undefined // 對象中的屬性不存在 var obj={} console.log(obj.name)//undefined // 函數未有返回值 let add=function(){} console.log(add())//undefined
返回null的通常是錯誤處理時,表示沒有錯誤時,會返回null。
根據 C 語言的傳統,null能夠自動轉爲0。
console.log(Number(null));//0 console.log(Number(undefined));//NaN console.log(5+null);//5 console.log(5+undefined);//NaN
null是一個表示「空」的對象,轉爲數值時爲0;undefined是一個表示"此處無定義"的原始值,轉爲數值時爲NaN。
若是 JavaScript 預期某個位置應該是布爾值,會將該位置上現有的值自動轉爲布爾值。也就是隱式轉換。
if(''){ console.log(1);// 不會輸出 }
除了下面六個值被轉爲false,其餘值都視爲true。
undefined null false 0 NaN ""或''(空字符串),都會轉換爲false; 可是注意:[] 或者 {} 是true