javascript高級程序設計

第一章

1.注意標籤中的

function sayScript(){
    alert('<\/script>');//  如果這樣寫會報錯“alert('</script>')”
}

第三章

3.12 標識符

所謂標識符,就是指變量、函數、屬性的名字,或者函數的參數。標識符可以是按照下列格式規則組合起來的一個或多個字符:

(1)每一個字符必須是字母、下劃線(_)或者一個美元符號($);
(2)其他字符可以是字母、下劃線、美元符號或數字。
標識符中的字母也可以包含擴展的ASCII或Unicode字母字符(如さ和し),但我們不推薦這樣做。
ECMAScript標識符采用駝峯大小寫格式,也就是第一個字母小寫,剩下的每個有意義的單詞的首字母大寫,

    eg:
    firsetSecond、myCar、doSomethingImportant

3.4 數據類型

基本數據類型:UndefinedNull、Boolean、NumberString

3.4.3 null 類型

alert(null == undefined); //true

3.4.4Boolean類型

數據類型 轉換爲true的值 轉換爲false的值
Boolean true false
String 任何非空字符串 “”(空字符串)
Number 任何非零數字值(包括無窮大) 0和NaN
Object 任何對象 null
Undefined n/a Undefined

3.45 Number類型

1.浮點數數值

var floatNum = 3.125e7//等於31250000
var floatNum = 3e-7//等於0.0000003

浮點數的計算要注意:0.1+0.2的結果不是0.3
所以不要做這樣的測試
if(a + b == 0.3){
    alert(You got 0.3);
}

2.數值範圍
最小值:Number.MIN_VALUE(在大多數瀏覽器中,這個值是5e-324)
最大值:Number.MAX_VALUE(在大多數瀏覽器中,這個值是1.7976931348623157e+308)
如果某次計算的結果超過這個最大值,或者低於這個最小值,那麼這個值是正數,則會轉正Infinity(正無窮),如果這個值是負數,則會轉正-Infinity(負無窮)
如果想確定這個值是不是有窮的,則可以使用isFinite()函數。這個函數在參數位於最小與最大值之前時會返回true,如下面的例子:

    var result = Number.MAX_VALUE+ Number.MAX_VALUE;
    alert(isFinite(result)); //false

特殊:訪問Number.NEGATIVE_INFINITY和Number.POSITIVE_INFINITY也可以得到負和正的Infinity的值。可以想見,這兩個屬性中分別保存着-Infinity和Infinity。

4.數值轉換
有3個函數可以把非數值轉換爲數值:Number()、parseInt()、parseFloat()。
Number()函數的轉換規則如下。
∏如果是Boolean值,true和false將分別被轉換爲1和0。
∏如果是數字值,只是簡單的傳入和返回。
∏如果是null值,返回0。
∏如果是undefined,返回NaN。
∏如果是字符串,遵循下列規則:
∏如果是字符串,遵循下列規則:
▆如果字符串中數字(包括前面帶正號或負號的情況),則將其轉換爲十進制數值,即“1”會變成1,“123”會變成123,而“011”會變成11(注意:前導的零被忽略了);
▆如果字符串中包含有效的浮點格式,如“1.1”,則將其轉換爲對應的浮點數值(同樣,也會忽略前導零);
▆如果字符串中包含有效的十六進制格式,例如“0xf”,則將其轉換爲相同大小的十進制整數值;
▆如果字符串是空的(不包含任何字符),則將其轉換爲0;
▆如果字符串中包含除上述格式之外的字符,則將其轉換爲NaN。
∏如果是對象,則調用對象的valueOf()方法,然後依照前面的規則轉換返回的值。如果轉換的結果是NaN,則調用對象的toString()方法,然後再次依照前面的規則轉換返回的字符串值。

    eg:
        var num1 = Number("Hello world!"); //NaN
        var num2 = Number("");             //0
        var num3 = Number("000011");       //11
        var num4 = Number(true);           //1

