計算機程序的運行需要對值(value)比如數字3.14或者文本"hello world"進行操作,在編程語言中,能夠表示並操作的值的類型叫做數據類型(type),編程語言最基本的特性就是主持多種數據類型。當程序需要將值保持起來以備將來使用時,便將其賦值給(將值“保存”到)一個變量(variable)。變量是一個值的符號名稱,可以通過名稱獲得對值的引用。變量的工作機制是編程語言的令一個基本特性。本章將參照上節幫助理解本章內容,後續將更深入的講解。
javascript的數據分為兩類:原始類(primitive type)和對象類型(object type)
javascript中的原始類包括數字,字符串,布爾值,本章會有單獨的章節專門講述javascript的數字、字符串、布爾值。javascript還有兩個特殊的原始值,null(空)和Undefined(未定義),他們不是數字、字符串、布爾值。它們分別代表了各自特殊類型的唯一成員。
javascript除了數字、字符串、布爾值、null、undefined之外就是對象了。對象 (object)是屬性(property)的集合。每個屬性都由"名/值對"(值可以是原始值,比如數字,字符串,也可以是對象)構成。其中一個比較特殊的對象(全局對象(global object)會在第五小姐介紹,第六小節將更詳細的描述)
普通的javascript對象是“命名值”的無需集合。javascript同樣定義了一種特殊對象--數組(array),表示帶編號的值的有序集合。javascript為數組定義了專用的語法。使數組擁有一些和普通對象不同的特有的行為屬性。
javascript還定義了一種特殊的對象--函數。函數是具有與它想關聯的可執行代碼的對象,通過調用函數來運行科執行代碼,並返還運算結果。和數組一樣,函數行為特征和其它對象都不一樣。javascript為使用函數定義了專用語法。對javascript函數來講。最重要的是,他們都是真值,並且javascript可以講他們當做普通對象來對待。
如果函數初始化(使用new運算符)一個新建對象,我們稱之為構造函數(constructor)。每個構造函數定義了一類(class)對象--構造函數初始化對象組成的集合。類可以看做對象類型的子類型。除了數組(array)類和函數(function)類之外,javascript還定義了其它三種由用的類。日期(date)定義了代表日期的對象。正則(regExp)定義了正則表達式的對象。錯誤(error)類定義了那行表示javascript程序中運行時錯誤和語法錯誤對象。可以通過定義自己的構造函數來定義需要的類。
javascript解釋器有自己的內存管理機制,可以自動對內存進行垃圾回收(garbagecollection)。這意味著程序程序可以按需創建對象,程序員則不必擔心這些對象的銷毀了內存回收。當不再有任何一個引用指向一個對象,解釋器就知道這個對象沒有用了,然後會自動回收它所占用的內存資源。
javascript是一種面向對象的語言。不嚴格的講,這意味著我們不用全局的定義函數去操作不同類型的值,數據類型本身可以定義方法(method)來使用值,例如要對數組a中的元素進行排序,不必要將a傳入sort()函數,而是調運a的一個方法sort()
a.sort(); //sort(a)面向對象的版本
從技術上來將,只有javascript對象才能擁有方法。然而,數字,字符串,布爾值也擁有自己的方法。在javascript中,只有null和undefined是無法擁有方法的值。
javascript的類型可以分為原始類型和對象類型,可分為可以擁有方法的類型和不能擁有方法的類型。同樣可分為可變(mutable)和不可變(immutable)類型。可變類型的值是可以修改的,對象和數組屬於可變類型:javascript程序可以改變對象的屬性值和數組元素的值。
數字、布爾值、null和undefined屬於不可改變的類型。比如,修改一個數組的內容本身就說不通。字符串可以看做是字符組成的數組,你可以認為它是可以變的。然而在javascript中,字符串是不可變的。可以訪問字符串任意位置的文本,但javascript並未提供修改一直字符串文本內容的方法。
javascript可以自由地進行數據類型轉換。比如,如果在程序期望使用字符串的地方使用了數字,javascript會自動將數字轉換為字符串。如果期望在使用布爾值的地方使用了非布爾值,javascript也會相應的轉換。javascript中對靈活的類型抓換規則對“判斷相等”(equality)
javascript的變量是無類型的(untyped),變量可以被賦予人和類型的值,使用var關鍵字來聲明(declare)變量。javascript采用語法作用域,不在任何函數內聲明的變量稱為全局變量(global variable),它在javascript的程序 中任何地方都是可見的。
1.數字
和其它編程語言不同,javascript不區分整數數值和浮點數數值。javascript中的數值均用浮點數數值來表示。當一個數字直接出現在javascript程序中,我們陳之為數字直接量(numeric literal),javascript支持多種格式的數字直接量。(注意:在任何數字前直接添加負號(-)可以得到它們的負值)但負號是一元求反運算符。,並不是數字直接量語法的組成部分。)
i整數型直接量
javascript中用一個數組序列表示一個十進制的整數
除了十進制的整數直接量,javascript同樣識別十六機制(16)為基數的的值。所謂十六進制是以“0X”或者"0x"為前綴,其後緊跟十六進制數串的直接量。十六進制數值是0-9的數字和a(A)-f(F)之間的字母構成。a-f的字母對於的表述數字10-15下面是十六進制整型直接量的例子
代碼如下:
0xff //15*16+15=255
0xCAFE911
盡管ECMAScript不支持八進制直接量,但javascript的某些實現可以允許采用八進制(基數為8)形式表示整數。八進制直接量以數字0開始,其後跟隨著一個0-7之間數字組成的序列。
代碼如下:
0377 // 3*64 +7*8 +7 =255(十進制)
由於某些javascript的實現支持八進制的之間量,而有些不支持,因此最好不要使用以0為前綴的整數之間量,畢竟我們也無法得知當前javascript的實現是否支持八進制的解析。在ECMAScript6的嚴格模式下,八進制的直接量是明令禁止的。
ii.浮點型直接量
浮點型直接量可以含有小數點,它們采用的是傳統的實數寫法。一個實數由整數部分,小數點和小數部分組成。
此外,還可以使用指數計數法表示浮點型直接量。即在實數後跟字母E或e,後面再跟正負號,其後再加一個整型的指數。這種計數方法表示的數值,是有前面的實數乘以10的指數冪。
可以使用更簡潔的語法來表示
代碼如下:
[digits][.digits][(E|e)[(+|-)]digits]
3.14
2345.455
.33333333333333333
6.02e23 //6.02*10的23次方
1.255454E-23 //1.255454*10的負23次方
iii.javascript中的算術運算
javascript程序是使用語言本省提供的算術運算符來進行數字運算的的。這些運算符包含+ - * /和求余(整除後的余數)運算符%
除了基本的運算符之外,javascript還支持更加復雜的算術運算,這個線復雜的運算通過作為Math對象的屬性定義的函數和常量實現。
代碼如下:
Math.pow(2, 53) //=>9007199254740992 document.write(Math.pow(2,53) )
Math.round(.6) //=>1.0 四捨五入
Math.ceil(.6) //=>1.0向上求整
Math.floor(.6) //=>0.0向下求整
Math.abs(-5) //=>5 求絕對值
Math.max(x, y, z) //返回最大值
Math.min(x, y, z) //返回最小值
Math.random() //生成一個大於0小於1的偽隨機數
Math.PI //圓周率π
Math.E //e:自然對數的底數
Math.sqrt(3) //3的平方根
Math.pow(3, 1 / 3) //3的立方根
Math.sin(0) //三角函數,還有Math.cos,Math.atan等
Math.log(10) //=>2.302585092994046 以10為底的自然對數
Math.log(512) / Math.LN2 //以2為底的512的對數
Math.log(100) / Math.LN10 //以10為底的100的對數
Math.exp(3) //e的三次冪
javascript中的算術運算在溢出(overflow)、下溢(underflow)或被零整除時不會報錯。但數字運算結果超過了javascript中所能表示的數字上線(溢出),結果為一個特殊的無窮大的值(infinty)值,在javascript中以infinty表示。同樣地,當負數的值超過了javascript所能表達的負數范圍,結果為負無窮大,在javascript中以-Infinty表示。無窮大值的行為特性和我們所期望的是一致的:基於它們的加減乘除運算結果是無窮大(保留正負號)
下溢(underflow)是當運算結果無線接近於零並比 javascript能表示的最小值還小的時候發生的一種情形。當一個負數發生下溢時,javascript返回一個特殊的值,“負零”,這個(負零)幾乎和正常的零完全一樣。javascript程序員很少用到負零。
javascript預定義了全局變量Infinaty和NaN,用來表達正無窮大河非數字值,在ECMAScipt3中,這兩個值是可以讀寫的。ECMAScript5修正了這個問題,將他們定義為只讀的。ECMAScipt3中的Number對象定義的屬性值也是只讀的,這裡有一些例子:
代碼如下:
Infinity //將一個可讀/寫的變量初始化為infinty
Number.POSITIVE_INFINITY //同樣的值,只讀
1 / 0 //這也是同樣的值
Number.MAX_VALUE + 1 //計算結果還是Infinity
Number.NEGATIVE_INFINITY //表示了負無窮大
-Infinity
-1/0
-Number.MAX_VALUE -1