摘要:高程讀書筆記第五章類型創建實例的方式有兩種。第一種是使用操作符后跟構造函數,另一種方式是使用對象字面量表示法。
JS高程讀書筆記--第五章 Object類型
創建Object實例的方式有兩種。第一種是使用new操作符后跟Object構造函數,另一種方式是使用對象字面量表示法。
在通過對象字面量定義對象時,實際上不會調用Object構造函數
訪問對象屬性時可以使用點表示法和方括號表示法。使用方括號語法時,應該要將訪問的屬性以字符串的形式放在方括號中。
Array類型方括號表示法的優點是可以通過變量來訪問屬性。
ECMAScript數組的每一項可以保存任何類型的數據,并它的大小是可以動態調整的
創建數組使用Array構造函數
給構造函數傳的值是數值,則會按照該數值創建包含給定項數的數組;
如果傳遞的是其他類型的參數,則會創建包含那個值得只有一項的數組;
使用數組字面量表示法
數組的length屬性不是只讀的,通過設置這個屬性可以從數組的末尾移除項或向數組中添加新項。如果將其length屬性設置為大于數組項數的值,則新增的每一項都會取得undefined值。
檢測數組instanceof :value instanceof Array;它的問題在于它假定只有一個全局執行環境
ES5新增了一個Array.isArray()方法
constructor屬性:arr.constructor;
轉換數組toString():調用數組的toString()方法會返回由數組中每個值得字符串形式拼接而成的一個以逗號分隔的字符串;
valueOf():返回的還是數組;
join():只接受一個參數,即用作分隔符的字符串,如果不給join()方法傳入任何值,或者給它傳入undefined,則使用逗號作為分隔符;
棧方法如果數組中的某一項的值是null或者undefined,那么該值在join()、toLocalString()、toString()方法返回的結果中以空字符串表示。
push():這個方法可以接收任何數量的參數,把它們逐個添加到數組末尾,并返回修改后數組的長度;
pop():這個方法從數組末尾移除最后一項,減少數組的length值,然后返回溢出的項;
隊列方法shift():這個操作能夠移除數組中的第一項并返回該項;
unshift():它能在數組前端添加任意個項并返回新數組的長度;
重排序方法reverse():這個方法會反轉數組項的順序;
sort():這個方法會調用每個數組項的toString()轉型方法,然后比較得到的字符串對應的ASCII值,以確定如何排序,即使每一項都是數值;
sort()方法還可以接收一個比較函數作為參數。這個比較函數接收兩個參數,如果第一個參數應該位于第二個之前則返回一個負數,如果兩個參數相等則返回0,如果第一個參數應該位于第二個之后則返回一個整數;
操作方法reverse()和sort()方法的返回值是經過排序后的數組
concat():這個方法會先創建當前數組一個副本,然后將接收到的參數添加到這個副本的末尾,然后返回新構建的數組。
在沒有給concat()方法傳遞參數的情況下,它只是復制當前數組并返回副本。
如果傳遞給concat()方法的是一或多個數組,則該方法會將這些數組中的每一項都添加到結果數組中。
如果傳遞的值不是數組,這些值就會被簡單地添加到結果數組的末尾
這個方法不會影響原數組
slice():這個方法可以接收一或兩個參數,即要返回項的起始和結束位置。
在只有一個參數的情況下,slice()方法返回從該參數指定位置開始到當前數組末尾的所有項;
如果有兩個參數,該方法返回起始和結束位置之前的項,但不包括結束位置的項
這個方法不會影響原數組
splice():這個方法算是最強大的數組方法,主要用途是向數組的中部插入項。這個方法會影響原數組,它始終都會返回一個數組,該數組中包含從原始數組中刪除的項
刪除:可以刪除任意數量的項,只需指定2個參數:要刪除的第一項的位置和要刪除的項數;
插入:可以向指定位置插入任意數量的項,只需提供3個參數:起始位置、0(要刪除的項數)和要插入的項。如果要插入多個項,可以再傳入第四、第五,以至任意多個項;
替換:可以向指定位置插入任意數量的項,且同時刪除任意數量的項,只需指定3個參數:起始位置、要刪除的項數和要插入的任意數量的項。插入的項不必與刪除的項相等;
位置方法ES5為數組實例添加了兩個位置方法:indexOf()和lastIndexOf()。這兩個方法都接收兩個參數:要查找的項和(可選)表示查找起點位置的索引。其中indexOf()方法從數組的開頭(位置0)開始查找,lastIndexOf()方法則從數組的末尾開始向前查找。
迭代方法這兩個方法都返回要查找的項在數組中的位置,或者在沒找到的情況下返回-1
ES5為數組定義了5個迭代方法。每個方法都接受兩個參數:要在每一項上運行的函數和(可選)運行該函數的作用域對象--影響this的值。傳入這些方法中的函數會接收三個參數:數組項的值(item)、該項在數組中的位置(index)、和數組本身對象(array),以下方法都不會修改數組中的包含的值。
every():對數組中的每一項運行給定函數,如果該函數對每一項都返回true,則返回true;
filter():對數組中的每一項運行給定函數,返回該函數會返回true的項組成的數組;
forEach():對數組中的每一項運行給定的函數。這個方法沒有返回值,本質上和for循環一樣;
map(): 對數組中的每一項運行給定的函數,返回每次函數調用的結果組成的數組;
some():對數組中的每一項運行給定函數,如果該函數對任一項返回true,則返回true。
歸并方法ES5新增了兩個歸并數組的方法:reduce()和reduceRight()。這兩個方法都會迭代數組的所有項,然后構建一個最終返回的值。其中,reduce()方法從數組的第一項開始,逐個遍歷到最后。而reduceRight()則從數組的最后一項開始,向前遍歷到第一項。
這兩個方法都接收兩個參數:一個在每一項上調用的函數和(可選)作為歸并基礎的初始值。
傳入給reduce()和reduceRight()的函數接收4個參數:前一個值、當前值、項的索引和數組對象。
var values = [1,2,3,4,5]; var sum = values.reduce(function(prev,cur,index,array){ return prev+cur; }); console.log(sum); // 15Date類型
要創建一個日期對象,使用new操作符和Date構造函數即可;
Date.parse()方法接受一個表示日期的字符串參數,然后嘗試根據這個字符串返回相應日期的毫秒數,如果直接將表示日期的字符串傳遞給Date構造函數,也會在后臺調用Date.parse();
Date類型也重寫了toLocaleString()、toString()和valueOf()方法:
toLocaleString()會按照與瀏覽器設置的地區相適應的格式返回日期和時間;
toString()方法則通常返回帶有時區信息的日期和時間;
valueof()方法根本不返回字符串,而是返回日期的毫秒表示;
RegExp類型ECMAScript通過RegExp類型來支持正則表達式。每個正則表達式都可帶有一個或多個標志,用以表明正則表達式的行為:
g:表示全局模式,即模式將被應用于所有字符串,而非在發現第一個匹配項時立即停止;
i:表示不區分大小寫模式,即在確定匹配項時忽略模式與字符串的大小寫;
m:表示多行模式,即在到達一行文本末尾時還會繼續查找下一行中是否存在于模式匹配的項
模式中所有的元字符都必須轉義:( [ ^ $ | ) ? * + . ] } )
可以使用RegExp構造函數,它接收兩個參數:一個是要匹配的字符串模式,另一個是可選的標志字符串;
RegExp對象的主要方法是exec(),該方法專門為捕獲組而設計的
exec()接收一個參數,即要應用模式的字符串,然后返回包含第一個匹配項信息的數組;或者在沒有匹配項信息的情況下返回null;
返回的數組雖然是Array實例,但也包含兩個額外的屬性:index和input。其中,index表示匹配項在字符串中的位置,而input表示應用正則表達式的字符串;
在數組中,第一項是與整個模式匹配的字符串,其他項是與模式中的捕獲組匹配的字符串(如果模式中沒有捕獲組,則該數組只包含一項);
即使在模式中設置了全局標志g,它每次也只會返回一個匹配項。在不設置全局標志的情況下,在同一個字符串上多次調用exec()將始終返回第一個匹配項的信息。而在設置全局標志的情況下,每次調用exec()則都會在字符串中繼續查找新匹配項。
正則表達式的第二個方法是test(),它接收一個字符串參數。在模式與該參數匹配的情況下返回true;否則返回false。它經常被用于if語句中
Function類型函數實際上是對象,每個函數都是Function類型的實例,而且都與其他引用類型一樣具有屬性和方法。由于函數是對象,因此函數名實際上也是一個指向函數對象的指針,不會與某個函數綁定。
函數定義函數通常是使用函數聲明語法定義的:
function sum(num1,num2){ return num1 + num2; }
與使用函數表達式定義函數的方式幾乎相差無幾
var sum = function (num1,num2){ return num1 + num2; };
解析器會率先讀取函數聲明,并使其在執行任何代碼之前可用(可以訪問);至于函數表達式,則必須等到解析器執行到它所在的代碼行,才會真正被解釋執行。
最后一種函數定義的方式是使用Function構造函數。Function構造函數可以接收任意數量的參數,但最后一個參數始終都被看成是函數體,而前面的參數則枚舉出了新函數的參數
var sum = new Function("num1","num2","return num1 + num2"); // 不推薦
從技術角度講,這是一個函數表達式。但是,我們不推薦使用這種方式來定義函數,因為這種語法會導致解析兩次代碼(第一次是解析常規ECMAScript代碼,第二次是解析傳入構造函數中的字符串),從而影響性能。
注:使用不帶圓括號的函數名是訪問函數指針,而非調用函數
因為ECMAScript中的函數名本身就是變量,所以函數也可以作為值來使用。
函數內部屬性在函數內部,有兩個特殊的對象:arguments和this。其中arguments是一個類數組對象,包含著傳入函數中的所有參數。this引用的是函數據以執行的環境對象--或者也可以說是this值(當在網頁的全局作用域中調用函數時,this對象引用的就是window)
callee雖然arguments的主要用途是保存函數參數,但這個對象還有一個名叫callee的屬性,該屬性是一個指針,指向擁有這個arguments對象的函數
function rec(num){ if(num<=1){ return 1; }else{ return num * arguments.callee(num-1) } }
caller當函數在嚴格模式下運行時,訪問arguments.callee會導致錯誤
這個屬性中保存著調用當前函數的函數的引用,如果實在全局作用域中調用當前函數,它的值為null。
函數的屬性和方法在嚴格模式下訪問arguments.caller屬性也會導致錯誤,而在非嚴格模式下這個屬性始終是undefined
嚴格模式下不能為函數的caller屬性賦值,否則會導致錯誤
ECMAScript中的函數是對象,因此函數也有屬性和方法
屬性每個函數都包含兩個屬性:length和prototype
length屬性表示函數希望接收的命名參數的個數;
prototype是保存它們所有實例方法的真正所在。prototype屬性是不可枚舉的,因此使用for-in無法實現;
方法每個函數都包含兩個非繼承而來的方法:apply()和call()。這兩個方法的用途都是在特定的作用域中調用函數,實際上等于設置函數體內this對象的值。
apply()方法接收兩個參數:一個是在其中運行函數的作用域,另一個是參數數組。其中第二個參數可以是Array的實例,也可以是arguments對象。
call()方法與apply()方法的作用相同,它們的區別僅在于接收參數的方式不同,傳遞給函數的參數必須逐個列舉出來;
ES5定義了bind()方法會創建個函數的實例,其this值會被綁定到傳給bind()函數的值;
基本包裝類型call()和apply()真正強大的地方是能夠擴充函數賴以運行的作用域,最大的好處就是對象不需要與方法有任何耦合關系。
每當讀取一個基本類型值得時候,后臺就會創建一個對應的基本包裝類型的對象,從而讓我們能夠調用一些方法來操作這些數據。
引用類型和基本包裝類型的主要區別就是對象的生存期。
使用new操作符創建的引用類型的實例,在執行流離開當前作用域之前都一直保存在內存中;
自動創建的基本包裝類型的對象,只存在于一行代碼的執行瞬間,然后立即被銷毀,這意味著我們不能在運行的時候為基本類型值添加屬性和方法;
可以顯式的調用Boolean、Number和String來創建基本包裝類型的對象
這種做法很容易分不清處理基本類型還是引用類型。對基本包裝類型的實例調用typeof會返回"object",而且所有基本包裝類型的對象都會被轉換為布爾值true;
使用new調用基本包裝類型的構造函數,與直接調用同名的轉型函數是不一樣的;
Boolean類型Boolean類型的實例重寫了valueOf()方法,返回基本類型值true或false;重寫了toString()方法,返回字符串"true"和"false";
使用instanceof()操作符測試Boolean對象會返回true;
布爾表達式中的所有對象都會被轉換為true;
Number類型建議永遠都不要使用Boolean對象
valueOf():返回對象表示的基本類型的數值;
toString():返回字符串形式的數值,可以為其傳遞一個表示基數的參數,告訴它返回幾進制數值的字符串形式;
toFixed():會按照指定的小數位返回數值的字符串表示,這個方法很適合處理貨幣值;
toExponential():該方法返回以指數表示法(也稱e表示法)表示的數值的字符串形式;
toPrecision():這個方法會根據要處理的數值決定到底是調用toFixed()還是toExponential(),這三個方法都可以通過向上向下舍入,做到以最準確的形式來表示帶有正確小數位的值。這個方法接收一個參數,即表示數值的所有數字的位數(不包括指數部分)
String類型String類型的每一個實例都有一個length屬性,表示字符串中包含多少個字符。即使字符串中包含雙字節字符(不是占一個字節的ASCII字符),每個字符也仍然算一個字符。
字符方法兩個用于訪問字符串中特定字符的方法是:charAt()和charCodeAt()。這兩個方法都接收一個參數,即基于0的字符位置
charAt():這個方法以單字符串的形式返回給定位置的那個字符;
charCodeAt():這個方法以字符編碼的形式返回給定位置的那個字符;
ES5中還定義了,可以使用方括號加數字索引([1])來訪問字符串中特定位置;
字符串操作方法concat():用于將一個或多個字符串拼接起來,返回拼接得到的新字符串,它不會影響原字符串;
ES還提供了3個基于子字符串創建新字符串的方法:slice()、substr()和substring()。
這三個方法都會返回被操作字符串的一個子字符串,而且也都接受一或兩個參數,第一個參數指定字符串的開始位置;
slice()和substring()的第二個參數指定的是子字符串最后一個字符后面的位置;
substr()的第二個參數指定的是返回的字符個數;
這三個方法都不會影響原字符串
在給這些方法傳遞負值的情況下,slice()方法會將傳入的負值與字符串的長度相加,substr()方法將負的第一個參數加上字符串的長度,而將第二個參數轉換為0,substring()方法會把所有負值參數都轉換為0;
字符串位置方法有兩個可以從字符串中查找子字符串的方法:indexOf()和lastIndexOf()。這兩個方法都是從一個字符串中搜索給定的子字符串,然后返子字符串的位置(如果沒有找到該子字符串,則返回-1)
indexOf()方法從字符串的開頭向后搜索子字符串,而lastIndexOf()方法是從字符串的末尾向前搜索子字符串;
這兩個方法都可以接收第二個參數,表示從字符串中的哪個位置開始搜索;
trim()ES5為所有字符串定義了trim()方法。這個方法會創建一個字符串的副本,刪除前置及后綴的所有空格,然后返回結果。
由于trim()返回的是字符串的副本,所以不影響原始字符串
ECMAScript設計大小寫轉換的方法有四個toLowerCase、toLocaleLowerCase()、toUpperCase()和toLacleUpperCase()。其中toLowerCase和toUpperCase()是兩個經典方法,而toLocaleLowerCase()和toLacleUpperCase()方法則是針對特定地區的實現。
字符串的模式匹配方法match():在字符串上調用這個方法本質上與調用RegExp的exec()的方法相同。它只接受一個參數,要么是一個正則表達式,要么是一個RegExp對象;
search():這個方法的唯一參數與match()方法的參數相同。這個方法返回字符串中第一個匹配項的索引,如果沒有找到匹配項則返回-1,而且search()方法始終是從字符串開通向后查找模式;
replace():這個方法接收兩個參數,第一個參數可以是一個RegExp對象或者一個字符串(這個字符串不會被轉換成正則表達式),第二個參數可以是一個字符串或者一個函數。
如果第一個參數是字符串,那么只會替換第一個子字符串,想要替換所有的子字符串唯一的方法就是提供一個正則表達式,而且要指定全局(g)標志;
這個方法的第二個參數也可以使一個函數。在只有一個匹配項的情況下,會向這個函數傳遞3個參數:模式的匹配項、模式匹配項在字符串中的位置和原始字符串;
這個方法不會影響原字符串;
split():這個方法可以基于指定的分隔符將一個字符串分割成多個子字符串,并將結果放在一個數組中,分隔符可以是字符串,也可以是一個RegExp對象。split()方法可以接受可選的第二個參數,用于指定數組的大小,以便確保返回的數組不會超過既定大小。
localeCompare()這個方法比較兩個字符串,并返回下列值中的一個:
如果字符串在字母表中應該排在字符串參數之前,則返回一個負數(大多情況下是-1);
如果字符串等于字符串參數,則返回0;
如果字符串在字母表中應該排在字符串參數之后,則返回一個正數(大多情況下是1);
formCharCode()String構造函數本身還有一個靜態方法:fromCharCode()。這個方法的任務是接收一或多個字符編碼,然后將它們轉換成一個字符串。
單體內置對象由ECMAScript實現提供的,不依賴于宿主環境的對象,這些對象在ECMAScript程序執行之前就已經存在了
Global對象所有在全局作用域中定義的屬性和函數,都是Global對象的屬性。
URI編碼Global對象的encodeURI()和encodeURIComponent()方法可以對URI進行編碼,以便發送給瀏覽器
encodeURI()主要用于整個URI,而encodeURIComponent()主要用于對URI中的某一段進行編碼;
它們的主要區別在于,encodeURI()不會對本身屬于URI的特殊字符進行編碼,例如冒號、正斜杠、問號和井字號;而encodeURIComponent()則會對它發現的任何非標準字符進行編碼;
decodeURI()只能對使用encodeURI()替換的字符進行解碼,同樣的decodeURIComponent()能夠解碼使用encodeURIComponent()編碼的所有字符,即它可以解碼任何特殊字符的編碼;
eval()方法這個方法就像一個完整的ECMAScript解析器。
它只接收一個參數,即要執行的ECMAScript字符串;
通過eval()執行的代碼被認為是包含該次調用的執行環境的一部分,因此被執行的代碼具有與該執行環境相同的作用域鏈;
在eval()中創建的任何變量都不會被提升
Global對象的屬性嚴格模式下,在外部訪問不到eval()中創建的任何變量或函數
特殊的值undefined、NaN以及Infinity都是Global對象的屬性;
所有原生引用類型的構造函數,也都是Global對象的屬性;
ES5明確禁止給undefined、NaN和Infinity賦值,這樣做即使在非嚴格模式下也會導致錯誤;
window對象Web瀏覽器將這個全局對象作為window對象的一部分加以實現。在全局作用域中聲明的所有變量和函數,就都成為了window對象的屬性。
Math對象在沒有給函數明確指定this值的情況下,this值等于Global對象
ECMAScript還為保存數學公式和信息提供了一個公共位置,即Math對象
min()和max()這兩個方法用于確定一組數值中的最小值和最大值。這兩個方法都可以接受人一多個數值參數;
舍入方法要找到數組中的最大最小值,可以使用:Math.max.apply(Math,arr)
Math.ceil()執行向上攝入,即它總是將數值向上舍入為最接近的整數;
Math.floor()執行向下舍入,即它總是將數值向下舍入為最接近的整數;
Math.round()執行標準舍入,即它總是將數值四舍五入為最接近的整數;
random()方法Math.random()方法返回大于等于0小于1的一個隨機數
可以利用這個方法從某個整數范圍內隨機選擇一個值
值 = Math.floor(Math.random() * 可能值的總數 + 第一個可能的值)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/86437.html
摘要:對數組中的每一項運行給定函數,返回該函數會返回的項組成的數組。這些類型與其他引用類型相似,但同時也具有與各自的基本類型相應的特殊行為。此外,所有原生引用類型的構造函數,像和,也都是對象的屬性。 1 Object類型 創建對象實例: new操作符后跟Object構造函數 ver person = new Object(); person.name = Nicolas; person.ag...
摘要:跳過元素流還支持方法,返回一個扔掉了前個元素的流。歸約到目前為止,我們見到過的終端操作都是返回一個之類的或對象等。這樣的查詢可以被歸類為歸約操作將流歸約成一個值。通過反復使用加法,你把一個數字列表歸約成了一個數字。 使用流 在上一篇的讀書筆記中,我們已經看到了流讓你從外部迭代轉向內部迭代。這樣,你就用不著寫下面這樣的代碼來顯式地管理數據集合的迭代(外部迭代)了: /** * 菜單 ...
摘要:本章是該書的第五章主要講了方法引用和收集器方法引用形如這樣的表達式可以簡寫為這種簡寫的語法被稱為方法引用方法引用無需考慮參數因為一個方法引用可以在不同的情況下解析為不同的表達式這依賴于的推斷方法引用的類型方法引用可以分為四類引用靜態方法 本章是該書的第五章, 主要講了方法引用和收集器 方法引用 形如: artist -> artist.getName() (String arg) ->...
摘要:第三個問題查找所有來自于劍橋的交易員,并按姓名排序。第六個問題打印生活在劍橋的交易員的所有交易額。第八個問題找到交易額最小的交易。 付諸實戰 在本節中,我們會將迄今學到的關于流的知識付諸實踐。我們來看一個不同的領域:執行交易的交易員。你的經理讓你為八個查詢找到答案。 找出2011年發生的所有交易,并按交易額排序(從低到高)。 交易員都在哪些不同的城市工作過? 查找所有來自于劍橋的交易...
摘要:創建一個新對象將構造函數的作用域賦給新對象因此就指向了這個新對象執行構造函數中的代碼為這個新對象添加屬性返回新對象。 本章內容 理解對象屬性 理解并創建對象 理解繼承 ECMA-262把對象定義為:無序屬性的集合,其屬性可以包含基本值、對象或者函數 理解對象 創建對象 創建自定義對象的最簡單方式就是創建一個Object的實例,再為它添加屬性和方法。 var person = new...
閱讀 1385·2019-08-30 12:54
閱讀 1870·2019-08-30 11:16
閱讀 1612·2019-08-30 10:50
閱讀 2447·2019-08-29 16:17
閱讀 1266·2019-08-26 12:17
閱讀 1377·2019-08-26 10:15
閱讀 2387·2019-08-23 18:38
閱讀 784·2019-08-23 17:50