js的基本數據類型有哪些?

js的基本數據類型有哪些?

ECMAScript中有5中簡單數據類型(也稱爲基本數據類型): UndefinedNullBooleanNumberString。還有1中複雜的數據類型————ObjectObject本質上是由一組無序的名值對組成的。es6

其中UndefinedNullBooleanNumber都屬於基本類型。ObjectArrayFunction則屬於引用類型,String有些特殊,具體的會在下面展開分析。web

變量

ECMAScript中用var關鍵字來定義變量,由於js是弱類型的,因此沒法肯定變量必定會存儲什麼值,也就不知道變量到底會是什麼類型,並且變量的類型能夠隨時改變。編程

這就是ECMAScript是鬆散類型的來由,所謂鬆散類型就是能夠用來保存任何類型的數據。瀏覽器

ps:
es6中新增了let命令來聲明變量、const命令聲明一個只讀的常量。框架

let的用法相似於var,可是所聲明的變量,只在let命令所在的代碼塊內有效。編程語言

const一旦聲明,常量的值就不能改變。函數

關於letconst這裏不作展開討論,能夠參考 阮一峯 - ECMAScript 6 入門測試

typeof 操做符

因爲js中的變量是鬆散類型的,因此它提供了一種檢測當前變量的數據類型的方法,也就是typeof關鍵字.
經過typeof關鍵字,對這5種數據類型會返回下面的值(以字符串形式顯示)
undefined ---------- 若是值未定義 Undefined設計

boolean ---------- 若是這個值是布爾值 Boolean指針

string ---------- 若是這個值是字符串 String

number ---------- 若是這個值是數值類型 Number

object ---------- 若是這個值是對象或null Object

須要注意的是typeof null返回爲object,由於特殊值null被認爲是一個空的對象引用。

Undefined

Undefined類型只有一個值,即特殊的undefined。在使用var聲明變量但未對其加以初始化時,這個變量的值就是undefined。不過,通常建議儘可能給變量初始化,可是在早期的js版本中是沒有規定undefined這個值的,因此在有些框架中爲了兼容舊版瀏覽器,會給window對象添加undefined值。

window['undefined'] = window['undefined'];  
//或者
window.undefined = window.undefined;

Null

Null類型是第二個只有一個值的數據類型,這個特殊的值是null。從邏輯角度來看,null值表示一個空對象指針,而這也正是使用typeof操做符檢測null時會返回object的緣由。

var car = null;
  console.log(typeof car); // "object"

若是定義的變量準備在未來用於保存對象,那麼最好將該變量初始化爲null而不是其餘值。這樣一來,只要直接檢測null值就能夠知道相應的變量是否已經保存了一個對象的引用了。
例如:

if(car != null){
    //對car對象執行某些操做
  }

實際上,undefined值是派生自null值的,所以ECMA-262規定對它們的相等性測試要返回true。

console.log(undefined == null); //true

儘管null和undefined有這樣的關係,但它們的用途徹底不一樣。不管在什麼狀況下都沒有必要把一個變量的值顯式地設置爲undefined,但是一樣的規則對null卻不適用。換句話說,只要意在保存對象的變量尚未真正保存對象,就應該明確地讓該變量保存null值。這樣作不只能夠體現null做爲空對象指針的慣例,並且也有助於進一步區分null和undefined。

Boolean

該類型只有兩個字面值:true和false。這兩個值與數字值不是一回事,所以true不必定等於1,而false也不必定等於0。

雖然Boolean類型的字面值只有兩個,但JavaScript中全部類型的值都有與這兩個Boolean值等價的值。要將一個值轉換爲其對應的Boolean值,能夠調用類型轉換函數Boolean(),例如:

var message = 'Hello World';
    var messageAsBoolean = Boolean(message);

在這個例子中,字符串message被轉換成了一個Boolean值,該值被保存在messageAsBoolean變量中。能夠對任何數據類型的值調用Boolean()函數,並且總會返回一個Boolean值。至於返回的這個值是true仍是false,取決於要轉換值的數據類型及其實際值。下表給出了各類數據類型及其對象的轉換規則。

