成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

JS學(xué)習(xí)筆記(第5章)(引用類型)

heartFollower / 534人閱讀

摘要:對象是某個特定引用類型的實例,新對象是使用操作符后跟一個構(gòu)造函數(shù)來創(chuàng)建。方法只接收一個參數(shù),即用作分隔符的字符串,然后返回包含所有數(shù)組項的字符串如果不給方法傳入任何值,或者給它傳入,則使用逗號作為分隔符。

引用類型的值(對象)是引用類型的一個實例,引用類型是一種數(shù)據(jù)結(jié)構(gòu),用于將數(shù)據(jù)和功能組織在一起。引用類型有時候也被稱為對象定義,因為他們描述的是一類對象所具有的屬性和方法。對象是某個特定引用類型的實例,新對象是使用new操作符后跟一個構(gòu)造函數(shù)來創(chuàng)建。

var  person = new Object();
5.1 Object類型

1. 創(chuàng)建Object實例
創(chuàng)建Object實例的方式有兩種:
(1)使用new操作符后跟Object構(gòu)造函數(shù)

var person = new Object();
person.name = "Chris";
person.age = 22;

(2)使用對象字面量表示法

var person = {
name : "Chris",
age : 22
};

注意:
1) 在對象字面量中,使用逗號來分隔不同的屬性,但在最后一個屬性后面不能添加逗號。否則在一些早 版本瀏覽器中導(dǎo)致錯誤。
2)在使用對象字面量語法時,屬性名也可以使用字符串;
3)使用對象字面量語法時,如果留空其花括號,則可以定義只包含默認屬性和方法的對象,如下:

var person = {};
person.name = "Chris";
person.age = 22;

2. 訪問對象屬性
(1)點表示法

 alert(person.name);  //"Chris"

(2)方括號表示法

alert(person["name"]);  //"Chris"

注意:1)方括號表示法的主要優(yōu)點是可以通過變量來訪問屬性;

 var propertyName = "name";
 alert(person[propertyName]);  //"Chris"

2)如果屬性名中包含會導(dǎo)致語法錯誤的字符,或者屬性名使用的是關(guān)鍵字或者保留字,也可以使用方括號表示法;

person["first name"] = "Chris";  

因為"first name"中包含一個空格,所以不能讓使用點表示法來訪問它們,然而,屬性名中是可以包含非字母非數(shù)字的,這時候就可以使用方括號表示法來訪問它們;
3)通常,除非必須使用變量來訪問屬性,否則建議使用點表示法。

5.2 Array類型

1、與其他語言不同的是:
(1)ECMScript數(shù)組的每一項可以保存任何類型的數(shù)據(jù);
(2)ECMScript數(shù)組的大小是可以動態(tài)調(diào)整的,即可以隨著數(shù)據(jù)的添加自動增長以容納新增數(shù)據(jù);
2、創(chuàng)建數(shù)組的基本方式有兩種:
(1)使用Array構(gòu)造函數(shù);

var colors = new Array();

(2)使用數(shù)組字面量表示法,數(shù)組字面量由一對包含數(shù)組項的方括號表示,多個數(shù)組之間以逗號隔開;

var colors = ["red", "blue", "yellow"];

3、在讀取和設(shè)置數(shù)組的值時,要使用方括號并提供相應(yīng)值的基于0的數(shù)字索引;

var colors = ["red", "blue", "green"] //定義一個字符串數(shù)組`
alert(colors[0]); //顯示第一項
colors[2] = "black";  //修改第三項
colors[3] = "brown";  //新增第四項

4、數(shù)組的項數(shù)保存在其length屬性中,這個屬性始終會返回0或更大的值;

var colors = ["red", "blue", "green"]; //定義一個字符串數(shù)組
alert(colors.length);  //3

5、通過設(shè)置數(shù)組的length屬性,可以從數(shù)組的末尾移除項或者向數(shù)組中添加新項;

var colors = ["red", "blue", "green"] //定義一個字符串數(shù)組
colors.length = 2;
alert(colors[2]);  //undefined(移除項)

該例中的數(shù)組colors一開始有3個值,將其length屬性設(shè)置為2會移除最后一項(位置為2的那一項),結(jié)果再訪問colors[2]就會顯示undefined。如果將其length屬性設(shè)置為大于數(shù)組項數(shù)的值,則新增的每一項都回去的undefined值;

var colors = ["red", "blue", "green"] //定義一個字符串數(shù)組
colors.length = 4;
alert(colors[3]);  //undefined(新增項)

