javascript之基本概念

1. 語法javascript

1.1 匹配大小寫java

javascript中的一切——變量,函數名和操做符——都是區分大小寫的。express

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 保留字this

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);        //true

4.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

alert(!false);        //true
alert(!0);            //true

邏輯非操做符也能夠用於將一個值轉換爲與其對應的布爾值。而同時使用兩個邏輯非操做符,實際上就會模擬Boolean()轉型函數的行爲:

alert(!!"blue");            //true
alert(!!NaN);                //false

5.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
相關文章
相關標籤/搜索