parseInt():在轉換字符串時,更多的是看其是否符合數值模式。它會忽略字符串前面的空格,直至找到一個非空格字符。如果第一個字符不是數字字符或者負號,parseInt()會返回NaN;也就是說,parseInt()轉換空字符串會返回NaN,而用Number()對空字符串返回0.如果第一個字符是數字字符,parseInt()會繼續解析第二個字符,直到解析完所有的字符或者遇到了一個非數字字符。例如,”1234blue”會被轉換爲1234,因爲“blue”會被完全忽略,類似的,“22.5”會被轉換爲22,因爲小數點並不是有效的數字字符。
如果字符串中的第一個字符是數字字符,parseInt()也能識別各種整數格式(即十進制、八進制和十六進制數)。也就是說,如果字符串以“0x”開頭且後面跟數字字符,就會將其作一個十六進制數;如果字符串以“0”開頭且後面跟數字字符,則會將其當作一個八進制數來解析。

    eg:
        var num1 = parseInt("1234blue");       //1234
        var num2 = parseInt("");               //NaN
        var num3 = parseInt("0xA");            //10(十六進制數)
        var num4 = parseInt(22.5);             //22
        var num5 = parseInt("070");            //56(八進制數)最好不要用這個,因爲在ECMAScript3中認爲是56(八進制),而在ECMAScript5中認爲是0(十進制)
        var num7 = parseInt("0xf");            //15(十六進制數)

爲了消除在使用parseInt()函數時可能導致的上述困惑,可以爲這個函數提供第二個參數:轉換時使用的基數(即多少進制)。如果知道要解析的值是十六進制格式的字符串,那麼指定基數16作爲第二個參數,可以保證得到正確的結果,

    eg:
        var num = parseInt("0xAF", 16);   //175
        實際上,如果指定了16作爲第二個參數,字符串可以不加前面的“0x”,如下例子:
        var num1 = parseInt("AF", 16);    //175
        var num2 = parseInt("AF");        //NaN
    指定基數會影響到轉換的輸出結果。
    eg:
        var num1 = parseInt("10", 2);          //2(按二進制解析)
        var num2 = parseInt("10", 8);          //8(按八進制解析)
        var num3 = parseInt("10", 10);         //10(按十進制解析)
        var num4 = parseInt("10", 16);         //16(按十六進制解析)
parseFloat()與parseInt()函數類似,parseFloat()也是從第一個字符(位置爲0)開始解析每個字符。而且也是一走解析到字符串尾,或者解析到遇到一個無效的浮點數數字字符爲止。也就是說,字符串中的第一個小數點是有效的,而第二個小數點就是無效的了,因此它後面的字符串將被忽略。舉例來說,“22.34.5”將會轉換爲22.34。
除了第一個小數點有效外,parseFloat()與parseInt()的第二個區別在於它始終都會忽略前導零。parseFloat()可以識別前面討論過的所有浮點數格式,也包括十進制整數格式。但十六進制格式的字符串則始終會轉換成0。由於parseFloat()只解析十進制值,因爲它沒有用到第二個參數指定基數的用法。最後一點要注意:如果字符串包含的是一個可解析爲整數的數(沒有小數點,或者小數點後都是零),parseFloat()會返回整數。以下是使用parseFloat()轉換數值的幾個典型示例。
    eg:
        var num1 = parseFloat("1234blue");      //1234(整數)
        var num2 = parseFloat("0xA");           //0
        var num3 = parseFloat("22.5");          //22.5
        var num4 = parseFloat("22.34.5");       //22.34
        var num5 = parseFloat("0908.5");        //908.5
        var num6 = parseFloat("3.125e7");       //31250000

3.46 String類型
String類型用於由零或多個16位Unicode字符組成的字符序列,即字符串。

字面量 含義
\n 換行
\t 製表
\b 空格
\r 回車
\|斜槓
\’ 單引號(‘),在用單引號表示的字符串中使用。例如:\’hey.\’
\” 雙引號(“),在用雙引號表示的字符串中使用。例如:He said,\”hey.\”
\xnn 以十六進制代碼nn表示的一個字符(其中n爲0~F)。例如,\x41表示“A”
\unnn 以十六進制代碼nnnn表示的一個Unicode字符(其中n爲0~F)。例如,\u03a3表示希臘字符Σ

3.轉換爲字符串

 eg:
    var age = 11;
    var ageAsString = age.toString();              //字符串“11”
    var found = true;     
    var foundAsString = found.toString();          //字符串“true”
數值、布爾值、對象和字符串值都有toString()方法,但是null和undefined值沒有這個方法。
    eg:
        var num = 10;
        alert(num.toString());               //“10”
        alert(num.toString(2));              //“1010”
        alert(num.toString(8));              //“12”
        alert(num.toString(10));             //“10”
        alert(num.toString(16));             //“a”
在不知道要轉換的值是不是null或undefined的情況下,還可以使用轉型函數String(),這個函數能將任何類型的值轉換爲字符串。String()函數遵循下列轉換原則:
∏如果值有toString()方法,則調用該方法(沒有參數)並返回相應的結果;
∏如果值是null,則返回“null”;
∏如果值是undefined,則返回“undefined”
    eg:
        var value1 = 10;
        var value2 = true;
        var value3 = null;
        var value4;

        alert(String(value1));       //“10”
        alert(String(value2));       //“true”
        alert(String(value3));       //“null”
        alert(String(value4));       //“undefined”