利用length屬性也可以方便地在數(shù)組末尾添加新項;

var colors = ["red", "blue", "green"] //定義一個字符串數(shù)組
colors[colors.length] = "black";  //(在位置3)添加一種顏色
colors[colors.length] = "brown";  //(在位置4)再添加一種顏色

當把一個值放在超出當前數(shù)組大小的位置上時,數(shù)組就會重新計算其長度值,即長度值等于最后一項的索引加1。
1. 檢測數(shù)組
(1)對于一個網(wǎng)頁或者有個全局作用域而言,使用instanceof操作符就能確定某個對象是不是數(shù)組;

if (value instanceof Array) {
   //對數(shù)組執(zhí)行某些操作
}

(2)Array.isArray()方法的目的是最終確定某個值到底是不是數(shù)組,而不管它是在哪個全局執(zhí)行環(huán)境中創(chuàng)建的。

if (Array.isArray(value)) {
  //對數(shù)組執(zhí)行某些操作
}

2. 轉(zhuǎn)換方法
所有對象都具有toLocaleString()、toString()valueOf()方法。其中,調(diào)用valueOf()返回的還是數(shù)組本身,而調(diào)用數(shù)組的toString()方法會返回有數(shù)組中每個值的字符串形式拼接而成的一個以逗號分隔的字符串;
toLocalString()方法經(jīng)常會返回與toString()和valueOf()方法相同的值,但也不總是如此。

(1)當調(diào)用數(shù)組的toLocaleString()方法時,調(diào)用的是每一項的toLocaleString()方法。

(2)采用alert()輸出時,由于alert()要接收字符串參數(shù),所以它會在后臺調(diào)用toString()方法,由此會得到與直接調(diào)用toString()方法相同的結(jié)果。

數(shù)組繼承的toLocaleString()、toString()和valueOf()方法,在默認情況下都會以逗號分隔的字符串的形式返回數(shù)組項,而如果使用join()方法,則可以使用不同的分隔符來構(gòu)建這個字符串(將數(shù)組轉(zhuǎn)化為字符串)。join()方法只接收一個參數(shù),即用作分隔符的字符串,然后返回包含所有數(shù)組項的字符串.如果不給join()方法傳入任何值,或者給它傳入undefined,則使用逗號作為分隔符。split()將字符喜轉(zhuǎn)換為數(shù)組。

var colors = ["red", "green", "blue"];
alert(colors.join(","));  //red,green,blue
alert(colors.join("||"));  //red||green||blue

var color1 = "2:3:4:5";
color1.split(":");    //["2","3","4","5"]

3. 棧方法
棧是一種LIFO(Last-In-First-Out,先進后出)的數(shù)據(jù)結(jié)構(gòu),也就是最新添加的項最早被移除。而棧中項的插入(叫做推入)和移除(叫做彈出),只發(fā)生在一個位置——棧的頂部。
push()方法可以接收任意數(shù)量的參數(shù),把它們逐個添加到數(shù)組末尾,并返回修改后數(shù)組的長度;
pop()方法從數(shù)組末尾移除最后一項,減少數(shù)組的length值,然后返回移除的項;

var colors = new Array();  //創(chuàng)建一個數(shù)組
var count = colors.push("red", "green");  //推入兩項
alert(count);  //2

var item = colors.pop(); //取得最后一項
alter(item);  //"green"
alert(colors.length); //1

4. 隊列方法
隊列數(shù)據(jù)結(jié)構(gòu)的訪問規(guī)則是FIFO(First-In-First-Out,先進先出)。隊列在列表的末端添加項,從列表的前端移除項;
(1)shift()方法,它能夠移除數(shù)組中的第一項并返回該項,同時將數(shù)組長度減1(刪除第一項);
(2)unshift()方法,它能在數(shù)組前端添加任意個項并返回新數(shù)組的長度。
(3)結(jié)合使用shift()和push()方法,可以像使用隊列一樣使用數(shù)組;(末端添加項,前端移除項)

var colors = new Array(); //創(chuàng)建一個數(shù)組
var count = colors.push("red", "green"); //推入兩項
alert(count);  //2

count = colors.push("black");  //末端推入另一項

var item = colors.shift();  //取得第一項
alert(item); //"red" 
alert(colors.length);  //2
(4)同時使用unshift()和pop()方法,可以從相反的方向來模擬隊列;(前端添加項,末端移除項)
var colors = new Array(); //創(chuàng)建一個數(shù)組`
var count = colors.push("red", "green"); //推入兩項
alert(count);  //2

