JavaScript基礎(一)後續

Object類型

  • ECMAScript中的對象其實就是一組數據和功能的集合。對象可以通過執行new操作符後跟要創建的對象類型的名稱來創建。而創建Object類型的實例併爲其添加屬性和(或)方法,就可以創建自定義對象,如下所示:
var o = new Object();
  • 這個語法與Java中創建對象的語法相似;但在ECMAScript中,如果不給構造函數傳遞參數,則可以省略後面的一對圓括號。也就是說,在像前面這個示例一樣不傳遞參數的情況下,完全可以省略那對圓括號(但這不是推薦的做法):
var o = new Object(); // 有效,但不推薦省略圓括號
  • 僅僅創建Object的實例並沒有什麼用處,但是關鍵是要理解一個重要的思想: 即在ECMAScript中(就像Java中的java.lang.Object對象一樣)Object類型是所有它的實例的基礎。換句話說,Object類型所具有的任何屬性和方法也同樣存在於更加具體的對象中。
  • Object的每個實例都具有下列屬性和方法。
  • Constructor: 保存着用於創建當前對象的函數。對於前面的例子而言,構造函數(constructor)就是Object()
  • hasOwnProperty(propertyName): 用於檢查給定的屬性在當前對象實例中(而不是在實例的原型中)是否存在。其中,作爲參數的屬性名(propertyName)必須以字符串形式指定(例如: o.hasOwnProperty("name"))。
  • propertyIsEnumerable(propertyName):用於檢查給定的屬性是否能夠使用for-in語句來枚舉。與hasOwnProperty()方法一樣,作爲參數的屬性名必須以字符串形式指定。
  • toLocalString(): 返回對象的字符串表示,該字符串與執行環境的地區對應。
  • toString(): 返回對象的字符串表示。
  • valueOf(): 返回對象的字符串、數值或者布爾值表示。通常與toString()方法返回的返回值相同。
  • 由於在ECMAScript中Object是所有對象的基礎,因此所有對象都具有這些基本的屬性和方法。

題外話:ECMA-262中對象的行爲不一定適用於JavaScript中的其他對象。瀏覽器環境中的對象。比如BOM和DOM中的對象,都屬於宿主對象,因爲它們是由宿主實現提供和定義的。ECMA-262不負責定義宿主對象,因此宿主對象可能會野可能不會繼承Object。


操作符:

  • ECMA-262描述了一組用於操作數據值的操作符,包括算術操作符(如加號和減號)、位操作符、關係操作符和相等操作符。ECMAScript操作符的與衆不同之處在於,它們能夠適用於很多值,例如字符串、數字值、布爾值、甚至對象。不過,在應用於對象時,相應的操作符通常都會調用對象的valueOf()和(或)toString()方法,以便取得可以操作的值。

一元操作符:

  • 只能操作一個值的操作符叫做一元操作符。一元操作符是ECMAScript中最簡單的操作符。

遞增和遞減操作符:

  • 遞增和遞減操作符直接借鑑自C,而且各有兩個版本: 前置型和後置型。顧名思義,前置型應該位於要操作的變量之前,而後置型則應該位於操作的變量之後。因此,在使用前置遞增操作符給一個數值加1時,要把兩個加號(++)放在這個數值變量前面,如下所示:
var age = 29;
++age;
  • 在這個例子中,前置遞增操作符把age的值變成了30(爲29加上了1)。實際上,執行這個前置遞增操作與執行以下操作的效果相同:
var age = 29;
age = age + 1;
  • 執行前置遞減操作的方法也類似,結果會從一個數值中減去1。使用前置遞減操作符時,要把兩個減號(–)放在相應變量的前面,如下所示:
var age = 29;
--age;
  • 這樣,age變量的值就減少爲28(從29中減去1)。
  • 執行前置遞增和遞減操作時,變量的值都是在語句被求值以前改變的。(在計算機科學領域,這種情況通常被稱作副效應。)
var age = 29;
var anotherAge = --age + 2;

alert(age); // 輸出28
alert(anotherAge); // 輸出30
  • 變量anotherAge的初始值等於變量age的值前置遞減之後加2。由於先執行了減法操作,age的值變成了28,所以加上2的結果就是30。
  • 由於前置遞增和遞減操作與執行語句的優先等級相等,因此整個語句會從左至右被求值。再看一個例子:
