源代碼: https://github.com/RobinQu/Programing-In-Javascript/blob/master/chapters/Javascript_Core/Javascript_Basics/Types.mdjavascript
原文 http://pij.robinqu.me/Javascript_Core/Javascript_Basics/Types.htmlhtml
本文存在批註,但該網站的Markdown編輯器不支持,因此沒法正常展現,請到原文參考。java
計算機程序的運行須要對值進行造做。在編程語言中,可以表示並操做的值的類型稱作數據類型。git
JavaScript的數據類型分爲兩類: 原始類型和對象類型。JavaScript中的原始類型包括數字,字符串和布爾值。程序員
1 "hello world" true
JavaScript中有兩個特殊的原始值: null和undefined。github
null undefined
JavaScript除了上述的就是對象了,對象是屬性的集合,每一個屬性都由 鍵值對組成。web
var i = {x: 1, y: 2}
一般對象是無序,JavaScript定義了一種特殊對象數組,他是有序的集合。編程
var a[10];
JavaScript還定義了另外一種特殊的對象-函數。函數是具備與它相關聯的可執行代碼的對象。經過調用函數來運行執行的代碼,並返回結果。數組
function a(){ console.log("hello world"); }
文字:dom
Rounding-error
var x = .3 - .2 var y = .2 - .1 x == y x == .1 // => false .3 -.2 不等於 ./ y == .1 // => true .2 - .1 等於 .1
布爾值指代真或假,這個類型只有兩個值, 保留字true和false
一般比較語句的結果是布爾值 例如:
a==4
這段代碼檢測a是否等於4
任何JavaScript的值均可以轉換爲布爾值。下面這些值會被轉換爲false
undefined null 0 -0 NaN "" // the empty string
全部其餘的值,包括全部對象都會轉換成true
null表示一個特殊值,經常使用來描述空值。 對null執行typerof,結果返回object, 也就是null被認爲是一種特殊的對象值,含義是非對象。
JavaScript使用undefined標識變量沒有初始化。例如函數沒有返回值,則返回undefined。undefined是預約義的全局變量(與null不同,它不是關鍵字)。
JavaScript語言核心包括Date()構造函數, 用來建立表示日期和時間的對象。這些日期對象的方法爲日期計算經過了簡單的API:
var then = new Date(2011, 0, 1); // 2011年1月1日 var later = new Date(2011, 0, 1, 17, 10, 30) //同一天,當地時間5:10:30pm, var now = new Date(); //當前日期和時間 var elapsed = now - then; //日期減法: 計算時間間隔的毫秒數 later.getFullYear() // => 2011 later.getMonth() // => 0 從0開始計數的月份 later.getDate() // => 1 從1開始計數的天數 later.getDay() // => 5 獲得星期幾, 0表明星期日, 5表明星期一 later.getHours() // => 當地時間17 5pm later.getUTHours() // 使用UTC表示小時的時間,基於時區
字符串是一組由16位值組成的不可變的有序序列,每一個字符一般來自於Unicode字符集。
var i = "abcdefg";
在JavaScript字符串中,反斜線\有着特殊的用途,反斜線符號後加一個字符,就再也不表示它們的字面含義了,不如\n就是一個轉義字符,它表示一個換行符。
'You\'re right, it can\'t be a quote'
JavaScript的內置功能之一就是字符串鏈接:
msg = "Hello, " + "world";
字符串的length屬性能夠查看字符串的長度:
s.length
除了length屬性, 字符串還提供許多能夠調用的方法:
var s = "hello, world" //定義一個字符串 s.charAt(0) // => "h" 第一個字符 s.charAt(s.length-1) // => "d" 最後一個字符 s.substring(1, 4) // => "ell" 第2-4個字符 s.slice(1,4) // => "ell" 同上 s.slice(-3) // => "rld": 最後三個字符 s.indexOf("l") // => 2 字符l首次出現的位置 s.lastIndexOf("l") // => 10: 字符l最後一次出現的位置 s.indexOf("l", 3) // => 在位置3及以後首次出現字符l的位置 s.split(",") // => ["hello", "world"]分割成子串 s.replace("h", "H") // => "Hello, world": 全文字符替換 s.toUpperCase() // => "HELLO WORLD"
全局對象在JavaScript中有着重要的用途: 全局對象的屬性是全局定義的符號, JavaScript程序能夠直接使用,當解釋器啓動時,它將建立一個新的全局對象,並給它一組定義的初始屬性:
看這樣一個例子:
var s = "hello world!"; var word = s.substring(s.indexOf(" ")+1, s.length);
字符串既然不是對象,爲何它會有屬性呢?只要引用了字符串s的屬性,JavaScript就會將字符串值經過調用new String(s)的方式轉換成對象,
同字符串同樣,數字和布爾值也有相應的方法。其餘相似的包裝類:
原始值是不可改變的,原始值的比較是值比較, 對象的比較並不是值比較:即便兩個對象包含一樣的屬性以及相同的值,他們也不是相等的。咱們一般將對象稱爲引用類型,對象的值都是引用,對象的比較也是引用的比較,當且僅當他們引用同一個基獨享,他們才相等;
當指望使用一個布爾值的時候,能夠提供任意類型值,JavaScript將根據須要自行轉換類型。類型轉換能夠分爲隱式轉換和顯式轉換,所謂隱式轉換即程序在運行時進行的自動轉換,顯式轉換則是人爲的對類型進行強制轉換。
經過手動進行類型轉換,Javascript提供瞭如下轉型函數:
轉換爲數值類型:Number(mix)、parseInt(string,radix)、parseFloat(string)
轉換爲字符串類型:toString(radix)、String(mix)
轉換爲布爾類型:Boolean(mix)
Number(mix)函數,能夠將任意類型的參數mix轉換爲數值類型。其規則爲:
若是是布爾值,true和false分別被轉換爲1和0
Number(true); //=> 1
若是是數字值,返回自己。
Number(5); //=> 5
若是是null,返回0.
Number(null); //=>0
若是是undefined,返回NaN。
Number(undefined); //=> NaN
若是是字符串,遵循如下規則:
若是字符串中只包含數字,則將其轉換爲十進制(忽略前導0)
Number("00001"); //=> 1
若是字符串中包含有效的浮點格式,將其轉換爲浮點數值(忽略前導0)
Number("1.234"); //=> 1.234
若是是空字符串,將其轉換爲0
Number(""); //=> 0
若是字符串中包含非以上格式,則將其轉換爲NaN
下表列出了對象的valueOf()的返回值:
對象 返回值 Array 數組的元素被轉換爲字符串,這些字符串由逗號分隔,鏈接在一塊兒。其操做 與 Array.toString 和 Array.join 方法相同。 Boolean Boolean 值。 Date 存儲的時間是從 1970 年 1 月 1 日午夜開始計的毫秒數 UTC。 Function 函數自己。 Number 數字值。 Object 對象自己。這是默認狀況。 String 字符串值。
parseInt(string, radix)函數,將字符串轉換爲整數類型的數值。它也有必定的規則:
若是指定radix參數,則以radix爲基數進行解析
parseInt("12", 10); // => 12 parseInt("12", 16); // => 18 parseInt("1E", 10); // => 1 parseInt("E", 10); // => NaN
parseFloat(string)函數,將字符串轉換爲浮點數類型的數值。
它的規則與parseInt基本相同,但也有點區別:字符串中第一個小數點符號是有效的,另外parseFloat會忽略全部前導0,若是字符串包 含一個可解析爲整數的數,則返回整數值而不是浮點數值。
parseFloat("1.222.2") // => 1.222 parseFloat("1.0") // => 1
toString(radix)方法。除undefined和null以外的全部類型的值都具備toString()方法,其 做用是返回對象的字符串表示。
對象 操做 Array 將 Array 的元素轉換爲字符串。結果字符串由逗號分隔,且鏈接起來。 Boolean 若是 Boolean 值是 true,則返回 「true」。不然,返 回 「false」。 Date 返回日期的文字表示法。 Error 返回一個包含相關錯誤信息的字符串。 Function 返回以下格式的字符串,其中 functionname 是被調 用 toString 方法函數的名稱: function functionname( ) { [native code] } Number 返回數字的文字表示。 String 返回 String 對象的值。 默認 返回 「[object objectname]」,其中 objectname 是 對象類型的名稱。
String(mix)函數,將任何類型的值轉換爲字符串,其規則爲:
Boolean(mix)函數,將任何類型的值轉換爲布爾值。
如下值會被轉換爲false:false、」"、0、NaN、null、undefined,其他任何值都會被轉換爲true。
考慮一下狀況:
在某些狀況下,即便咱們不提供顯示轉換,Javascript也會進行自動類型轉換,主要狀況有:
isNaN()函數,經測試發現,該函數會嘗試將參數值用Number()進行轉換,若是結果爲「非數值」則返回true,不然返回false。
這些操做符適用於任何數據類型的值,針對不一樣類型的值,該操做符遵循如下規則(通過對比發現,其規則與Number()規則基本相同):
加號運算操做符在Javascript也用於字符串鏈接符,因此加號操做符的規則分兩種狀況:
能夠看出,加法運算中,若是有一個操做值爲字符串類型,則將另外一個操做值轉換爲字符串,最後鏈接起來。
這些操做符針對的是運算,因此他們具備共同性:若是操做值之一不是數值,則被隱式調用Number()函數進行轉換。具體每一種運算的詳細規則請參 考ECMAScript中的定義。
邏輯非(!)操做符首先經過Boolean()函數將它的操做值轉換爲布爾值,而後求反。
邏輯與(&&)操做符,若是一個操做值不是布爾值時,遵循如下規則進行轉換:
邏輯或(||)操做符,若是一個操做值不是布爾值,遵循如下規則:
與上述操做符同樣,關係操做符的操做值也能夠是任意類型的,因此使用非數值類型參與比較時也須要系統進行隱式類型轉換:
注:NaN是很是特殊的值,它不和任何類型的值相等,包括它本身,同時它與任何類型的值比較大小時都返回false。
相等操做符會對操做值進行隱式轉換後進行比較:
須要注意的是一個值轉換爲另外一個值並不表明兩個值相等。