count = colors.unshift("black");  //前端推入另一項

var item = colors.pop();  //取得最后一項
alert(item); //"green" 
alert(colors.length);  //2

5. 重排序方法
(1)數(shù)組中已經(jīng)存在的兩個可以直接用重排序的方法:reverse()sort()方法
reverse()方法會反轉(zhuǎn)數(shù)組項的順序;
在默認情況下,sort()方法按升序排列數(shù)組項,sort()方法會調(diào)用每個數(shù)組項的toString()轉(zhuǎn)型方法,然后比較得到字符串,已確定如何排序,即使數(shù)組中的每一項都是數(shù)值,sort()方法比較的也是字符串。
(2)比較函數(shù)(P93)

function compare(value1,value2) {
    if(value1 < value2) {
        return -1;
    }else if(value1 > value2){
        return 1;
    }else{
        return 0;
    }
}

6. 操作方法
(1)concat()方法可以基于當前數(shù)組中的所有項創(chuàng)建一個新的數(shù)組
(2)slice()方法能夠基于當前數(shù)組中的一個多個項創(chuàng)建一個新的數(shù)組。slice()方法可以接收一個或者兩個參數(shù),即要返回項的起始和結(jié)束位置。在只有一個參數(shù)的情況下,slice()方法返回從該參數(shù)指定位置開始到當前數(shù)組末尾的所有項;如果有兩個參數(shù),該方法返回起始和結(jié)束位置之間的項——但不包括結(jié)束位子的項。注意,slice()方法不會影響原始數(shù)組。

var colors = ["red", "green", "blue", "yellow","purple"];
var colors2 = colors.silce(1);
var colors3 = colors.slice(1,4);

alert(colors2); //green,blue,yellow,purple
alert(colors3); //green,blue,yellow

注意:
1)如果slice方法的參數(shù)中有一個附屬,則用數(shù)組長度加上該數(shù)來確定相應(yīng)的位置;
2)如果結(jié)束位置小于起始位置,則返回空數(shù)組
(3)splice()方法的主要用途是向數(shù)組的中部插入項
1)刪除:可以刪除任意數(shù)量的項,只需指定2個參數(shù):splice(要刪除的第一項的位置,要刪除的項數(shù))
2)插入:可以向指定位置插入任意數(shù)量的項,只需提供3個參數(shù)splice(起始位置,要刪除的項數(shù),要插入的項)
3)替換:可以向指定位置插入任意數(shù)量的項,且同時刪除任意數(shù)量的項,只需指定3個參數(shù)
splice(起始位置,要刪除的項數(shù),要插入的任意數(shù)量的項),插入的項數(shù)不必與刪除的項數(shù)相等;

var colors = ["red", "green", "blue"];
var removed = colors.splice(0,1)    //刪除第一項
alert(colors);  //green,blue
alert(removed); //red,返回的數(shù)組中只包含一項

removed = colors.splice(1,0,"yellow","orange");  //從位置1開始插入兩項
alert(colors);  //green,yellow,orange,blue
alert(removed);  //返回的是一個空數(shù)組

removed = colors.splice(1,1,"red","purple");   //插入兩項,刪除一項
alert(colors); //green,red,purple,orange,blue
alert(removed); //yellow,返回的數(shù)組中只包含一項

7. 位置方法
indexOf()lastIndexOf(),這兩個方法都接收兩個參數(shù):要查找的項和(可選的)表示查找起點位置的索引。其中,indexOf()方法從數(shù)組的開頭(位置0 )開始向后查找。LastIndexOf()方法則從數(shù)組的末尾向前查找。這兩個方法都返回要查找的項在數(shù)組中的位置,或者在沒有找到的情況下返回-1.

var numbers = [1,2,3,4,5,4,3,2,1];
alert(numbers.indexOf(4));  //3
alert(numbers.lastIndexOf(4));   //5

alert(numbers.indexOf(4,4));  //5
alert(numbers.lastIndexOf(4,4));   //3

8. 迭代方法
每個方法都接收兩個參數(shù):要在每一項運行的函數(shù)和(可選的)運行該函數(shù)的作用域?qū)ο?。傳入這些方法中的函數(shù)會接收三個參數(shù):數(shù)組項的值、該項在數(shù)組中的位置和數(shù)組對象本身。

every():對數(shù)組中的每一項運行給定函數(shù),如果該函數(shù)對每一項都返回true,則返回true;

