摘要:對數組中的每一項運行給定函數,返回該函數會返回的項組成的數組。這些類型與其他引用類型相似,但同時也具有與各自的基本類型相應的特殊行為。此外,所有原生引用類型的構造函數,像和,也都是對象的屬性。
1 Object類型
創建對象實例:
new操作符后跟Object構造函數
ver person = new Object(); person.name = "Nicolas"; person.age = 29;
對象字面量表示法
var person = { name : "Nicholas", age : 29 }
2 Array類型通過對象字面量定義對象時,實際上不會調用Object構造函數
創建數組:
使用Array構造函數
var colors = new Array(20); //new可以省略,20表示數組長度
數組字面量表示法
var colors = ["red", "blue", "green"];2.1 檢測數組
使用instanceof操作符
console.log(value instanceof Array); //只有一個全局作用域時使用
如果網頁中包含多個框架,那實際上就存在兩個以上不同的全局執行環境,從而存在兩個以上不同版本的Array構造函數
使用Array.isArray()方法
console.log(Array.isArray(value)); //確定value是否數值,不管它是在哪個全局執行環境中創建的2.2 轉換方法
toLocaleString()
toString()
valueOf()
join()
var colors = ["red", "green", "blue"]; console.log(colors.join("||")); //red||green||blue2.3 棧方法
push():在數組末尾添加項,返回數組長度
pop():移除數組最后一項,返回移除的項
2.3 隊列方法shift():移除數組第一項,返回移除的項
unshift():在數組前端添加項,返回數組長度
2.5 重排序方法reverse():反轉數組的順序
sort():按照升序排列數組項
sort()方法會調用每個數組項的toString()轉型方法,然后比較得到的字符串
可接收一個比較函數作為參數,比較函數接收兩個參數,如果第一個參數應該位于第二個之前則返回一個負數,如果兩個參數相等則返回0,如果第一個參數應該位于第二個之后則返回一個正數;如下:
function compare(value1, value2){ return value2 - value1; //降序排序 }2.6 操作方法
concat():用于拼接數組
slice():用于獲取數組中的某幾個項
splice():主要用途是向數組的中部插入項
2.7 位置方法indexOf():從數組的開頭查找某一項
lastIndexOf():從數組的末尾查找某一項
2.8 迭代方法兩個方法都返回要查找的項在數組中的索引,沒找到的情況下返回-1
every():對數組中的每一項運行給定函數,如果該函數對每一項都返回true,則返回true。
filter():對數組中的每一項運行給定函數,返回該函數會返回true的項組成的數組。
forEach():對數組中的每一項運行給定函數,這個方法沒有返回值。
map():對數組中的每一項運行給定函數,返回每次函數條用的結果組成的數組
some():對數組中的每一項運行給定函數,如果該函數對任一項返回true,則返回true。
2.9 歸并方法以上方法都不會修改數組中的包含的值
以下兩個方法都會迭代數組的所有項,然后構建一個最終返回的值。這兩個方法都接收兩個參數:一個在每一項上調用的函數和(可選的)作為歸并基礎的初始值。傳入的函數接收4個參數:前一個值、當前值、項的索引和數組對象。這個函數的返回值會作為參數自動傳給下一項。
reduce():從數組第一項開始,逐個遍歷到最后
reduceRight():從數組的最后一項開始,向前遍歷到第一項
var values = [1,2,3,4,5]; var sum = values.reduce(function(prev, cur, index, array){ return prev + cur; }); alert(sum); //15
5 Function 類型reduceRight()除了遍歷方向的不同之外,與reduce()方法完全一致。
函數是對象,因此函數名實際上也是一個指向函數對象的指針,不會與某個函數綁定。
function sum(num1, num2){ //會先進行函數聲明提升 return num1 + num2; } var sum = function(num1, num2){ //不會進行函數聲明提升 return num1 + num2; } var sum = new Function("num1", "num2", "return num1 + num2"); //不推薦,會導致解析兩次代碼5.3 作為值的函數
因為ECMAScript中的函數名本身就是變量,所以函數也可以作為值來使用。也就是說,不僅可以像傳遞參數一樣把一個函數傳遞給另一個函數,也可以將一個函數作為另一個函數的結果返回。
function createComparisonFunction(propertyName){ return function(object1, object2){ var value1 = object1[propertyName]; var value2 = object2[propertyName]; } if(value1 < value2){ return -1; }else if(value1 > value2){ return 1; }else{ return 0; }; } var data = [{name : "Zachary", age : 28}, {name : "Nicholas", age : 29}]; data.sort(createComparisonFunction("name")); console.log(data[0].name); //Nicholas data.sort(createComparisonFunction("age")); console.log(data[0].name); //Zachary5.4 函數內部屬性
在函數內部,有兩個特殊的對象:arguments和this
arguments有一個名叫callee的屬性,該屬性是一個指針,指向擁有這個arguments對象的函數
function factorial(num){ if(num <= 1){ return 1; }else{ return num * arguments.callee(num - 1); //解除耦合 } }
函數內部的另一個特殊對象是this,this引用的是函數執行的環境對象——或者也可以說是this值(當在網頁全局作用域中調用函數時,this對象引用的就是window)
ECMAScript5也規范化了另一個函數對象的屬性:caller。這個屬性中保存著調用當前函數的函數的引用,如果是在全局作用域中調用當前函數,它的值為null。
function outer(){ inner(); } function inner(){ console.log(arguments.callee.caller); //為了實現更松散的耦合 } outer();
5.5 函數屬性和方法當函數在嚴格模式下運行是,訪問arguments.callee會導致錯誤。ECMAScript 5 還定義了arguments.caller屬性,但在嚴格模式下訪問它也會導致錯誤,而在非嚴格模式下這個屬性始終是undefined。定義arguments.callee屬性是為了分清arguments.caller和函數的caller屬性。以上變化都是為了加強這門語言的安全性,這樣第三方代碼就不能在相同的環境里窺視其他代碼了。
嚴格模式還有一個限制:不能為函數的caller屬性賦值,否則會導致錯誤。
每個函數都包含兩個屬性:length和prototype
length:表示函數希望接受的命名參數的個數
prototype:對于ECMAScript中的引用類型而言,prototype是保存它們所有實例方法的真正所在
諸如toStr()和valueOf()等方法實際上都保存在prototype名下,只不過是通過各自對象的實例訪問罷了。在ECMAScript 5 中,prototype屬性是不可枚舉的,因此使用for-in無法發現
每個函數都包含兩個非繼承而來的方法:apply()和call()。這兩個方法的用途都是在特定的作用域中調用函數,實際上等于設置函數體內this對象的值
apply():接收兩個參數,第一個是在其中運行函數的作用域,第二個是參數數組
call():與apply()作用相同,變化在于傳遞給函數的參數必須逐個列舉出來
在不給函數傳遞參數的情況下,使用哪個方法都無所謂
window.color = "red"; var o = {color : "blue"}; function sayColor(){ console.log(this.color); } sayColor(); //red sayColor.call(this); //red sayColor.call(window); //red sayColor.call(o); //blue
使用call()(或apply())來擴充作用域的最大好處,就是對象不需要與方法有任何耦合關系
ECMAScript還定義了一個方法:bind()。這個方法會創建一個函數的實例,其this值會被綁定到傳給bind()函數的值
window.color = "red"; var o = {color : "blue"}; function sayColor(){ console.log(this.color); } var objectSayColor = sayColor.bind(o); objectSayColor(); //blue
每個函數繼承的toLocaleString()、toString()和valueOf()方法始終都返回函數的代碼
6 基本包裝類型為了便于操作基本類型值,ECMAScript還提供了3個特殊的引用類型:Boolean、Number和String。這些類型與其他引用類型相似,但同時也具有與各自的基本類型相應的特殊行為。實際上,每當讀取一個基本類型值得時候,后臺就會創建一個對應的基本包裝類型的對象,從而讓我們能夠調用一些方法來操作這些數據
var s1 = "some text"; var s2 = s1.substring(2);
進行以上操作,后臺會自動完成以下一系列處理:
創建String類型的一個實例;
在實例上調用指定的方法;
銷毀這個實例。
可以將以上三個步驟想象成是執行了下列ECMAScript代碼:
var s1 = new String("some text"); var s2 = s1.substring(2); s1 = null;
除非必要時,否則不推薦顯式地調用Boolean、Number和String來創建基本包裝類型的對象,因為這種做法很容易讓人分不清自己是在處理基本類型還是引用類型的值。對基本包裝類型的實例調用typeof會返回"object",而且所有基本包裝類型的對象在轉換為布爾類型時值都是true
Object構造函數也會像工廠方法一樣,根據傳入值的類型返回相應基本包裝類型的實例:
var obj = new Object("some text"); console.log(obj instanceof String); //true
使用new調用基本包裝類型的構造函數,與直接調用同名的轉型函數時不一樣的:
var value = "25"; var number = Number(value); //轉型函數 console.log(typeof number); //"number" var obj = new Number(value); //構造函數 console.log(typeof obj); //"object"6.1 Boolean類型
Boolean類型是與布爾值對應的引用類型
var booleanObject = new Boolean(true);
boolean類型的常見問題:
var falseObject = new Boolean(false); var result = falseObject && true; console.log(result); //true var falseValue = false; result = falseValue && true; console.log(result); //false console.log(typeof falseObject); //object console.log(typeof falseValue); //boolean console.log(falseObject instanceof Boolean); //true console.log(falseValue instanceof Boolean); //false6.2 Number 類型
Number類型是與數字值對應的引用類型
var numberobject = new Number(10);
可用toString()方法傳遞一個表示基數的參數,告訴它返回幾進制數值的字符串形式
除了繼承的方法(valueOf()、toLocaleString()、toString())外,Number類型還提供了一些用于將數值格式化為字符串的方法:
toFixed():按照指定的小數位返回數值的字符串表示
toExponential():該方法返回以指數表示法(e表示法)表示的數值的字符串形式。toExponential()也接收一個參數,指定輸出結果中的小數位數
toPrecision():該方法可能會返回固頂大小(fixed)格式,也可能返回指數(exponential)格式;具體規則是看哪種格式最合適。這個方法接收一個參數,即表示數值的所有數字的位數(不包括指數部分)
6.3 String 類型String類型是字符串的對象包裝類型
var stringObject = new String("hello world");
String類型的每個實例都有一個length屬性,表示字符串中包含多個字符
var stringValue = "杰神 ,shuai /" "; console.log(stringValue.length); //12
7 單體內置對象即使字符串中包含雙字節字符(不是占一個字節的ASCII字符),每個字符也仍然算一個字符
ECMA-262對內置對象的定義是:“由ECMAScript實現提供的、不依賴于宿主環境的對象,這些對象在ECMAScript程序執行之前就已經存在。”意思就是說,開發人員不必顯式地實例化內置對象,因為它們已經實例化了。除了Object、Array和String等內置對象,ECMA-262還定義了兩個單體內置對象:Global和Math
7.1 Global對象JavaScript原生對象及擴展
Global(全局)對象可以說是ECMAScript中最特別的一個對象了,因為不管從什么角度上看,這個對象都是不存在的。不屬于任何其他對象的屬性和方法,最終都是它的屬性和方法。諸如isNaN()、isFinite()、parseInt()以及parseFloat(),實際上都是Global對象的方法
Global對象還包含其他一些方法:
Global對象的encodeURI()和encodeURIComponent()方法可以對URI(Uniform Resource Identifiers,通用資源標識符)進行編碼,以便發送給瀏覽器
eval():該方法就像是一個完整的ECMAScript解析器,它只接受一個參數,即要執行的ECMAScript(或JavaScript)字符串
eval("alert("hi")"); //上行代碼的作用等價于下面這行代碼 alert("hi");
特殊的值undefined、NaN、以及Infinity都是Global對象的屬性。此外,所有原生引用類型的構造函數,像Object和Function,也都是Global對象的屬性。
7.1.4 window對象ECMAScript 5 明確禁止給undefined、NaN和Infinity賦值,這樣做即使在非嚴格模式下也會導致錯誤
ECMAScript雖然沒有指出如何訪問Global對象,但Web瀏覽器都是將這個全局對象作為window對象的一部分加以實現的。因此,在全局作用域中聲明的所有變量和函數,都成為了window對象的屬性
JavaScript中的window對象除了扮演ECMAScript規定的Global對象的角色外,還承擔了很多別的任務
另一種取得Global對象的方法是使用以下代碼:
var global = function(){ return this; }();7.2 Math對象
ECMAScript還為保存數學公式和信息提供了一個公共位置,即Math對象。與我們在JavaScript直接編寫的計算功能相比,Math對象提供的計算功能執行起來要快得多。Math對象中還提供了輔助完成這些計算的屬性和方法
7.2.1 Math對象的屬性Math.PI:π的值
……
7.2.2 min()和max()方法min()和Max()方法用于確定一組數值中的最小值和最大值。這兩個方法都可以接收任意多個數值參數
7.2.3 舍入方法Math.ceil()
Math.floor()
Math.round()
7.2.4 random()方法random()方法返回大于等于0小于1的一個隨機數。
套用下面的公式,就可以利用Math.random()從某個整數范圍內隨機選擇一個值
值 = Math.floor(Math.random()) * 可能值的總數 + 第一個可能的值
var num = Math.floor(Math.random() * 9 + 2); //介于2到10之間的值
function selectFrom(lowerValue, upperValue){ var choices = upperValue - lowerValue + 1; return Math.floor(Math.random() * choices + lowerValue); var num = selectFrom(2, 10); console.log(num); //介于2到10之間的值 } var colors = ["red", "green", "blue"]; var color = colors[selectFrom(0, colors.lenght-1)]; console.log(color); //可能是數組中包含的任何一個字符串
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/82431.html
摘要:高程讀書筆記第五章類型創建實例的方式有兩種。第一種是使用操作符后跟構造函數,另一種方式是使用對象字面量表示法。 JS高程讀書筆記--第五章 Object類型 創建Object實例的方式有兩種。第一種是使用new操作符后跟Object構造函數,另一種方式是使用對象字面量表示法。 在通過對象字面量定義對象時,實際上不會調用Object構造函數 訪問對象屬性時可以使用點表示法和方括號表示法。...
摘要:類型沒有重載聲明了兩個同名函數,而結果則是后面的函數覆蓋了前面的函數。引用的是函數據以執行的環境對象函數屬性和方法表示函數希望接收的命名參數的個數。而自動創建的基本包裝類型的對象,則只存在于一行代碼的執行瞬間,然后立即被銷毀。 Function類型 沒有重載 聲明了兩個同名函數,而結果則是后面的函數覆蓋了前面的函數。 var addSomeNumber = function (num)...
摘要:修飾符包包的概述和使用其實就是文件夾作用對類進行分類管理包的定義格式格式包名多級包用分開范例帶包的類編譯和執行手動建包按照以前的格式編譯文件手動創建包建立文件夾然后在下建立文件夾把文件放到包的最里面把文件放到下的這個文件夾下帶包 1 修飾符1.1 包1.1.1 包的概述和使用其實就是文件夾作用:對類進行分類管理...
摘要:在編寫處理對象的函數時,必須做出決定是希望這個函數修改其對象實參的的屬性,還是返回新對象。高階函數就是以形參或者返回函數的函數,他們可以簡化集中程序設計任務,可以減少腳本中的共同代碼數量。編寫一個函數,返回一個給定字符在字符串中的出現次數。 主要總結: 函數值是一個帶有參數的代碼塊,可以根據需要任意運行(調用) 調用一個函數,我們會向它的形參傳送實參。多余的形參會被轉換為undefi...
閱讀 3380·2021-11-22 09:34
閱讀 650·2021-11-19 11:29
閱讀 1350·2019-08-30 15:43
閱讀 2232·2019-08-30 14:24
閱讀 1867·2019-08-29 17:31
閱讀 1223·2019-08-29 17:17
閱讀 2617·2019-08-29 15:38
閱讀 2729·2019-08-26 12:10