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():返回對象的字符串、數值或布爾值表示;