filter():對數(shù)組中的每一項運行給定函數(shù),返回該函數(shù)會返回true的項組成的數(shù)組;

forEach():對數(shù)組中的每一項運行給定函數(shù),該方法沒有返回值;

map():對數(shù)組中的每一項運行給定函數(shù),返回每次函數(shù)調(diào)用的結(jié)果組成的數(shù)組;

some():對數(shù)組中的每一項運行給定函數(shù),如果該函數(shù)對任一項返回true,則返回true。

var numbers = [1,2,3,4,5,4,3,2,1];
  var everyResult = numbers.every(function(item,index,array){
      return (itrem>2);
  });
  alert(everyResult);   //false
  
  var someResult = numbers.every(function(item,index,array){
    return (itrem>2);
});
  alert(someResult);  //true

注意:對every()來說,傳入的函數(shù)必須對每一項都返回true,這個方法才返回true;而some()方法則是只要傳入的函數(shù)對數(shù)組中的某一項返回true,就會返回true。

9. 歸并方法
ECMAScript5新增了兩個歸并數(shù)組的方法:reduce()和reduceRight()。這兩個方法都會迭代數(shù)組的所有項,然后構(gòu)建一個最終返回值。其中reduce()方法從數(shù)組的第一項開始,逐個遍歷到最后。而reduceRight()則從數(shù)組的最后一項開始,向前遍歷到第一項。
以上兩種方法都接收兩個參數(shù):在每一項調(diào)用的函數(shù)、作為歸并基礎(chǔ)的初始值
傳給reduce()和reduceRight()的函數(shù)接收四個參數(shù):前一個值、當前值、項的索引和數(shù)組對象。這個函數(shù)返回的任何值都會作為第一個參數(shù)自動傳給下一項。以第一次迭代發(fā)生在數(shù)組的第二項上,因此第一個參數(shù)是數(shù)組的第一項,第二個參數(shù)就是數(shù)組的第二項。

var values = [1,2,3,4,5];
var sum = values.reduce(function(prev, cur, index, array){
return prev + cur;
});
alert(sum); //15
5.3 Date類型

要創(chuàng)建一個日期對象,使用new操作符和Date構(gòu)造函數(shù)即可
var now = new Date();
//在調(diào)用Date構(gòu)造函數(shù)而不傳遞參數(shù)的情況下,新創(chuàng)建的對象自動獲得當前日期和時間
如果想根據(jù)特定的日期和時間創(chuàng)建日期對象,必須傳入該日期的毫秒數(shù)?;蛘呤褂?strong>Date.parse()Date.UTC();
Date.parse()方法接收一個表示日期的字符串參數(shù),然后嘗試根據(jù)這個字符串返回相應(yīng)日期的毫秒數(shù);如果傳入Date.parse()方法的字符串不能表示日期,那么它會返回NaN;如果直接將表示日期的字符串傳遞給Date構(gòu)造函數(shù),也會在后臺調(diào)用Date.parse()。
Date.UTC()方法同樣也返回表示日期的毫秒數(shù),Date.UTC()的參數(shù)分別是年份、基于0的月份,月中的哪一天(1到31)、小時數(shù)(0到23)、分鐘、秒以及毫秒數(shù)。在這些參數(shù)中,只有年和月是必需的
Date.now()方法,返回表示調(diào)用這個方法時的日期和時間的毫秒數(shù)。
1. 繼承的方法
Date類型也重寫了toLocaleString()、toString()和valueOf()方法。

Date類型的toLocaleString()方法會按照與瀏覽器設(shè)置的時區(qū)相適應(yīng)的格式返回日期和時間。(大致意味時間格式中會包含AM或PM,但不會包含時區(qū)信息);

Date類型的toString()方法則通常返回帶有時區(qū)信息的日期和時間,其中時間一般以軍用時間表示;

Date類型的valueOf()方法則根本不返回字符串,而是返回日期的毫秒表示。因此,可以方便使用比較操作符(小于或大于)來比較日期值。

2. 日期格式化方法

toDateString()——以特定于實現(xiàn)的格式顯示星期幾、月、日和年;

toTimeString()——以特定于實現(xiàn)的格式顯示時、分、秒和時區(qū);

toLocaleDateString()——以特定于地區(qū)的格式顯示星期幾、月、日和年;

toLocaleTimeString()——以特定于實現(xiàn)的格式顯示時、分、秒和時區(qū);

