讀《高程3》系列之第三章3.0---變量和數據類型

1,ECMAScript但變量是鬆散類型,也就是能夠保存任何數據類型。java

  var msg;函數

這個代碼定義個msg變量,該變量能夠保存任何值,在未保存值以前或者說未初始化以前,會保存一個特殊的值----undefiend。spa

2,ECMAScript也支持直接初始化變量以下:指針

  var msg="hello";code

3,像上面代碼在初始化時賦值,不會把它標記未字符串類型;初始化的過程就是給變量賦予一個值那麼簡單,所以也能夠修改這個值和值的類型,以下:對象

  var msg=‘hello’;blog

  msg=10;ip

這是有效的,可是是不推薦的。作用域

4,用var操做符定義的變量將成爲該變量的做用域中的局部變量,以下字符串

function test(){
    var msg="hello";//局部變量
}
test()
alert(msg)//錯誤

如上說明,若是在函數中定義一個變量,那麼這個變量在函數推出後就會被銷燬。而若是函數內沒有用var聲明的變量賦值,那麼就會變成全局變量以下:

function test(){
    msg="全局變量";
}
test()
alert(msg)//   '全局變量'

雖然有效,可是不推薦,由於如此定義的全局變量不便與維護。

5,一條語句能夠定義多個變量,只要用逗號隔開便可:

var msg= "thomas",age=18;

6,ECMAScript中定義了5中簡單數據類型(也稱爲基本數據類型):Undefined、Null、Boolean、Number和String,還有一種複雜數據類型-----Object,Object本質是由一組無序的明值對組成。

7,ECMAScript不支持任何自定義數據類型機制,而全部值最終都將是上述6種數據類型之一。

8,因爲數據類型鬆散型,那麼就須要檢測數據類型,typeof就是用來檢測這方面的信息,不過須要注意的是,在檢測null時,會返回的是object,由於null被認爲是一個空的對象引用,在檢測函數的時候,返回的是「function」,雖然函數的本質也是object,可是函數有它的特殊性,因此和其餘的對象進行區分開來了。

9,Undefiend類型只有一個值,即特殊的undefined,在使用var聲明變量但未對其初始化時,這個變量的值就是udefiend。

10,Null類型只有一個值,即特殊的null,它表示一個空對象指針,而這真是使用typeof操做符檢測null值時會返回「object」的緣由;

  注意:alert(null==undefined)//true

     alert(null===undefined)//false

11,Boolean類型,時ECMAScript中使用最多的一種類型,該類型只有兩個字面值,true和false。注意,這個區分大小寫,所以True和False不是它的值,只是標示符;雖然Boolean只有兩個,但ECMAScript中全部類型的值都有與這個兩個值等價的值,也就是說,其餘的全部數據類型,均可以轉化成這兩個值;

12,轉換

數據類型 轉換爲true 轉換爲false
Boolean true false
String 任何非空字符串 ""(空字符串)
Number 任何非0數值(包括無窮數) 0和NaN
Object 任何對象 null
Undefined 不適用(不能轉) undefined

13,Number類型,這種類型使用IEEE754格式來表示整數和浮點數(浮點數值在某些語言中也被稱爲雙精度數值),最基本的數值字面量格式是十進制,除了十進制表示外,整數還能夠用八進制或十六進制的字面值。其中八進制字面值的第一位必須是0,而後是八進制數字序列。若是字面值中的數值超出了範圍,那麼前面的0會被忽略,後面的值看成十進制解析;

  var  num1=070;//八進制的56 

  var num2=079;//無效的八進制數值,解析爲79

  var num3=08;//無效的八進制數值,解析爲8

14,八進制字面量在嚴格模式下是無效的。十六進制字面值必須是0x(零x),後跟任何十六進制數字(0~9及A~F)。其中字母能夠大寫,也能夠小寫;

  var num4=0xA;//十六進制的10

  var num5=0x1f;//十六進制的31

15,浮點數值最高的精度數是17位小數,浮點數在計算時會產生偏差,這是使用基於IEEE754數值的通病,其餘的語言也有這個問題;

16,NaN,即非數值,是一個特殊的數值,表示一個原本要返回數值卻沒有返回數值的狀況。任何數值除以非數值都會返回NaN。任何涉及到Nan到操做都會返回NaN,這個特色在多部計算有可能致使問題,NaN和任何值都不相等,包括自己,入下;

alert(NaN==NaN)//false

針對這兩個特色,ECMAScript定義量isNaN函數,這個函數接受一個參數,該參數能夠是任何類型,這個函數能夠幫咱們肯定這個參數是否‘不是數值’;

alert(is NaN(NaN));//true
alert(is NaN(10));//false
alert(is NaN("10"));//false,能夠轉換成數值10
alert(is NaN("true"));//true
alert(is NaN(true));//false,能夠轉換成數值1

