讀《JavaScript權威指南》筆記(二)

1.加號運算和比較運算符的區別javascript

對於數字和字符串操做符來講,加號運算符和比較運算符的行爲都有所不一樣,前者更偏心字符串,若是它的其中一個操做數是字符串的話,則進行字符串鏈接操做。而比較運算符則更偏心數字,只有在兩個操做數都是字符串的時候,纔會進行字符串的比較:java

1 + 2        // 加法. 結果是3
"1" + "2"    // 字符串鏈接,結果是"12"
"1" + 2      // 字符串連接,2轉換爲"2",結果是"12"
11 < 3       // 數字的比較,結果爲false
"11" < "3"   // 字符串比較,結果爲true
"11" < 3     // 數字的比較,"11"轉換爲11,結果爲false
"one" < 3    // 數字的比較,"one"轉換爲NaN,結果爲false

2.函數聲明語句正則表達式

函數聲明語句一般出如今JavaScript代碼的最頂層,也能夠嵌套在其餘函數體內。但在嵌套時,函數聲明只能出如今所嵌套函數的頂部。也就是說,函數定義不能出如今if語句、while循環或其餘任何語句中。
和經過var聲明變量同樣,函數定義語句中的函數被顯式地「提早」到了腳本或函數的頂部。所以它們在整個腳本和函數內都是可見的。使用var的話,只有變量聲明提早了——變量的初始化代碼仍然在原來的位置。然而使用函數聲明語句的話,函數名稱和函數體均提早:腳本中的全部函數和函數中全部嵌套的函數都會在當前上下文中其餘代碼以前聲明。也就是說,能夠在聲明一個JavaScript函數以前調用它。數組

3.void操做符函數

javascript:void(0) void是無返回值的操做。在a標籤中,若是href="#",點擊後會回到網頁頂部,javascript:void(0)會沒有任何反應。鼠標移上去時,仍然顯示手指形狀的圖標。spa

4.左值prototype

左值是一個古老的術語,它是指表達式只能出如今賦值運算符的左側,在js中,變量,對象屬性和數組元素均是左值。code

5.delete操做符對象

delete是一元操做符,它用來刪除對象屬性或者數組元素。須要注意的是,刪除屬性或者刪除數組元素不只僅是設置了一個undefined的值。當刪除一個屬性時,這個屬性將再也不存在。blog

6.賦值操做符

賦值操做符的結合性是從右至左,也就是說,若是一個表達式中出現了多個賦值運算符,運算順序是從右到左。所以,能夠經過以下的方式來對多個變量賦值:

i=j=k=0;     //把三個變量初始化爲0

7.&& 和 ||

// 對於p和q取任意值,這兩個等式都永遠成立
!(p && q)=== !p || !q
!(p || q)=== !p && !q

8.instanceof運算符

instanceof運算符但願左操做數是一個對象,右操做數標識對象的類。若是左側的對象是右側類的實例,則表達式返回true;不然返回false。第9章將會講到,JavaScript中對象的類是經過初始化它們的構造函數來定義的。這樣的話,instanceof的右操做數應當是一個函數。好比:

var d = new Date();// 經過Date()構造函數來建立一個新對象
d instanceof Date;   // 計算結果爲true,d是由Date()建立的
d instanceof Object; // 計算結果爲true,全部的對象都是Object的實例
d instanceof Number; // 計算結果爲false,d不是一個Number對象
var a = [1, 2, 3];   // 經過數組直接量的寫法建立一個數組
a instanceof Array;  // 計算結果爲true,a是一個數組
a instanceof Object; // 計算結果爲true,全部的數組都是對象
a instanceof RegExp; // 計算結果爲false,數組不是正則表達式

須要注意的是,全部的對象都是Object的實例。當經過instanceof判斷一個對象是不是一個類的實例的時候,這個判斷也會包含對「父類」(superclass)的檢測。若是instanceof的左操做數不是對象的話,instanceof返回false。若是右操做數不是函數,則拋出一個類型錯誤異常。

爲了理解instanceof運算符是如何工做的,必須首先理解「原型鏈」(prototype chain)。原型鏈做爲JavaScript的繼承機制。爲了計算表達式o instanceof f,JavaScript首先計算f.prototype,而後在原型鏈中查找o,若是找到,那麼o是f(或者f的父類)的一個實例,表達式返回true。若是f.prototype不在o的原型鏈中的話,那麼o就不是f的實例,instanceof返回false。

9.in運算符

in運算符但願它的左操做數是一個字符串或能夠轉換爲字符串,但願它的右操做數是一個對象。若是右側的對象擁有一個名爲左操做數值的屬性名,那麼表達式返回true,例如:

var point = { x:1, y:1 };      // 定義一個對象
"x" in point                   // => true:對象有一個名爲"x"的屬性
"z" in point                   // => false:對象中不存在名爲"z"的屬性
"toString" in point            // => true:對象繼承了toString()方法

var data = [7,8,9];            // 擁有三個元素的數組
"0" in data                    // => true:數組包含元素"0"
1 in data                      // => true:數字轉換爲字符串
3 in data                      // => false:沒有索引爲3的元素

10.return語句

return語句返回函數表達式的計算結果,只能在函數體內出現,若是不是的話會報語法錯誤

11.for in 循環

for in循環對象可枚舉的屬性,能夠循環數組的索引屬性。若是要循環的表達式爲null或者undefined,JavaScirpt解釋器將會跳過循環並執行後續的代碼。若是表達式等於一個原始值,這個原始值將會轉換爲與之對應的包裝對象

12.for循環

for循環中那三個表達式中的任何一個均可以忽略,可是兩個分號必不可少。若是省略test表達式,那麼這將是一個死循環

for(initialize ; test ; increment)
statement
//初始化 檢測 更新

13.switch循環

因爲對每一個case的匹配操做其實是「===」恆等運算符比較,而不是「==」相等運算符比較,所以,表達式和case的匹配並不會作任何類型轉換。

switch(n)
{
case 1:
  執行代碼塊 1
  break;
case 2:
  執行代碼塊 2
  break;
default:
  n 與 case 1case 2 不一樣時執行的代碼
}

14.標識符

JavaScript標識符必須以字母、下劃線(_)或美圓符($)開始。後續的字符能夠是字母、數字、下劃線或美圓符(數字是不容許做爲首字符出現的,以便JavaScript能夠輕易區分開標識符和數字)。

相關文章
相關標籤/搜索