toUTCString()——以特定于實現(xiàn)的格式完整的UTC日期;

3. 日期/時間組件方法 (P102)

5.4 RegExp類型

RegExp類型是用來支持正則表達式:
(1)第一種創(chuàng)建正則表達式的方法如下:
var expression = / pattern / flags;
其中的模式(pattern)部分可以是任何簡單或復(fù)雜的正則表達式,可以包含字符類、限定符、分組、向前查找以及反向引用。
每個正則表達式都可以帶有一個或者多個標志(flags),用以標明正則表達式的行為。正則表達式的匹配模式支持下列3個標志:

g:表示全局(global)模式,即模式將被應(yīng)用于所有字符串,而非在發(fā)現(xiàn)第一個匹配項時立即停止;

i:表示不區(qū)分大小寫(case-insensitive)模式,即在確定匹配項時忽略模式與字符串的大小寫;

m:表示多行(multiline)模式,即在到達一行文本末尾時還會繼續(xù)查找下一行是否存在與模式匹配的項

模式中使用的所有元字符都必須轉(zhuǎn)義。正則表達式中的元字符包括:( [ { ^ $ | ) ? * + . ] }
(2)另一種創(chuàng)建正則表達式的方式是使用RegExp函數(shù),它接收兩個參數(shù):一個是要匹配的字符串模式,另一個是可選的標志字符串。
//匹配第一個"bat"或"cat",不區(qū)分大小寫
var pattern1 = /[bc]at/i; //使用第一種方法創(chuàng)建
var pattern2 = new RegExp("[bc]at","i"); //使用RegExp函數(shù)實現(xiàn)
由于RegExp構(gòu)造函數(shù)的模式參數(shù)是字符串,所以在某些情況下要對字符串進行雙重轉(zhuǎn)義。

正則表達式字面量始終會共享同一個RegExp實例,而使用構(gòu)造函數(shù)創(chuàng)建的每一個新RegExp實例都是一個新實例。
1. RegExp實例屬性

global:布爾值,表示是否設(shè)置了g標志;

ignoreCase:布爾值,表示是否設(shè)置了i標志;

lastIndex:整數(shù),表示開始搜索下一個匹配項的字符位置,從0算起。

multiline:布爾值,表示是否設(shè)置了m標志;

source:正則表達式的字符串表示,按照字面量形式而非傳入構(gòu)造函數(shù)的字符串模式返回。

source屬性保存的是規(guī)范形式的字符串,即字面量形式所用的字符串。

2. RegExp實例方法
正則表達式的第一個方法是exec()鏈接描述: 接收一個參數(shù),即要應(yīng)用模式的字符串,然后返回包含第一個匹配信息的數(shù)組;或者在沒有匹配項的情況下返回null。exec() 方法還返回兩個屬性。index 屬性聲明的是匹配文本的第一個字符的位置(匹配項在字符串中的位置)。input 屬性則存放的是被檢索的字符串 string(表示應(yīng)用正則表達式的字符串)。

在數(shù)組中,第一項是與整個模式匹配的字符串,其他項是與模式中的捕獲組匹配的字符串(如果模式中沒有捕獲組,則該數(shù)組只包含一項)

  var text = "mom and dad and baby";
  var pattern = /mom( and dad( and baby)?)?/gi;

  var matches = pattern.exec(text);  
  alert(matches.index);    //0
  alert(matches.input);    //"mom and dad and baby"
  alert(matches[0]);       //"mom and dad and baby"
  alert(matches[1]);       //"and dad and baby"
  alert(matches[2]);       //"and baby"

對于exec()方法而言,即使在模式中設(shè)置了全局標志(g),他每次也只會返回一個匹配項。在不設(shè)置全局標志的情況下,在同一個字符串上多次調(diào)用exec()將始終返回第一個匹配項的信息,而在設(shè)置全局變量的情況下,每次調(diào)用exec()則都會在字符串中繼續(xù)查找新匹配項。

正則表達式的第二個方法是test()鏈接描述:它接受一個字符串參數(shù),如果字符串 string 中含有與RegExpObject 匹配的文本,則返回true,否則返回false
3. RegExp構(gòu)造函數(shù)屬性

input:最近一次要匹配的字符串["$_"]

lastMatch:最近一次與整個正則表達式匹配的字符串["$&"]

lastParen:最近一次匹配的捕獲組["$+"]

leftContext:input字符串中l(wèi)astMatch之前的文本["$`"]