17,有三個函數能夠把非數值轉換爲數值:Number()、parseInt()和parseFloat()。

  16.1:Number函數有以下的轉換規則:

    *若是是Boolean值,true和false將分別轉換成1和0;

    *若是是數值,只是簡單的傳入和返回;

    *若是是null值,返回0;

    *若是是undefined,返回是NaN;

    * 若是是字符串,有以下規則:

      - 若是字符串只包含數字,那麼就轉換成十進制數值,注意「011」,會轉成11,由於前的0會忽略;

      - 若是字符串包含有效的浮點數如1.1,則轉成相應的浮點數1.1;

      - 若是是有效的十六進制的格式,將會轉換成相同大小的十進制數值;

      - 若是字符串是空,轉爲0;

      - 若是字符串包含除上述格式以外的字符,則爲NaN;

    * 若是是對象,則調用對象的valueOf(),而後依照恰年的規則轉換返回的值,若是轉換的結果是NaN,則調用對象的toString()方法,而後再次按照前面的規則轉換;

18,因爲Number()函數轉換字符串時比較複雜並且不夠合理,所以在處理整數的時候更經常使用parseInt()函數。它接受兩個參數,第一個參數是要轉換的參數,第二個參數是轉換成目標的進制單位,若是不寫第二個參數,默認參數是十進制,可是,它的第一個參數能夠識別進制數,好比,八進制或者十六進制數放在第一個參數,後面不寫第二個參數,是能夠識別的,同時,會轉成一個十進制的數,以下;  

var num1=parseInt('123abc')     //123
var num2=parseInt('')  //NaN
var num3=parseInt(22.5) //22
var num4=parseInt("0xA") //10(十六進制)
var num5=parseInt(070) //56 (八進制)
var num6=parseInt("111") // 111 (十進制)

經過上面的例子能夠發現,咱們若是不傳入第二個參數,parseInt函數會將第一個函數轉換成十進制數,而且能夠識別八進制和十六進制數;若是加了第二個參數呢,會有以下的結果:

var num1=parseInt("10",10) //10
var num2=parseInt("10",8) //8
var num3=parseInt("0x10") // 16
var num4=parseInt("10",16) //16

19, 與parseInt函數類似的還有parseFloat函數,可是區別的是,parseFloat函數只有一個參數,而且只能轉換十進制,這也反應了它不會識別其餘進制的數,只會轉換成十進制,看看它的結果:

var num1=parseFloat('123qwe') //123
var num2=parseFloat('0xA')//0   不識別十六進制
var num3=parseFloat(22.5) //22.5
var num4=parseFloat('0909.1') //909.1 會忽略前面的0;
var num5=parseFloat(3.14e7) //3140000

20,String類型表示由或多個16爲Unicode字符組成的字符序列,即字符串,由單引號或者雙引號包裹而成,以雙引號開頭必須以雙引號結尾,以單引號開頭,必須單引號結尾;

21,String數據類型包含一些特殊的字符字面量,也叫轉義序列,用於表示非打印字符,或者有其餘用途的字符,以下:

字面量 含義
\n 換行
\t 製表
\b 退格
\r 回車
\f 進制
\\ 斜槓
\' 單引號
\" 雙引號
\xnm 以十六進制代碼nn表示一個字符
\unnn 以十六進制代碼nnnn表示一個Uncode字符

 

22,ECMAScript中定義字符串是不可變的,也就是說要改變某個變量保存的字符串,首先要銷燬原來的字符串,而後再用另外一個包含新值的字符串填充該變量,例如;

var lang='java'

lang=lang+'Script'

這個例子中首先建立一個能容納10個字符的新字符串用來填充'java'和‘script‘,最後一步銷燬原來的字符串’java'和字符串‘script’;

23,其餘值轉換成字符串有兩種方式,第一種是使用toString()方法,數值,布爾值,對象和字符串都有該方法,但null和undefined沒有該方法;它還有一個參數,能夠將數值轉成該參數對應但進制數,以下:

var num=10;

alert(num.toString());     //"10"

alert(num.toString(2)); //'1010'

alert(num.toString(8));  //12

alert(num.toString(16)); // 'a'

在不知道要轉換但值是否是null或undefined時,能夠用另外一個方法String()方法,能夠將任何值均可以轉成字符串,包括null和undefined,以下;

var value=true;

alert(value.String()) //'true'

var value1=null;

alert(value1.String()) //'null'

var value2=undefiend

alert(value2.String()) //'undefined'

24,Object類型,ECMAScript中的對象其實就是一組數據和功能的集合;對象能夠經過執行new操做符後要建立的對象類型的名稱來建立,

var obj=new Object();

在ECMAScript中,Object類型是全部它的實例的基礎,Object類型所具備的任何屬性和方法也一樣存在更具體的對象中。Object的每一個實例都具備下列屬性和方法:

  * constructor:保存着用於建立當前對象的函數,對與上面的那個例子,構造函數(constructor)就是Object();

  * hasOwnProperty(propertyName):用於檢查給定的屬性在當前對象實例中(而不是在實例的原型中)是否存在。其中,做爲參數的屬性名(propertrName)必須以字符串形式指定(例如:obj.hasOwnProperty('name'))。

  * isPrototypeof(object):用於檢查傳入的對象是不是當前對象的原型;

  * propertyIsEnumerable(propertyName):用於檢查給定的屬性是否可以使用fro-in語句來枚舉,參數的屬性名必須以字符串形式;

  * toLocaleString():返回對象的字符串表示,該字符串與執行環境的地區對應;

  * toString() :返回對象的字符串表示;

  * valueOf():返回對象的字符串、數值或布爾值表示;

相關文章
相關標籤/搜索