var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2; // 等於22
var num4 = num1 + num2; // 等於21
  • 這裏僅僅將前置遞減改成了後置遞減,就立即可以看到差別。在前面使用前置遞減的例子中,num3num4最後都等於21。而在這個例子中,num3等於22, num4等於21。差別的根源在於,這裏在計算num3時使用了num1的原始值(2)完成了加法計算,而num4則使用了遞減後的值(1)。
  • 所有這4個操作符對任何值都適用。也就是它們不僅適用於整數,還可以用於字符串、布爾值、浮點數值和對象。在應用於不同的值時,遞減和遞減操作符遵循下列規則。
    • 在應用於一個包含有效數字字符的字符串時,先將其轉換爲數字值,再執行加減1的操作。字符串變量變成數值變量。
    • 在應用一個不包含有效數字字符的字符串時,將變量的值設置爲NaN。字符串變量變成數值變量。
    • 在應用於布爾值false時,先將其轉換爲0然後在執行加減1的操作。布爾值變量變成數值變量。
    • 在應用於布爾值true時,先將其轉換爲1再執行加減1的操作。布爾值變量變成數值變量。
    • 在應用於浮點數值時,執行加減1的操作。
    • 在應用於對象時,先調用對象的valueOf()方法以取得一個可供操作的值。然後對該值應用前述規則。如果結果是NaN,則在調用toString()方法後再應用前述規則。對象變量變成數值變量。
  • 以下示例展示了上面的一些規則:
var s1 = "2";
var s2 = "z";
var b = false;
var f = 1.1;
var o = {
    valueOf: function() {
        return -1;
    }
};

s1++; // 值變成數值3
s2++; // 值變成NaN
b++; // 值變成數值1
f--; // 值變成0.10000000000000009(由於浮點舍入錯誤所致)
o--; // 值變成數值-2

一元加和減操作符

  • 絕大多數開發人員對一元加和減操作符都不會陌生,而且這兩個ECMAScript操作符的作用與數學書上講的完全一樣。一元加操作符以一個加號(+)表示,放在數值前面,對數值不會產生任何影響,如下面的例子所示:
var num = 25;
num = +num; // 仍然是25
  • 不過,在對非數值應用一元加操作符時,該操作符會像Number()轉型函數一樣對這個值執行轉換。換句話說,布爾值falsetrue將被轉換爲0和1,字符串值會被按照一組特殊的規則進行解析,而對象是先調用它們的valueOf()和(或)toString()方法,再轉換得到的值。
  • 下面的例子展示了對不同數據類型應用一元加操作符的結果:
var s1 = "01";
var s2 = "1.1";
var s3 = "z";
var b = false;
var f = 1.1;
var o = {
    valueOf: function() {
        return -1;
    }
};

s1 = +s1; // 值變成數值1
s2 = +s2; // 值變成數值1.1
s3 = +s3; // 值變成NaN
b = +b; // 值變成數值0
f = +f; // 值未變,仍然是1.1
o = +c; // 值變成數值-1
  • 一元減操作符主要用於表示負數,例如將1轉換成-1。下面的例子演示了這個簡單的轉換過程:
var num = 25;
num = -num; // 變成了-25
  • 在將一元減操作符應用於數值時,該值會變成負數(如上面的例子所示)。而當應用於非數值時,一元減操作符遵循與一元加操作符相同的規則,最後再將得到的數值轉換爲負數,如下面的例子所示:
var s1 = "01";
var s2 = "1.1";
var s3 = "z";
var b = false;
var f = 1.1;
var o = {
    valueOf: function() {
        return -1;
    }
};

s1 = -s1; // 值變成數值-1
s2 = -s2; // 值變成數值-1.1
s3 = -s3; // 值變成NaN
b = -b; // 值變成數值0
f = -f; // 值未變,仍然是-1.1
o = -c; // 值變成了數值1
  • 一元加和減操作符主要用於基本的算術運算,也可以像前面示例所展示的一樣用於轉換數據類型。

JackDan Thinking

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章