rightContext:input字符串中l(wèi)astMatch之后的文本["$""]

multiline:布爾值,表示是否所有表達式都使用多行模式["$*"]

    var text = "this has been a short summer";
    var pattern = /(.)hort/g;
    
    if(pattern.test(text)){
    alert(RegExp.input);  //this has been a short summer
    alert(RegExp.leftContext);  //this has been
    alert(RegExp.rightContext);  //summer
    alert(RegExp.lastMatch);  //short
    alert(RegExp.lastParen);  //a
    alert(RegExp.multiline);  //false
    }

注意:以上使用的長屬性名都可以用相應(yīng)的短屬性名來代替,不過短屬性名不是有效的ECMAScript標識符,因此必須通過方括號語法來訪問它們。

var text = "this has been a short summer";
var pattern = /(.)hort/g;

if(pattern.test(text)){
alert(RegExp.$_);  //this has been a short summer
alert(RegExp["`$`"]);  
//this has been
alert(RegExp["$""]);  //summer
alert(RegExp["$&"]);  //short
alert(RegExp["$+"]);  //a
alert(RegExp["$*"]);  //false
}

4. 模式的局限性 (P109)

5.5 Function類型

1. 沒有重載(深入理解)
2. 函數(shù)聲明與函數(shù)表達式
3. 作為值的函數(shù)
4. 函數(shù)的內(nèi)部屬性
在函數(shù)內(nèi)部,有兩個特殊的對象:argumentsthis
(1)arguments是一個類數(shù)組對象,包含著傳入函數(shù)中的所有參數(shù),它的主要用途是保存函數(shù)參數(shù)。這個對象還有一個名叫callee的屬性,該屬性是一個指針,指向擁有這個arguments對象的函數(shù)。

function factorial(num) {
if (num<=1) {
return 1;
} else {
return num*factorial(num-1);
}
}

轉(zhuǎn)變?yōu)?/p>

function factorial(num) {
if (num<=1) {
return 1;
} else {
return num*arguements.callee(num-1);
}
}

在這個重寫后的factorial()函數(shù)的函數(shù)體內(nèi),沒有再引用函數(shù)名factorial。這樣,無論引用函數(shù)時使用的是什么名字,都可以保證正常完成遞歸調(diào)用。
(2)函數(shù)內(nèi)部的另一個特殊對象是this。this引用的是函數(shù)執(zhí)行的環(huán)境對象(當在網(wǎng)頁的全局作用域中調(diào)用函數(shù)時,this對象引用的就是window)
!函數(shù)的名字僅僅是一個包含指針的變量而已
EMAScript也規(guī)范了另一個函數(shù)對象的屬性:caller這個屬性保存著 調(diào)用當前函數(shù)的函數(shù)的引用
5. 函數(shù)屬性和方法
每個函數(shù)都包含兩個屬性:lengthprototype
(1)length屬性表示函數(shù)希望接收的命名參數(shù)的個數(shù)
(2)prototype屬性是保存他們所有實例方法的真正所在
(3)每個函數(shù)都包含兩個非繼承而來的方法:apply()call(),這兩個方法的用途都是在特定的作用域中調(diào)用函數(shù),實際上等于設(shè)置函數(shù)體內(nèi)this對象的值。
apply()方法接收兩個參數(shù):在其中運行的函數(shù)的作用域 和 參數(shù)數(shù)組
call()方法:第一個參數(shù)是this值沒有變化,變化的是其余參數(shù)都直接傳遞給函數(shù)。換句話說,在使用call()方法時,傳遞給函數(shù)的參數(shù)必須逐個列舉出來。

function sum(num1,num2) {
return num1+num2; 
}
function callSum1(num1,num2) {
return sum.apply(this,arguments); //傳入arguments對象
}

function callSum2(num1,num2) {
return sum.apply(this,[num1,num2]); //傳入數(shù)組
}

function callSum3(num1,num2) {
return sum.call(this,num1,num2); //其余參數(shù)都直接傳遞給函數(shù)`
}

alert(callSum1(10,10));  //20
alert(callSum2(10,10));  //20
alert(callSum3(10,10));  //20

apply()和call()真正的用武之地在——能夠擴充函數(shù)賴以運行的作用域

windows.color = "red";
var o = {color : "blue"};

function sayColor() {
alert(this.color);
}
sayColor();  //red

sayColor.call(this);  //red
sayColor.call(window); //red
sayColor.call(o); //blue

使用apply()或call()來擴充作用于的最大好處就是,對象不需要與方法有任何耦合關(guān)系。
(4)bind()方法。這個方法會創(chuàng)建一個函數(shù)的實例,其this值會被綁定到傳給bind()函數(shù)的值。

windows.color = "red";
var o = {color : "blue"};

function sayColor() {
alert(this.color);
}
var objectSayColor= sayColor.bind(o);
objectSayColor();   //blue
5.6 基本包裝類型

ECMAScript提供了3種特殊的引用類型:Boolean、Number和String
引用類型與基本包裝類型的主要區(qū)別就是對象的生存周期。使用new操作符創(chuàng)建的引用類型的實例,在執(zhí)行流離開當前作用域之前都一直保存在內(nèi)存中。而自動創(chuàng)建的基本包裝類型的對象,則只存在于一行代碼的執(zhí)行瞬間,然后立即被銷毀。這意味著我們不能在運行時為基本類型值添加屬性和方法。

var s1 = "some text";
s1.color = "red";
alert(s1.color); //undefined

!注意:使用new調(diào)用基本包裝類型的構(gòu)造函數(shù),與直接調(diào)用同名的轉(zhuǎn)型函數(shù)是不一樣的

var value = "25";
var number = Number(value); //轉(zhuǎn)型函數(shù)
alert(typeof number); //"number"

var obj = new Number(value); //構(gòu)造函數(shù)
alert(type of obj);  //"object"

1. Boolean類型
(1)Boolean類型是與布爾值對應(yīng)的引用類型。要創(chuàng)建Boolean對象,可以像下面這樣調(diào)用Boolean構(gòu)造函數(shù)并傳入true或者false值。

var BooleanObject= newBoolean(true);

Boolean類型的實例重寫了valueOf()方法,返回基本類型值true或false;重寫了toString()方法,返回字符串"true"和"flase"。

var falseObject = new Boolean(false);
var result = falseObject && true;   
alert(result);  //true 
(布爾表達式中的所有對象都會被轉(zhuǎn)化為true,因此falseObject對象在布爾表達式中代表的是true,結(jié)果true&&true就等于true) 

(2)基本類型與引用類型的布爾值還有兩個區(qū)別:
1)typeof操作符對基本類型返回"boolean",而對引用類型返回"object";
2)由于Boolean對象是Boolean類型的實例,所以使用instanceof操作符測試Boolean對象會返回true,而測試基本類型的布爾值則返回false。