數據類型 轉換爲true的值 轉換爲false的值
Boolean true false
String 任何非空的字符串 ""(空字符串)
Number 任何非0數值(包括無窮大) 0和NAN
Object 任何對象 null
Undefined 不適用 undefined
var message = 'Hello World';
    if(message)
    {
        alert("Value is true");
    }

運行這個示例,就會顯示一個警告框,由於字符串message被自動轉換成了對應的Boolean值(true)。因爲存在這種自動執行的Boolean轉換,所以確切地知道在流控制語句中使用的是什麼變量相當重要。

ps:使用!!操做符轉換布爾值
!!通常用來將後面的表達式強制轉換爲布爾類型的數據(boolean),也就是隻能是true或者false;

對null與undefined等其餘用隱式轉換的值,用!操做符時都會產生true的結果,因此用兩個感嘆號的做用就在於將這些值轉換爲「等價」的布爾值;

var foo;  
alert(!foo);//undifined狀況下,一個感嘆號返回的是true;  
alert(!goo);//null狀況下,一個感嘆號返回的也是true;  
var o={flag:true};  
var test=!!o.flag;//等效於var test=o.flag||false;  
alert(test);

這段例子,演示了在undifined和null時,用一個感嘆號返回的都是true,用兩個感嘆號返回的就是false,因此兩個感嘆號的做用就在於,若是明確設置了變量的值(非null/undifined/0/」「等值),結果就會根據變量的實際值來返回,若是沒有設置,結果就會返回false。

還有其餘的小技巧,能夠參考這12個JavaScript技巧

Number

這種類型用來表示整數和浮點數值,還有一種特殊的數值,即NaN(非數值 Not a Number)。這個數值用於表示一個原本要返回數值的操做數未返回數值的狀況(這樣就不會拋出錯誤了)。例如,在其餘編程語言中,任何數值除以0都會致使錯誤,從而中止代碼執行。但在JavaScript中,任何數值除以0會返回NaN,所以不會影響其餘代碼的執行。

NaN自己有兩個非同尋常的特色。首先,任何涉及NaN的操做(例如NaN/10)都會返回NaN,這個特色在多步計算中有可能致使問題。其次,NaN與任何值都不相等,包括NaN自己。例如,下面的代碼會返回false。

alert(NaN == NaN);    //false

String

String類型用於表示由零或多個16位Unicode字符組成的字符序列,即字符串。字符串能夠由單引號(')或雙引號(")表示。

String類型的特殊性

string類型有些特殊,由於字符串具備可變的大小,因此顯然它不能被直接存儲在具備固定大小的變量中。因爲效率的緣由,咱們但願JS只複製對字符串的引用,而不是字符串的內容。可是另外一方面,字符串在許多方面都和基本類型的表現類似,而字符串是不可變的這一事實(即無法改變一個字符串值的內容),所以能夠將字符串當作行爲與基本類型類似的不可變引用類型

Boolean、Number、String 這三個是Javascript中的基本包裝類型,也就是這三個實際上是一個構造函數,他們是Function的實例,是引用類型,至於這裏的String與以上說的String是同名,是由於其實上文說的String是指字符串,這裏的String指的是String這個構造函數,上面那麼寫,是爲了更好的理解,由於Javascript是鬆散類型的。咱們能夠看下String實例化的例子:

var name = String("jwy");
alert(typeof name);//"string"
var x=new String('12345')
typeof x //object
x='12345'
typeof x //string
var author = "Tom";
alert(typeof name);//"string"

至於author這個會有length,substring等等這些方法,其實string只是String的一個實例,相似於C#中的String,和string.

注意,typeof 變量 若是值是"string" 的話,也就是這個變量是字符串,在Javascript中,字符串是基本類型,而在C#或Java中,字符串是引用類型,可是Javascript中的String是引用類型,由於它是Javascript中定義好的基本包裝類型,在C#中,String跟string實際上是同樣的。

本帖只是簡要的copy了一些JavaScript高級程序設計(第三版)內容,外加了本身側重的角度,看本帖的朋友仍是要看書啊,這裏只是作個參考。

相關文章
相關標籤/搜索