javascript
JavaScript基础---语言基础(1)
寫在前面:
通過四篇博客把JS基礎中的基礎整理一下,方便自己查閱,這些內容對于實際項目開發中也許并不會在意,但是作為JS的語言基礎,自覺還是應該熟悉。在完成這三篇博客(JavaScript基礎---語言基礎)之后,JS基礎部分的博客也算告一段落。接下來的一段時間,想把最近看的一些書分類整理一下(包括CSS,JS,AJAX,jQuery源碼,D3,Nodejs基礎等內容)。
?
語法、關鍵保留字及變量
學習要點:
1.語法結構
2.關鍵字和保留字
3.變量
?
任何語言的核心都必然會描述這門語言最基本的工作原理。而JavaScript的語言核心就是ECMAScript,而目前用的最普遍的是第3版。
一.語法構成
?
區分大小寫
ECMAScript中的一切,包括變量、函數名和操作符都是區分大小寫的。例如:text和Text表示兩種不同的變量。
?
標識符
所謂標識符,就是指變量、函數、屬性的名字,或者函數的參數。標識符可以是下列格式規則組合起來的一或多個字符:
1.第一字符必須是一個字母、下劃線(_)或一個美元符號($)。
2.其他字符可以是字母、下劃線、美元符號或數字。
3.不能把關鍵字、保留字、true、false和null作為標識符。
例如:myName、book123等
?
直接量(字面量literal)
所有直接量(字面量),就是程序中直接顯示出來的數據值。
100? ?????? ?????? ?????? //數字字面量
'張三'????? ?????? ?????? //字符串字面量
false ?????? ?????? ?????? //布爾字面量
/js/gi?????? ?????? ?????? //正則表達式字面量
null? ?????? ?????? ?????? //對象字面量
?
在ECMAScript第3版中,像數組字面量和對象字面量的表達式也是支持的,如下:
{x:1, y:2}?????? ?????? //對象字面量表達式
[1,2,3,4,5]????? ?????? //數組字面量表達式
?
二.關鍵字和保留字
?
ECMAScript-262描述了一組具有特定用途的關鍵字,一般用于控制語句的開始或結束,或者用于執行特定的操作等。關鍵字也是語言保留的,不能用作標識符。
?
ECMAScript全部關鍵字
?
| break | else | new | var |
| case | finally | return | void |
| catch | for | switch | while |
| continue | function | this | with |
| default | if | throw | ? |
| delete | in | try | ? |
| do | instanceof | typeof | ? |
?
ECMAScript-262還描述了另一組不能用作標識符的保留字。盡管保留字在JavaScript中還沒有特定的用途,但它們很有可能在將來被用作關鍵字。
?
ECMAScript-262第3版定義的全部保留字
?
| abstract | enum | int | short |
| boolean | export | interface | static |
| byte | extends | long | super |
| char | final | native | synchronized |
| class | float | package | throws |
| const | goto | private | transient |
| debugger | implements | protected | volatile |
| double | import | public | ? |
?
?
三.變量
ECMAScript的變量是松散類型的,所謂松散類型就是用來保存任何類型的數據。聲明變量時要使用var操作符(var是關鍵),后面跟一個變量名(變量名是標識符)。
var box;
alert(box); ? ? ?//undefined
?
這句話定義了box變量,但沒有對它進行初始化(也就是沒有給變量賦值)。這時,系統會給它一個特殊的值 -- undefined(表示未定義)。
var box= '張三';
alert(box);
?
所謂變量,就是可以初始化后可以再次改變的量。ECMAScript屬于弱類型(松散類型)的語言,可以同時改變不同類型的量。(PS:雖然可以改變不同類型的量,但這樣做對于后期維護帶來困難,而且性能也不高,導致成本很高!)
var boxString = '張三';
boxString = 100; ? ? ? ? //不建議這樣做!
alert(boxString);
?
重復的使用var聲明一個變量,只不過是一個賦值操作,并不會報錯。但這樣的操作沒有任何必要。
var box= '張三';
var box= 'Alex'; ? ? //這樣做完全沒有必要!
?
還有一種變量不需要前面var關鍵字即可創建變量。這種變量和var聲明的變量有一定的區別和作用范圍(全局范圍)。
box= '張三'; ? ? ? ?//沒有var關鍵字
?
當你想聲明多個變量的時候,可以在一行或者多行操作。
var box= '張三'; var age= 100;????? //分號隔開
?
而當你每條語句都在不同行的時候,你可以省略分號。(PS:這是ECMAScript支持的,但絕對是一個非常不好的編程習慣,切記不要這樣做)。
var box= '張三'
var age= 100
alert(box)
?
可以使用一條語句定義多個變量,只要把每個變量(初始化或者不初始化均可)用逗號分隔開即可,為了可讀性,每個變量,最好另起一行,并且第二變量和第一變量對齊(PS:這些都不是必須的,只是一種良好的編程習慣)。
var box= '張三',
? ? ?age = 28,
? ? ?height;
?
?
??
?數據類型
學習要點:
1.typeof操作符
2.Undefined類型
3.Null類型
4.Boolean類型
5.Number類型
6.String類型
7.Object類型
?
?
ECMAScript中有5種簡單數據類型:Undefined、Null、Boolean、Number和String。還有一種復雜數據類型——Object。
ECMAScript不支持任何創建自定義類型的機制,所有值都成為以上6中數據類型之一。
一.typeof操作符
typeof操作符是用來檢測變量的數據類型。對于值或變量使用typeof操作符會返回如下字符串。
?
| 字符串 | 描述 |
| undefined | 未定義 |
| boolean | 布爾值 |
| string | 字符串 |
| number | 數值 |
| object | 對象或null |
| function | 函數 |
?
var box = '張三';
alert(typeof ?box);
alert(typeof ?'張三');
?
typeof操作符可以操作變量,也可以操作字面量。雖然也可以這樣使用:typeof(box),但是typeof是操作符而非內置函數。
PS:函數在ECMAScript中是對象,不是一種數據類型。所以,使用typeof來區分function和object是非常有必要的。
??
二.Undefined類型
Undefined類型只有一個值,即特殊的undefined。
在使用var聲明變量,但沒有對其初始化時,這個變量的值就是undefined。
var box;
alert(box);
PS:我們沒有必要顯式的給一個變量賦值為undefined,因為沒有賦值的變量會隱式的(自動的)賦值為undefined;而undefined主要的目的是為了用于比較,ECMAScript第3版之前并沒有引入這個值,引入之后為了正式區分空對象(null)與未經初始化(undefined)的變量。
?
未初始化的變量與根本不存在的變量(未聲明的變量)也是不一樣的。
var box;
alert(age);?? //age is not defined
PS:如果typeof box,typeof age都返回的undefined。從邏輯上思考,他們的值,一個是undefined,一個報錯;但他們的類型卻都是undefined。所以,我們在定義變量的時候,盡可能的不要只聲明不賦值。
?
?
三.Null類型
Null類型是一個只有一個值的數據類型,即特殊的值null。它表示一個空對象引用(指針),而typeof操作符檢測null會返回object。
var box = null;
alert(typeof box); ? ? ? //object
?
如果定義的變量準備在將來用于保存對象,那么最好將該變量初始化為null。這樣,當檢查null值就知道是否已經變量是否已經分配了對象引用了。
var box = null;
if (box != null) {
?????? alert('box對象已存在!');
}
?
PS:undefined是派生自null的,因此ECMA-262規定對它們的相等性測試返回true。
alert(undefined == null);
?
由于undefined和null兩個值的比較是相等的,所以,未初始化的變量(undefined)和賦值為null的變量會相等。這時,可以采用typeof變量的類型進行比較。建議還是養成良好的編碼規范,不要忘記初始化變量。
var box;
var car = null;
alert(typeof box == typeof car)????? //true
?
四.Boolean類型
Boolean類型有兩個值(字面量):true和false。而true不一定等于1,false不一定等于0。JavaScript是區分大小寫的,True和False或者其他都不是Boolean類型的值。
var box = true;
alert(typeof box);
?
雖然Boolean類型的字面量只有true和false兩種,但ECMAScript中所有類型的值都有與這兩個Boolean值等價的值。要將一個值轉換為其對應的Boolean值,可以使用轉型函數Boolean()。
var hello = 'Hello World!';
var hello2 = Boolean(hello);
alert(typeof hello);
?
上面是一種顯示轉換,屬于強制性轉換。而實際應用中,還有一種隱式轉換。比如,在if條件語句里面的條件判斷,就存在隱式轉換。
var hello = 'Hello World!';
if (hello) {
?????? alert('如果條件為true,就執行我這條!');
} else {
?????? alert('如果條件為false,就執行我這條!');
}
?
以下是其他類型轉換成Boolean類型規則?
| 數據類型 | 轉換為true的值 | 轉換為false的值 |
| Boolean | true | false |
| String | 任何非空字符串 | 空字符串 |
| Number | 任何非零數字值(包括無窮大) | 0和NaN |
| Object | 任何對象 | null |
| Undefined | ? | undefined |
?
?
五.Number類型
Number類型包含兩種數值:整型和浮點型。為了支持各種數值類型,ECMA-262定義了不同的數值字面量格式。
最基本的數值字面量是十進制整數。
var box = 100;?????? ?????? ?????? //十進制整數
?
八進制數值字面量(以8為基數),前導必須是0,八進制序列(0~7)。
var box = 070;?????? ?????? ?????? //八進制,56
var box = 079;?????? ?????? ?????? //無效的八進制,自動解析為79
var box = 08;? ?????? ?????? //無效的八進制,自動解析為8
?
十六進制字面量前面兩位必須是0x,后面是(0~9及A~F)。
var box = 0xA;????? ?????? //十六進制,10
var box = 0x1f;????? ?????? //十六進制,31
?
浮點類型,就是該數值中必須包含一個小數點,并且小數點后面必須至少有一位數字。
var box = 3.8;
var box = 0.8;
var box = .8;?? ?????? ?????? //有效,但不推薦
?
由于保存浮點數值需要的內存空間比整型數值大兩倍,因此ECMAScript會自動將可以轉換為整型的浮點數值轉成為整型。如下:
var box = 8.;?? ?????? ?????? //小數點后面沒有值,轉換為8
var box = 12.0;????? ?????? //小數點后面是0,轉成為12
?
對于那些過大或過小的數值,可以用科學技術法來表示(e表示法)。用e表示該數值的前面10的指數次冪。
var box = 4.12e9;?? ?????? ?//即4120000000
var box = 0.00000000412;??? //即4.12e-9?? 小數點右移九位
?
雖然浮點數值的最高精度是17位小數,但算術運算中可能會不精確。由于這個因素,做判斷的時候一定要考慮到這個問題(比如使用整型判斷)。
alert(0.1+0.2);?????? ?????? ?????? //0.30000000000000004
?
浮點數值的范圍在:Number.MIN_VALUE ~ Number.MAX_VALUE之間。
alert(Number.MIN_VALUE);?????? ?????? ?????? //最小值
alert(Number.MAX_VALUE);????? ?????? //最大值
?
如果超過了浮點數值范圍的最大值或最小值,那么就先出現Infinity(正無窮)或者-Infinity(負無窮)。
var box = 100e1000;????? ?????? ?????? ?????? //超出范圍,Infinity
var box = -100e1000;??? ?????? ?????? ?????? //超出范圍,-Infinity
?
也可能通過Number.POSITIVE_INFINITY和Number.NEGATIVE_INFINITY得到Infinity(正無窮)及-Infinity(負無窮)的值。
alert(Number.POSITIVE_INFINITY); //Infinity(正無窮)
alert(Number.NEGATIVE_INFINITY);//-Infinity(負無窮)
?
要想確定一個數值到底是否超過了規定范圍,可以使用isFinite()函數。如果沒有超過,返回true,超過了返回false。
var box = 100e1000;
alert(isFinite(box));?????? ?????? ?????? ?????? ?????? //返回false或者true
?
NaN,即非數值(Not a Number)是一個特殊的值,這個數值用于表示一個本來要返回數值的操作數未返回數值的情況(這樣就不會拋出錯誤了)。比如,在其他語言中,任何數值除以0都會導致錯誤而終止程序執行。但在ECMAScript中,會返回出特殊的值,因此不會影響程序執行。
var box = 0 / 0;????? ?????? ?????? ?????? //NaN
var box = 12 / 0;??? ?????? ?????? ?????? //Infinity
var box = 12 / 0 * 0;????? ?????? ?????? //NaN
?
可以通過Number.NaN得到NaN值,任何與NaN進行運算的結果均為NaN,NaN與自身不相等(NaN不與任何值相等)。
alert(Number.NaN);?????? ?????? ?????? //NaN
alert(NaN+1); ?????? ?????? ?????? ?????? //NaN
alert(NaN == NaN)?????? ?????? ?????? ?????? //false
?
ECMAScript提供了isNaN()函數,用來判斷這個值到底是不是NaN。isNaN()函數在接收到一個值之后,會嘗試將這個值轉換為數值。
alert(isNaN(NaN)); ? ? ? ? ? ? ? ? ? ? ? //true
alert(isNaN(25));??? ?????? ?????? ?????? //false,25是一個數值
alert(isNaN('25'));?? ?????? ?????? ?????? //false,'25'是一個字符串數值,可以轉成數值
alert(isNaN('Lee')); ?????? ?????? ?????? //true,'Lee'不能轉換為數值
alert(isNaN(true));? ?????? ?????? ?????? //false????? true可以轉成成1
?
isNaN()函數也適用于對象。在調用isNaN()函數過程中,首先會調用valueOf()方法,然后確定返回值是否能夠轉換成數值。如果不能,則基于這個返回值再調用toString()方法,再測試返回值。
var box = {
?????? toString : function () {
?????? ?????? return '123';??? ?????? ?????? //可以改成return 'Alex'查看效果
?????? }
};
alert(isNaN(box));? ?????? ?????? ?????? //false?????
?
有3個函數可以把非數值轉換為數值:Number()、parseInt()和parseFloat()。
Number()函數是轉型函數,可以用于任何數據類型,而另外兩個則專門用于把字符串轉成數值。
alert(Number(true));????? ?????? ?????? //1,Boolean類型的true和false分別轉換成1和0
alert(Number(25)); ?????? ?????? ?????? //25,數值型直接返回
alert(Number(null));????? ?????? ?????? //0,空對象返回0
alert(Number(undefined));??? ?????? //NaN,undefined返回NaN
?
如果是字符串,應該遵循以下規則:
1.只包含數值的字符串,會直接轉成成十進制數值,如果包含前導0,即自動去掉。
alert(Number('456'));???? ?????? ?????? //456
alert(Number('070'));???? ?????? ?????? //70
?
2.只包含浮點數值的字符串,會直接轉成浮點數值,如果包含前導和后導0,即自動去掉。
alert(Number('08.90'));? ?????? ?????? //8.9
?
3.如果字符串是空,那么直接轉成0。
alert(Number(''));?? ?????? ?????? ?????? //0
?
4.如果不是以上三種字符串類型,則返回NaN。
alert(Number('Lee123'));?????? ?????? ?????? ?????? //NaN
?
5.如果是對象,首先會調用valueOf()方法,然后確定返回值是否能夠轉換成數值。如果轉換的結果是NaN,則基于這個返回值再調用toString()方法,再測試返回值。
var box = {
?????? toString : function () {
?????? ?????? return '123';??? ?????? ?????? //可以改成return 'Lee'查看效果
?????? }
};
alert(Number(box));????? ?????? ?????? //123
?
由于Number()函數在轉換字符串時比較復雜且不夠合理,因此在處理整數的時候更常用的是parseInt()。
alert(parsetInt('456Lee'));????? ?????? //456,會返回整數部分
alert(parsetInt('Lee456Lee')); ?????? //NaN,如果第一個不是數值,就返回NaN
alert(parseInt('12Lee56Lee')); ?????? //12,從第一數值開始取,到最后一個連續數值結束
alert(parseInt('56.12'));?? ?????? ?????? //56,小數點不是數值,會被去掉
alert(parseInt(''));??? ?????? ?????? ?????? //NaN,空返回NaN
?
parseInt()除了能夠識別十進制數值,也可以識別八進制和十六進制。
alert(parseInt('0xA'));???? ?????? ?????? //10,十六進制
alert(parseInt('070'));???? ?????? ?????? //56,八進制
alert(parseInt('0xALee'));?????? ?????? //10,十六進制,Lee被自動過濾掉
?
ECMAScript為parseInt()提供了第二個參數,用于解決各種進制的轉換。
alert(parseInt('0xAF'));?? ?????? ?????? //175,十六進制
alert(parseInt('AF',16));? ?????? ?????? //175,第二參數指定十六進制,可以去掉0x前導
alert(parseInt('AF'));????? ?????? ?????? //NaN,理所當然
alert(parseInt('101010101',2));????? //314,二進制轉換
alert(parseInt('70',8))???? ?????? ?????? //56,八進制轉換
?
parseFloat()是用于浮點數值轉換的,和parseInt()一樣,從第一位解析到非浮點數值位置。
alert(parseFloat('123Lee'));??? ?????? //123,去掉不是別的部分
alert(parseFloat('0xA')); ?????? ?????? //0,不認十六進制
alert(parseFloat('123.4.5'));??? ?????? //123.4,只認一個小數點
alert(parseFloat('0123.400')); ?????? //123.4,去掉前后導
alert(parseFloat('1.234e7'));?? ?????? //12340000,把科學技術法轉成普通數值
?
六.String類型
?
String類型用于表示由于零或多個16位Unicode字符組成的字符序列,即字符串。字符串可以由雙引號(")或單引號(')表示。
var box = 'Alex';
var box = "Alex";
?
PS:在某些其他語言(PHP)中,單引號和雙引號表示的字符串解析方式不同,而ECMAScript中,這兩種表示方法沒有任何區別。但要記住的是,必須成對出現,不能穿插使用,否則會出錯。
var box = 'Alex";??? ?????? ?????? ?????? //混合使用,出錯
?
String類型包含了一些特殊的字符字面量,也叫轉義序列。
?
| 字面量 | 含義 |
| \n | 換行 |
| \t | 制表 |
| \b | 空格 |
| \r | 回車 |
| \f | 進紙 |
| \\ | 斜杠 |
| \' | 單引號 |
| \" | 雙引號 |
| \xnn | 以十六進制代碼nn表示的一個字符(0~F)。例:\x41 |
| \unnn | 以十六進制代碼nnn表示的一個Unicode字符(0~F)。例:\u03a3 |
?
?
ECMAScript中的字符串是不可變的,也就是說,字符串一旦創建,它們的值就不能改變。要改變某個變量保存的字符串,首先要銷毀原來的字符串,然后再用另一個包含新值的字符串填充該變量(內部過程)。
var box = 'Mr.';
box = box + ' Lee';
?
toString()方法可以把值轉換成字符串。
var box = 11;
var box = true;
alert(typeof box.toString());
?
toString()方法一般是不需要傳參的,但在數值轉成字符串的時候,可以傳遞進制參數。
var box = 10;
alert(box.toString());???? ?????? ?????? ?????? //10,默認輸出
alert(box.toString(2));?? ?????? ?????? ?????? //1010,二進制輸出
alert(box.toString(8));?? ?????? ?????? ?????? //12,八進制輸出
alert(box.toString(10));? ?????? ?????? ?????? //10,十進制輸出
alert(box.toString(16));? ?????? ?????? ?????? //a,十六進制輸出
?
如果在轉型之前不知道變量是否是null或者undefined的情況下,我們還可以使用轉型函數String(),這個函數能夠將任何類型的值轉換為字符串。
var box = null;
alert(String(box));
?
PS:如果值有toString()方法,則調用該方法并返回相應的結果;如果是null或者undefined,則返回"null"或者"undefined"。
?
?
七.Object類型
?
ECMAScript中的對象其實就是一組數據和功能的集合。對象可以通過執行new操作符后跟要創建的對象類型的名稱來創建。
var box = new Object();
Object()是對象構造,如果對象初始化時不需要傳遞參數,可以不用寫括號,但這種方式我們是不推薦的。
var box = new Object;???? //不推薦!
?
Object()里可以任意傳參,可以傳數值、字符串、布爾值等。而且,還可以進行相應的計算。
var box = new Object(2);??? ?????? ?????? //Object類型,值是2
var age = box + 2;? ?????? ?????? ?????? ?????? //可以和普通變量運算
alert(age);?????? ?????? ?????? ?????? ?????? ?????? //輸出結果,轉型成Number類型了
?
既然可以使用new Object()來表示一個對象,那么我們也可以使用這種new操作符來創建其他類型的對象。
var box = new Number(5);??? ?????? ?????? //new String('Lee')、new Boolean(true)
alert(typeof box);?? ?????? ?????? ?????? ?????? //Object類型
?
PS:面向對象是JavaScript課程的重點,這里我們只是簡單做個介紹。詳見基礎部分其他博客。
?
?
Thank you, MR.LEE!
FOR MY LOVER , CC!?
?
?
?
?
?
轉載于:https://www.cnblogs.com/ttcc/p/3838662.html
總結
以上是生活随笔為你收集整理的JavaScript基础---语言基础(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: X264编码流程详解(转)
- 下一篇: QEMU KVM Libvirt手册(7