var falseObject = new Boolean(false);
var falseValue = false;
alert(typeof falseObject); //Object
alert(typeof falseValue); //boolean
alert(falseObject instanceof Boolean); //true
alert(falseValue instanceof Boolean); //false

2. Number類型
(1)要創(chuàng)建Number對象,可以在調(diào)用Number構(gòu)造函數(shù)時向其中傳遞相應(yīng)的數(shù)值。

var numberObject = new Number(10);

(2)Number類型也重寫了valueOf()、toLocaleString()和toString()方法。重寫后的valueOf()方法返回對象表示的基本類型的值,另外兩個方法則返回字符串形式的數(shù)值。
(3)toFixed()方法會按照指定的小數(shù)位返回數(shù)值的字符串表示。

var num = 10;
alert(num.toFixed(2)); //"10.00"

如果數(shù)值本身包含的小數(shù)位比指定的還多,那么接近指定的最大小數(shù)位的值就會被舍入。

var num = 10.005;
alert(num.toFixed(2)); //"10.01"

(4)toExponential()可用于格式化數(shù)值,該方法返回以指數(shù)表示法表示的數(shù)值的字符串形式。toExponential()也接收一個參數(shù),而且該參數(shù)同樣也是指定輸出結(jié)果的小數(shù)位數(shù)。

var num = 10;
alert(num.toExponential(1)); //"1.0e+1"

(5)toPrecision()方法可能會返回固定大?。╢ixed)格式,也可能返回指數(shù)(exponential)格式。這個方法接收一個參數(shù),即表示數(shù)值的所有數(shù)字的位數(shù)(不包括指數(shù)部分)。

var num = 99;
alert(num.toPrecision(1)); //"1e+2"
alert(num.toPrecision(2)); //"99"
alert(num.toPrecision(3)); //"99.0"

3. String類型
見鏈接描述

5.7 單體內(nèi)置對象

1. Global對象
2. Math對象

5.8 小結(jié)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/102461.html

