javascript
javascript之基本概念
為什么80%的碼農都做不了架構師?>>> ??
1. 語法
1.1 匹配大小寫
javascript中的一切——變量,函數名和操作符——都是區分大小寫的。
1.2 標識符
標識符就是指變量,函數,屬性的名字,或者函數的參數。命名規則與java一樣。
1.3 語句
javascript中的語句以一個分號結束。當然也可以省略分號,如果省略分號,則由解析器確定語句的結尾,我們推薦使用分號結尾。
2. 關鍵字和保留字
2.1 關鍵字
| 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 |
2.2 保留字
| 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 |
3. 變量
定義變量時要使用var操作符,后跟變量名,如下所示:
var?message;該變量可以用來保存任何值(像這樣未經過初始化的變量,會保存一個特殊的值:undefined)。有一點必須注意,即使用var操作符定義的變量將成為定義該變量的作用域中的局部變量。如果省略了var操作符,從而創建的是一個全局變量。
可以用一條語句定義多個變量,只要像下面這樣把每個變量(初始化或不初始化均可)用逗號分隔開即可。
var?message?=?"hi",found?=?false,?age?=?29;4. 數據類型
javascript中有5種簡單數據類型(基本數據類型):Undefined,Null,Boolean,Number和String。還有一種復雜數據類型——Object,Object本質上是由一組無序的名值對組成的。javascript不支持任何創建自定義類型的機制,而所有值最終都將是上述6種數據類型之一。
4.1 typeof操作符
typeof用來檢測給定變量的數據類型。typeof操作符可能返回下列某個字符串:
"undefined"——如果這個值未定義
"boolean"——如果這個值是布爾值
"string"——如果這個值是字符串
"number"——如果這個值是數值
"object"——如果這個值是對象或Null
"function"——如果這個值是函數
如例:
var?message?=?"some?string"; alert(typeof?message)4.2 Undefined類型
Undefined類型只有一個值,即特殊的undefined。在使用var聲明變量但未對其加以初始化時,這個變量的值就是undefined,如例:
var?message; alert(message?==?undefined);????????//true4.3 Null類型
Null類型是第二個只有一個值的數據類型,這個特殊的值是null。從邏輯角度來看,null值表示一個空對象指針,而這也正是使用typeof操作符檢測null值時會返回“object”的原因:
var?car?=?null; alert(typeof?car);????????//"object"如果定義的變量準備在將來用于保存對象,那么最好將該變量初始化為null而不是其他值。這樣一來,只要直接檢查null值就可以知道相應的變量是否已經保存了一個對象的引用了。實際上,undefined值派生自null值的,因此它們的相等性測試要返回true:
alert(null?==?undefined);?????????//true盡管null和undefined有這樣的關系,但它們的用途完全不同。無論在什么情況下都沒有必要把一個變量的值顯式地設置為undefined,可是同樣的規則對null卻不適用。只要意在保存對象的變量還沒有真正保存對象,就應該明確地讓該變量保存null值。這樣做不僅可以體現null作為空對象指針的慣例,而且也有助于進一步區分null和undefined。
4.4 Boolean類型
Boolean類型只有兩個字面值:true和false。示例:
var?found?=?true; var?lost?=?false;雖然Boolean類型的字面值只有兩個,但javascript中所有類型的值都有與這兩個Boolean值等價的值。要將一個值轉換為其對應的Boolean值,可以調用轉型函數Boolean(),如下所示:
var?message?=?"Hello?world!"; var?messageAsBoolean?=?Boolean(message);在這個例子中,字符串message被轉換成了一個Boolean值。可以對任何數據類型的值調用Boolean()函數,而且總會返回一個Boolean值,至于返回的這個值是true還是false,取決于要轉換值的數據類型及其實際值:
| 數據類型 | 轉換為true的值 | 轉換為false的值 |
| Boolean | true | false |
| String | 任何非空字符串 | ""(空字符串) |
| Number | 任何非零數字值(包含無窮大) | 0和NaN |
| Object | 任何對象 | null |
| Undefined | 不適用 | undefined |
這些轉換規則對理解流控制語句(如if語句)自動執行相應的Boolean轉換非常重要:
var?message?=?"Hello?world!"; if(message){alert("value?is?true"); }4.5 Number類型
最基本的數值字面量格式是十進制整數,如:
var?intNum?=?55;????????//整數除了十進制表示外,整數還可以通過八進制或十六進制的字面值來表示。浮點數略,關于浮點數值計算會產生舍入誤差的問題,有一點需要明確:這是使用基于IEEE754數值的浮點計算的通病,并非獨此一家;
關于NaN,它即非數值(Not a Number),是一個特殊的數值。這個數值用于表示一個本來要返回數值的操作數未返回數值的情況(這樣就不會拋出錯誤了)。例如,在其他編程語言中,任何數值除以0都會導致錯誤,從而停止代碼執行。但在javascript中,任何數值除以0會返回NaN,因此不會影響其他代碼的執行。NaN本身有兩個非同尋常的特點。首先,任何涉及NaN的操作(例如NaN/10)都會返回NaN。其次,NaN與任何值都不相等,包括NaN本身。例如:
alert(NaN?==?NaN);????????//false針對NaN的這兩個特點,javascript定義了isNaN()函數。這個函數接受一參數,該參數可以是任何類型,而函數會幫我們確定這個參數是否“不是數值”。isNaN()在接收到一個值之后,會嘗試將這個值轉換為數值:
alert(isNaN(NaN));????????????????//true alert(isNaN(10));????????????????????//false alert(isNaN("10"));????????????????//false(可以被轉換成數值10) alert(isNaN("blue"));????????????//true alert(isNaN(true));????????????????//false(可以被轉換成數值1)數值轉換,有3個函數可以把非數值轉換為數值:Number(),parseInt(),parseFloat()。第一個函數,即轉型函數Number()可以用于任何數據類型,而另兩個函數則專門用于把字符串轉換成數值。這三個函數對于同樣的輸入會有返回不同的結果。Number()函數的轉換規則如下:
如果是Boolean值,true和false將分別被轉換為1和0;
如果是數字值,只是簡單的傳入和返回;
如果是null值,返回0;
如果是undefined,返回NaN;
如果是字符串,遵循下列規則:1如果字符串只包含數字,則將其轉換為十進制數值。2如果字符串中包含有效的浮點格式,則將其轉換為對應的浮點數值。3如果字符串包含有效的十六進制格式,則將其轉換為相同大小的十進制整數。4如果字符串是空(不包括任何字符),則將其轉換為0。5 如果字符串中包含除上述格式之外的字符,則將其轉換為NaN。
由于Number()函數在轉換字符串時比較復雜而且不夠合理,因此在處理整數的時候更常用parseInt()函數。parseInt()與parseFloat()這里就不過多解釋了,要用就百度下。
4.6 String類型
String類型用于表示由零或多個16位Unicode字符組成的字符序列,即字符串。字符串可以由雙引號("")或單引號('')表示:
var?firstname?=?"Nicholas"; var?lastName?=?'zakas';把一個值轉換為一個字符串有兩種方式。第一種是使用幾乎每個值都有的toString()方法。這個方法唯一要做的就是返回相應值的字符串表現。
var?age?=?11; var?ageAsString?=?age.toString();????????????//字符串"11" var?found?=?true; var?foundAsString?=?found.toString();????????//字符串"true"但null和undefined值沒有這個方法。在不知道要轉換的值是不是null或undefined的情況下,還可以使用轉型函數String(),這個函數能夠將任何類型的值轉換為字符串。String()函數遵循下列轉換規則:
如果值有toString()方法,則調用該方法并返回相應的結果;
如果值是null,則返回"null";
如果值是undefined,則返回“undefined”。
4.7 Object類型
javascript中的對象其實就是一組數據和功能的集合。對象可以通過new操作符后跟要創建的對象類型的名稱來創建。而創建Object類型的實例并為其添加屬性和(或)方法,就可以創建自定義對象,如下所示:
var?o?=?new?Object();這個語法與java中創建對象的語法相似,但在javascript中,如果不給構造函數傳遞參數,則可以省略后面那一對圓括號。不過不推薦這樣做。在javascript中,Object類型是所有它的實例的基礎,Object類型所具有的任何屬性和方法也同樣存在于更具體的對象中。Object的每個實例都具有下列屬性和方法:
constructor——保存著用于創建當前對象的函數。對于前面的例子而言,構造函數就是Object()。
hasOwnProperty(propertyName)——用于檢查給定的屬性在當前對象實例中(而不是在實例的原型中)是否存在。其中,作為參數的屬性名必須以字符串形式指定,如:o.hasOwnProperty("name");
isPrototypeOf(object)——用于檢查傳入的對象是否是另一個對象的原型。
propertyIsEnumerable(propertyName)——用于檢查給定的屬性是否能夠使用for-in語句來枚舉。與hasOwnProperty()方法一樣,作為參數的屬性名必須以字符串形式指定。
toString()——返回對象的字符串表示。
valueOf()——返回對象的字符串,數值或布爾值表示。通常與toString()方法的返回值相同。
5. 操作數
其它的不講了,這里只說一下布爾操作符,相等操作符
5.1 邏輯非(!)
邏輯非操作符由一個嘆號!表示,可以應用于javascript中的任何值。無論這個值是什么數據類型,這個操作符都會返回一個布爾值。邏輯非操作符遵循下列規則:
如果操作數是一個對象,返回false.
如果操作數是一個空字符串,返回true
如果操作數是一個非空字符串,返回false
如果操作數是0,返回true
如果操作數是任意非0數值,返回false.
如果操作數是null,返回true
如果操作數是NaN,返回true
如果操作數是undefined,返回true
邏輯非操作符也可以用于將一個值轉換為與其對應的布爾值。而同時使用兩個邏輯非操作符,實際上就會模擬Boolean()轉型函數的行為:
alert(!!"blue");????????????//true alert(!!NaN);????????????????//false5.2 邏輯與
邏輯與操作符由兩個和號(&&)表示,有兩個操作數,示例:
var?result?=?true?&&?false;邏輯與操作屬于短路操作,即如果第一個操作數能夠決定結果,那么就不會再對第二個操作數求值。
邏輯與操作可以應用于任何類型的操作數,而不僅僅是布爾值。在有一個操作數不是布爾值的情況下,邏輯與操作就不一定返回布爾值;此時,它遵循下列規則:
如果第一個操作數是對象,則返回第二個操作數
如果第二個操作數是對象,則只有在第一個操作數的求值結果為true的情況下才會返回該對象
如果兩個操作數都是對象,則返回第二個操作數。
如果有一個操作數是null,則返回null
如果有一個操作數是NaN,則返回NaN
如果有一個操作數是undefined,則返回undefined
5.3 邏輯或
邏輯或操作符由兩個豎線符號(||)表示,有兩個操作數。
var?result?=?true?||?false;與邏輯與操作符相似,邏輯或操作符也是短路操作符。邏輯或也可以應用于任何類型的操作數,如果有一個操作數不是布爾值,邏輯或也不一定返回布爾值:
如果第一個操作數是對象,則返回第一個操作數
如果第一個操作數的求值結果為false,則返回第二個操作數
如果兩個操作數都是對象,則返回第一個操作數
如果兩個操作數都是null,則返回null
如果兩個操作數都是NaN,則返回NaN
如果兩個操作數都是undefined,則返回undefined
5.4 相等操作數
相等和不相等:javascript中的相等操作符由兩個等于號(==)表示,如果兩個操作數相等,則返回true。而不相等操作符由嘆號后跟等于號(!=)表示,如果兩個操作數不相等,則返回true。這兩個操作符都會先轉換操作數(通常稱為強制轉型),然后再比較它們的相等性。在轉換不同的數據類型時,相等和不相等操作符遵循下列基本規則:
如果有一個操作數是布爾值,則在比較相等性之前先將其轉換為數值——false轉換為0,而true轉換為1。
如果一個操作數是字符串,另一個操作數是數值,在比較相等性之前先將字符串轉換為數值。
如果一個操作數是對象,另一個操作數不是,則調用對象的valueOf()方法,用得到的原始值按照前面的規則進行比較
這兩個操作符在進行比較時則要遵循下列規則:
null和undefined是相等的
要比較相等性之前,不能將null和undefined轉換成其他任何值
如果有一個操作數是NaN,則相等操作符返回false,而不相等操作符返回true。重要提示:即使兩個操作數都是NaN,相等操作符也返回false,因為按照規則,NaN不等于NaN。
如果兩個操作數都是對象,則比較它們是不是同一個對象。如果兩個操作數都指向同一個對象,則相等操作符返回true,否則返回false。
下表列出了一些特殊情況及比較結果:
| 表達式 | 值 | 表達式 | 值 |
| null == undefined | true | true == 1 | true |
| "NaN" == NaN | false | true == 2 | false |
| 5 == NaN | false | undefined == 0 | false |
| NaN == NaN | false | null == 0 | false |
| NaN != NaN | true | "5" = 5 | true |
| false == 0 | true |
全等和不全等:除了在比較之前不轉換操作數之外,全等和不全等操作符與相等和不相等操作符沒有什么區別。全等操作符由3個等于號(===)表示,它只在兩個操作數未經轉換就相等的情況下返回true,如例:
var?result1?=?("55"?==?55);????????????//true,因為轉換后相等 var?result2?=?("55"?===?55);??????????//false,因為不同的數據類型不相等不全等操作符由一個嘆號后跟兩個等于號(!==)表示,它在兩個操作數未經轉換就不相等的情況下返回true。例如:
var?result1?=?("55"?!=?55);????????????????//false,因為轉換后相等 var?result2?=?("55"?!==?55);??????????????//true,因為不同的數據類型不相等由于相等和不相等操作符存在類型轉換問題,而為了保持代碼中數據類型的完整性,我們推薦使用全等和不全等操作符。
6. 語句
6.1 if語句
if語句的語法,示例如下:
var?i?=?24; if(i?>?25)alert("Greater??than?25.?");?????????????????????????????//單行語句 else?{alert("Less?than?or?equal?to?25.?");????????????????//代碼塊中的語句 }6.2 do-while語句
do-while語句是一種后測試循環語句,即只有在循環體中的代碼執行之后,才會測試出口條件。在對條件表達式求值之前,循環體內的代碼至少會被執行一次。
var?i?=?0; do{i?+=?2; }while(i?<?10);6.3 while語句
while語句屬于前測試循環語句,在循環體內的代碼被執行之前,就會對出口條件求值。因此,循環體內的代碼有可能永遠不會被執行。
var?i?=?0; while(i?<?10){i?+=?2; }6.4 for語句
for語句也是一種前測試循環語句,但它具有在執行循環之前初始化變量和定義循環后要執行的代碼的能力。
for(var?i=0;i<count;i++){alert(i); }6.5 for-in語句
for-in語句是一種精準的迭代語句,可以用來枚舉對象的屬性。示例:
for(var?propName?in?window){document.write(propName);document.write("<br/>"); }6.6 label語句
使用label語句可以在代碼中添加標簽,以便將來使用(類似java中代標簽的for)。示例:
start:?for(var?i=0;?i<count;?i++){alert(i); }這個例子中定義的start標簽可以在將來由break或continue語句引用。加標簽的語句一般都要與for語句等循環語句配合使用。
6.7 break和continue語句
break和continue語句用于在循環中精確地控制代碼的執行。其中,break語句會立即退出循環,強制繼續執行循環后的語句。而continue語句雖然也是立即退出循環,但退出循環后會從循環的頂部繼續執行。
for(var?i=0;i<10;i++){if(i?%?5?==?0){break;} } for(var?i=0;i<10;i++){if(i?%?5?==?0){continue;} }6.8 with語句
with語句的作用是將代碼的作用域設置到一個特定的對象中,with語句的語句如下:
with(expression) atatement
定義with語句的目的主要是為了簡化多次編寫同一個對象的工作。如下示例:
var?qs?=?location.search.substring(1); var?hostName?=?location.hostname; var?url?=?location.href;上面幾行代碼都包含location對象。如果使用with語句,可以把上面的代碼改寫成:
with(location){var?qs?=?search.substring(1);var?hostName?=?hostname;var?rul?=?href; }在重寫后的例子中,使用with語句關聯了location對象。這意味著在with語句的代碼塊內部,每個變量首先被認為是一個局部變量,而如果在局部環境中找不到該變量的定義,就會查找location對象中是否有同名的屬性。如果發現了同名屬性,則以location對象屬性的值作為變量的值。注:由于大量使用with語句會導致性能下降,同時也會給調試代碼造成困難,因此在開發大型應用程序時,不建議使用with語句。
6.9 switch語句
switch語句與if語句的關系最為密切,而且也是在其他語言中普遍使用的一種流控制語句:
var?i?=?25; switch(i){case?25:??/*合并兩種情形*/case?35:?alert("25?or?35");?break;case:45:?alert("45");break;default:?alert("Other"); }7. 函數
javascript中的函數使用function關鍵字來聲明,后跟一組參數以及函數體。示例:
function?sayHi(name,?message){alert("Hello?"?+?name?+?","?+?message); }這個函數可以通過其函數名來調用,后面還要加上一對圓括號和參數(圓括號中的參數如果有多個,可以用逗號隔開)。調用sayHi函數的代碼如下:
sayHi("Nicholas","how?are?you?today?");javascript中的函數在定義時不必指定是否返回值。實際上,任何函數在任何時候都可以通過return語句后跟要返回的值來實現返回值。示例:
function?sum(num1,?num2){return?num1?+?num2; }另外,return語句也可以不帶有任何返回值。在這種情況下,函數在停止執行后將返回undefined值。
7.1 理解參數
javascript函數的參數與大多數其他語言中函數的參數有所不同。javascript函數不介意傳遞進來多少個參數,也不在乎傳進來參數是什么數據類型。也就是說,即使你定義的函數只接收兩個參數,在調用這個函數時也未必一定要傳遞兩個參數。可以傳遞一個,三個甚至不傳遞參數,而解析器永遠不會有什么怨言。之后以會這樣,原因是javascript中的參數在內部是用一個數組來表示的。函數接收到的始終都是數組,而不關心數組中包含哪些參數(如果有參數的話)。如果這個數組中不包含任何元素,無所謂;如果包含多個元素,也沒有問題。實際上,在函數體內可以通過arguments對象來訪問這個參數數組,從而獲取傳遞給函數的每一個參數。
其實,arguments對象只是與數組類似(它不是Array的實例),因為可以使用方括號語法訪問它的每一個元素(即每一個元素是arguments[0],第二個元素是arguments[1],以此類推),使用length屬性來確定傳遞進來多少個參數。在前面的例子中,sayHi()函數的第一個參數的名字叫name,而該參數的值也可以通過訪問arguments[0]來獲取:
function?sayHi(){alert("Hello?"?+?arguments[0]?+?".?"?+?arguments[1]); }這個重寫后的函數中不包含命名的參數,雖然沒有使用name和message標識符,但函數的功能依舊。這個事實說明了javascript函數的一個重要特點: 命名的參數只提供便利,但不是必需的。另外,在命名參數方面,其它語言可能需要事先創建一個函數簽名,而將來的調用必須與該簽名一致。但在javascript中,沒有這些條條框框,解析器不會驗證命名參數。
關于參數還要記住最后一點:沒有傳遞值的命名參數將自動被賦于undefined值。
7.2 沒有重載
javascript函數不能像傳統意義上那樣實現重載。而在其他語言(如java)中,可以為一個函數編寫兩個定義,只要這兩個定義的簽名不同即可。javascript函數沒有簽名,因為其參數是由包含零或多個值的數組來表示的。如果在javascript中定義了兩個名字相同的函數,則該名字只屬于后定義的函數:
function?addSomeNumber(num){return?name?+?100; } function?addSomeNumber(num){return?num?+?200; } var?result?=?addSomeNumber(100);????????//300轉載于:https://my.oschina.net/fhd/blog/396242
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的javascript之基本概念的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: redis transaction和co
- 下一篇: win7开启休眠功能