3.5.1一元操作符

    eg:
        var num1 = 2;
        var num2 = 20;
        var num3 = num1-- + num2;    //等於22
        var num4 = num1 + num2;      //等於21
    eg:
        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

for對應while

for(;;){//無限循環
    doSomething();
}

//只給出控制表達式實際上就把for循環轉換成了while循環
var count = 10;
var i = 0;
for(; i<count; ){
    alert(i);
    i++;
}

正則表達式

var mathces = pattern2.exec(text);
console.log("matches.index:" + matches.index);
console.log("matches[0]:" + matches[0]);
console.log("patter2.lastIndex:" + pattern2.lastIndex);
var person = {};
Object.defineProperty(person, "name", {
    writable: false,
    value: "Nicholas"
});

alert("person.name:" + person.name);
person.name = "Greg";
alert(person.name);
//輸出結果爲:
//"Nicholas"
//"Nicholas"

判斷函數對象是否處於原型中

function Person(){
}

Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function(){
    alert(this.name);
}

var person1 = new Person();
var person2 = new Person();

person1.name = "Greg";
alert(hasPrototypeProperty(person1, "name"));//false
alert(hasPrototypeProperty(person2, "name"));//true

function hasPrototypeProperty(object, name){
    return !object.hasOwnProperty(name) && (name in object);
}

不使用for in遍歷函數對象

function Person(){
}

Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function(){
    alert(this.name);
}

var keys = Object.keys(Person.prototype);
alert("keys:" + keys);//"keys:name,age,job,sayName"

var p1 = new Person();
p1.name = "Rob";
p1.age = 31;
var p1keys = Object.keys(p1);
alert(p1keys);//"name,age"
var book = {
    _year: 2004,
    edition: 1
};

Object.defineProperty(book, "year", {
    get: function(){
        return this._year;
    },
    set: function(newValue){
        if(newValue > 2004){
            this._year = newValue;
            this.edition += newValue - 2004;
        }
    }
});

book.year = 2005;
alert(book.edition);
//輸出結果 2

===============================================================

var book = {};

Object.defineProperties(book, {
    _year: {
        value: 2004
    },

    edition: {
        value: 1
    },

    year: {
        get: function(){
            return this._year;
        },
        set: function(newValue){
            if(newValue > 2004){
                this._year = newValue;
                this.edition += newValue - 2004;
            }
        }
    }
});

var descriptor = Object.getOwnPropertyDescriptor(book, "_year");
alert(descriptor.value);//2004
alert(descriptor.configurable);//false
alert(typeof descriptor.get);//"undefined"
alert(descriptor.value);//2004
alert(descriptor.enumerable);//false
alert(typeof descriptor.get);"undefined"

==============================================================

function createPerson(name, age, job){
    var o = new Object();
        o.name = name;
        o.age = age;
        o.job = job;
        return o;
}

var person1 = createPerson("Nicholas", 29, "Software Engineer");
var person2 = createPerson("Greg", 27, "Doctor");
console.log("person1:" + JSON.stringify(person1));//person1:{"name":"Nicholas","age":29,"job":"Software Engineer"}
console.log("person2:" + JSON.stringify(person2));//person2:{"name":"Greg","age":27,"job":"Doctor"}

==============================================================

function Person(name, age, job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function(){
        alert(this.name);
    }
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");
alert(person1.constructor == Person);//true
alert(person2.constructor == Person);//true

==============================================================

function Person(name, age, job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function(){
        alert(this.name);
    }
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");
alert(person1 instanceof Object);//true
alert(person1 instanceof Person);//true
alert(person2 instanceof Object);//true
alert(person2 instanceof Person);//true

==============================================================

function Person(name, age, job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function(){
        alert(this.name);
    }
}
var person = new Person("Nicholas", 29, "Software Engineer");
    person.sayName();//Nicholas

Person("Greg", 27, "Doctor");
window.sayName();//Greg

var o = new Object();
    Person.call(o, "Kristen", 25, "Nurse");
    o.sayName();//Kristen

==============================================================

function Person(name, age, job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function(){
        alert(this.name);
    }
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");
alert(person1 == person2);//false
==============================================================
function Person(name, age, job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = new Function(alert(this.name));
}

function sayName(){
    alert(this.name);
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");
alert(person1.sayName == person2.sayName);//true
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章