相關(guān)文章

  • JS學(xué)習(xí)筆記4)(變量、作用域和內(nèi)存問題)

    摘要:具體來說就是當執(zhí)行流進入下列任何一個語句時,作用域鏈就會得到加長語句的塊和語句。這兩個語句都會在作用域鏈的前端添加一個變量對象。對來說,會將指定的對象添加到作用域鏈中。 1. 基本類型和引用類型的值 JavaScript變量可以用來保存兩種類型的值:基本類性值和引用類性值?;绢愋椭翟醋砸韵?種基本數(shù)據(jù)類型:Undefined、Null、Boolean、Number和String?;?..

    linkin 評論0 收藏0
  • JS學(xué)習(xí)筆記6)(創(chuàng)建對象的7種模式)

    摘要:工廠模式?jīng)]有解決對象識別的問題即怎樣知道一個對象的類型構(gòu)造函數(shù)模式使用構(gòu)造函數(shù)的主要問題,就是每個方法都要在每個實例上重新創(chuàng)建一遍。創(chuàng)建要返回的對象可以在這里定義私有變量和函數(shù)添加函數(shù)注意寄生構(gòu)造函數(shù)中是返回對象注意寄生構(gòu)造函數(shù)中是 1、工廠模式 沒有解決對象識別的問題(即怎樣知道一個對象的類型) function createPerson(name, age, job) { ...

    Render 評論0 收藏0
  • JS學(xué)習(xí)筆記7)(函數(shù)表達式)

    摘要:遞歸閉包模仿塊級作用域私有變量小結(jié)在編程中,使用函數(shù)表達式可以無需對函數(shù)命名,從而實現(xiàn)動態(tài)編程。匿名函數(shù)也稱為拉姆達函數(shù)。函數(shù)聲明要求有名字,但函數(shù)表達式不需要。中的函數(shù)表達式和閉包都是極其有用的特性,利用它們可以實現(xiàn)很多功能。 1、遞歸 2、閉包 3、模仿塊級作用域 4、私有變量 5、小結(jié) 在JavaScript編程中,使用函數(shù)表達式可以無需對函數(shù)命名,從而實現(xiàn)動態(tài)編程。匿名函數(shù)也稱...

    xiaokai 評論0 收藏0
  • JS高級程序設(shè)計(4-5)-筆記

    摘要:寫在前面本文記錄的是我不熟悉或者我認為值得注意的地方,并不是書上知識點的概括第章變量作用域和內(nèi)存問題對象是按引用傳遞的我理解的是傳值其實傳的是一個指針,該指針指向內(nèi)存中的某個對象。 寫在前面 本文記錄的是我不熟悉或者我認為值得注意的地方,并不是書上知識點的概括 第4章 變量、作用域和內(nèi)存問題 對象是按引用傳遞的(我理解的是傳值其實傳的是一個指針,該指針指向內(nèi)存中的某個對象)。舉例如下...

    MycLambert 評論0 收藏0
  • JS學(xué)習(xí)筆記24)(最佳實踐)

    摘要:大多數(shù)情況下,可以是同局部變量完成相同的事情而不引入新的作用域。選擇正確的方法避免不必要的屬性查找一旦多次用到屬性對象,應(yīng)該將其存儲在局部變量中。盡可能多的使用局部變量將屬性查找替換為值查找。 1、可維護性 1.1 可維護代碼特征 1. 可理解性 2. 直觀性 3. 可適應(yīng)性 4. 可擴展性 5. 可調(diào)試性 1.2 代碼約定 1、可讀性(代碼縮進和代碼注釋) 2、變量和函數(shù)命名 變量...

    cnTomato 評論0 收藏0
  • JS學(xué)習(xí)筆記6)(面向?qū)ο笾^承——JS繼承的六大方式)

    摘要:除此之外,在超類型的原型中定義的方法,對子類型而言也是不可兼得,結(jié)果所有類型都只能用構(gòu)造函數(shù)模式。創(chuàng)建對象增強對象指定對象繼承屬性這個例子的高效率體現(xiàn)在它只調(diào)用了一次構(gòu)造函數(shù)。 1、原型鏈 原型鏈的基本思想是利用原型讓一個引用類型繼承另一個引用類型的屬性和方法。構(gòu)造函數(shù)、原型和實例的關(guān)系:每個構(gòu)造函數(shù)都有一個原型對象;原型對象都包含著一個指向構(gòu)造函數(shù)的指針;實例都包含一個指向原型對象的...

    lscho 評論0 收藏0

發(fā)表評論

0條評論

heartFollower

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<