摘要:引用類型有時(shí)候也被稱為對(duì)象定義。類型目前看到大多數(shù)引用類型都是類型的實(shí)例。第一種是使用操作符后跟一個(gè)構(gòu)造函數(shù)。創(chuàng)建數(shù)組的基本方式有兩種第一種是通過(guò)構(gòu)造函數(shù)的方式,第二種是是通過(guò)數(shù)組字面量的方式進(jìn)行創(chuàng)建。
前言
引用類型的值是引用類型的一個(gè)實(shí)例,引用類型是一種數(shù)據(jù)結(jié)構(gòu),用于將數(shù)據(jù)和功能組織到一起。它通常被稱為類。引用類型有時(shí)候也被稱為對(duì)象定義。對(duì)象是某個(gè)引用類型的實(shí)例。新對(duì)象是使用new操作符后跟一個(gè)構(gòu)造函數(shù)創(chuàng)建(構(gòu)造函數(shù)本身就是一個(gè)函數(shù))。
目前看到大多數(shù)引用類型都是Object類型的實(shí)例。object類型在應(yīng)用程序中存儲(chǔ)和傳輸數(shù)據(jù)而言,是一個(gè)理想的選擇。
創(chuàng)建Object實(shí)例的方式有兩種。第一種是使用new操作符后跟一個(gè)構(gòu)造函數(shù)。第二種是使用對(duì)象字面量的形式創(chuàng)建。如下:
//1. new 操作符后跟構(gòu)造函數(shù)創(chuàng)建Object實(shí)例 var person = new Object() person.name = "nike" person.age = "25" //2. 對(duì)象字面量的形式創(chuàng)建Object實(shí)例,在通過(guò)對(duì)象字面量的方式定義對(duì)象時(shí),實(shí)際上是不會(huì)調(diào)用Object構(gòu)造函數(shù)。 var person = { name: "nike", age: 29 //注意這里后面不能加逗號(hào)了,因?yàn)闀?huì)在IE7和Opera中導(dǎo)致錯(cuò)誤 }2. Array類型
JavaScript中,數(shù)組存儲(chǔ)的是一組有序列表,與其他語(yǔ)言不同的是Js中數(shù)組的每一項(xiàng)是可以存儲(chǔ)任何類型的數(shù)據(jù)。而且Js中數(shù)組的大?。ㄩL(zhǎng)度)是可以動(dòng)態(tài)調(diào)整。
創(chuàng)建數(shù)組的基本方式有兩種:第一種是通過(guò)Array構(gòu)造函數(shù)的方式,第二種是是通過(guò)數(shù)組字面量的方式進(jìn)行創(chuàng)建。如下:
var arr = new Array() //創(chuàng)建了一個(gè)空數(shù)組存儲(chǔ)到變量arr中 : [] var arr = new Array(4) //創(chuàng)建了一個(gè)數(shù)組長(zhǎng)度為5,每個(gè)元素為undefined的數(shù)組: [undefined,undefined,undefined,undefined,undefined] var arr = new Array(1,2,3) //創(chuàng)建一個(gè)長(zhǎng)度為3,數(shù)組元素分別為1,2,3的數(shù)組:[1,2,3]
注意,在使用構(gòu)造函數(shù)創(chuàng)建數(shù)組的時(shí)候可以省略掉new操作符:
var colors = Array(3) var names = Array("gray")
再看下數(shù)組字面量的方式創(chuàng)建數(shù)組:
var colors = ["red","blue","yellow"] var arr = [] var value = [1,2,]//這樣可能會(huì)創(chuàng)建長(zhǎng)度為2或3的數(shù)組,不支持這樣!! var opt = [,,,,,]//這樣可能會(huì)創(chuàng)建長(zhǎng)度為5或6的數(shù)組,不支持這樣??!
在只用數(shù)組字面量的形式創(chuàng)建數(shù)組時(shí)和對(duì)象一樣,也不會(huì)調(diào)用Array構(gòu)造函數(shù)。
數(shù)組中的項(xiàng)數(shù)是可以動(dòng)態(tài)改變的,看下下面的例子及說(shuō)明:
var arr = [1,2,3] arr[5] = 5 console.log(arr) //"[1,2,3,undefined,undefined,5]" var arr = [1,2,3] arr.length = 2 console.log(arr) // [1, 2] var arr = [1,2,3] arr.lenght = 5 console.log(arr) //"[1,2,3,undefined,undefined,undefined]"
檢測(cè)數(shù)組
第一種通過(guò)instanceof操作符:
arr instanceof Array
第二種通過(guò) Array.isArray()方法,這個(gè)方法最終確定某個(gè)值到底是不是數(shù)組,而不管它是在哪個(gè)全局環(huán)境中創(chuàng)建的。
Array.isArray(arr)
轉(zhuǎn)換方法
所有對(duì)象都具有 toLocaleString(), toString(), valueOf()方法。其中調(diào)用數(shù)組的 toString() 方法會(huì)返回由數(shù)組中每個(gè)值的字符串形式拼接而成的一個(gè)由逗號(hào)分隔的字符串,而調(diào)用valueOf()返回的還是數(shù)組。實(shí)際上為了創(chuàng)建這個(gè)字符串會(huì)調(diào)用數(shù)組每一項(xiàng)的toString()方法。
var colors = ["red", "blue", "green"] console.log(colors.toString()) //"red, blue, green" console.log(colors.valueOf()) //["red", "blue", "green"] console.log(colors) //["red", "blue", "green"] alert(colors)// alert接受字符串為參數(shù),所有在后臺(tái)會(huì)調(diào)用toString方法
toLocaleString()方法經(jīng)常也會(huì)返回和toString()和valueOf()方法相同的值,當(dāng)調(diào)用數(shù)組的toLocaleString()方法時(shí),它會(huì)創(chuàng)建一個(gè)數(shù)組值得以逗號(hào)分隔的字符串。而與前兩個(gè)方法不同的是它是調(diào)用每一項(xiàng)的toLocaleString()方法,而不是toString方法。
var person1 = { toLocaleString: function(){ return "nike"}, toString: function () {return "lining"} } var person2 = { toLocaleString: function(){ return "apple"}, toString: function () {return "orange"} } var arr = [person1, person2] alert(arr) // "lining, orange" alert(arr.toString()) "lining, orange" alert(arr.toLocaleString()) //"nike, apple"
join()方法可以將組數(shù)組合并為一組字符串然后返回。
var arr = [1,2,3] var a = arr.join() //"1,2,3" var b = arr.join("|") // "1|2|3"
注意:如果數(shù)組中某一項(xiàng)是null或者undefined,那么該值在join(),toLocaleString(), toString()和valueOf()方法返回的結(jié)果中用空字符串表示。
棧方法
push(), pop()分別是在數(shù)組最后添加元素和從末尾移除最后一項(xiàng),然后修改數(shù)組的長(zhǎng)度。
首先看下push()方法,可以從數(shù)組后推入任意項(xiàng),且可以為任意數(shù)據(jù)類型。
var arr = [1,2,3,4] var res = arr.push(5) console.log(arr) //[1,2,3,4,5] console.log(res) // 5 var arr2 = [1,2,3] var res = arr2.push(4,5) console.log(arr2) // [1,2,3,4,5] console.log(res) // 5 var arr3 = [1,2,3] var res = arr3.push([1,2]) console.log(arr3) // [1,2,3, [1,2]] console.log(res) // 4
在看下pop()方法,會(huì)移除數(shù)組最后一項(xiàng),并返回移除項(xiàng)。
var arr = [1,2,3,4,5] var res = arr.pop() //5
注意:以上的push()和pop()方法都會(huì)改變?cè)瓟?shù)組的數(shù)據(jù)結(jié)構(gòu)。
隊(duì)列方法
數(shù)組的隊(duì)列方法有shift()和unshift()。shift()方法是從數(shù)組前端移除一項(xiàng)并返回該項(xiàng)。unshift()是在數(shù)組前端添加任意項(xiàng),并返回?cái)?shù)組長(zhǎng)度。
var arr = [1,2,3,4] var res = arr.unshift(1) console.log(arr) // [1,1,2,3,4] console.log(res) // 5 var arr1 = [1,2,3,4] var res = arr.unshift(1,2) console.log(arr1) //[1,2,1,2,3,4] console.log(res) //6 var arr2 = [1,2,3] var res = arr2.unshift([1,2]) console.log(arr2) //[[1,2], 1, 2, 3] console.log(res) // 4
再看下shift()方法,從數(shù)組最前面移除一項(xiàng),然后返回該項(xiàng):
var arr = [1,2,3,4] var res = arr.shift() console.log(arr) //[2,3,4] console.log(res) // 1
重排序方法
數(shù)組中有兩個(gè)排序方法reverse()和sort()。reverse()是反轉(zhuǎn)數(shù)組項(xiàng)的順序,會(huì)改變?cè)瓟?shù)組。
var arr = [1,2,3,4] arr.reverse() //[4,3,2,1] console.log(arr) //[4,3,2,1]
sort()方法默認(rèn)是按照升序排列數(shù)組項(xiàng),sort方法會(huì)調(diào)用每一項(xiàng)的toString方法,然后比較得到的字符串,以確定如何排序。
var val = [0,1,5,10,15] val.sort() console.log(val) //[0,1,10,15,5]
然而,sort可以接受一個(gè)比較函數(shù)作為參數(shù),以便指定哪個(gè)值位于哪個(gè)值前面或者后面,比較函數(shù)接受兩個(gè)參數(shù),如果第一個(gè)參數(shù)應(yīng)該位于第二個(gè)之前則返回一個(gè)負(fù)數(shù),如果兩個(gè)參數(shù)相等則返回0,如果第一個(gè)參數(shù)位于第二個(gè)參數(shù)后,則返回正數(shù)。
操作方法
1. concat()
關(guān)于數(shù)組的操作方法有很多,除了上面說(shuō)的幾個(gè)方法外,這里要介紹一些常用的方法。
首先看下 concat() 這個(gè)方法,該方法會(huì)基于當(dāng)前數(shù)組的所有項(xiàng)再創(chuàng)建一個(gè)新的數(shù)組,具體的說(shuō)就是該方法會(huì)創(chuàng)建一個(gè)當(dāng)前數(shù)組副本,然后將接受到的數(shù)據(jù)添加到這個(gè)副本末尾,最后返回新的數(shù)組。在沒(méi)有個(gè)concat方法傳參數(shù)的情況下,它只是復(fù)制當(dāng)前數(shù)組并返回副本,如果傳遞給concat方法的是一個(gè)或者多個(gè)數(shù)組,則該方法是將這些數(shù)組中的每一項(xiàng)都添加到結(jié)果數(shù)組中,如果傳遞的不是數(shù)組,這些值就會(huì)簡(jiǎn)單的被添加到數(shù)組末尾。
var arr= [1,2,3,4] var arr2 = arr.concat("yellow", ["blue", "red"]) console.log(arr) //[1,2,3,4] console.log(arr2) //[1,2,3,4,"yellow", "blue", "red"]
2. slice()
再看下第二個(gè)方法slice()它能基于當(dāng)前數(shù)組的一個(gè)或者多個(gè)項(xiàng)創(chuàng)建一個(gè)新數(shù)組。slice()可以接受一個(gè)或者兩個(gè)參數(shù),即要返回項(xiàng)的起始和結(jié)束位置,只有一個(gè)參數(shù)的情況下,slice會(huì)返回從該參數(shù)指定位置開(kāi)始到當(dāng)前數(shù)組末尾的所有項(xiàng)。如果是兩個(gè)參數(shù),會(huì)返回起始位置到結(jié)束位置之間的項(xiàng)(不包括結(jié)束位置)。注意,slice也不會(huì)影響原數(shù)組。
var arr = [1,2,3,4,5,6,7] var res1 = arr.slice(1) //[2,3,4,5,6,7] var res2 = arr.slice(1,4)//[2,3,4]
看下幾個(gè)特殊情況:
var arr = [1,2,3,4,5,6] var res1 = arr.slice(-3) //[4,5,6] var res2 = arr.slice(-6, -3) //[1,2,3] var res3 = arr.slice(4, 3) //[]
如上,如果傳的是負(fù)數(shù)的話是從后往前數(shù),如果第二個(gè)參數(shù)比第一個(gè)小的話則返回空數(shù)組。
3. splice()
這個(gè)方法可以對(duì)數(shù)組進(jìn)行刪除,插入,替換操作。注意該方法會(huì)改變?cè)瓟?shù)組
首先看下刪除功能:
var arr = [1,2,3,4,5] var res = arr.splice(0, 2) //從下標(biāo)0開(kāi)始刪除2個(gè)元素 console.log(arr) //[3,4,5] console.log(res) //[1,2]
再看下插入功能, 可以向指定位置插入任意數(shù)量的項(xiàng):
var arr = [1, 2, 3, 4, 5] var res = arr.splice(0, 0, 1,2,3) //可以插入多個(gè)和單個(gè)數(shù)據(jù) console.log(arr) //[1,2,3,1,2,3,4,5] console.log(res) //[],返回的是一個(gè)空數(shù)組
接下來(lái)再看下替換功能了,相信大家也知道該怎么去操作了:
var arr = [1,2,3,4,5] var res = arr.splice(0, 3, "a","b","c") console.log(arr) //["a", "b", "c", 4, 5] console.log(res) //[1, 2, 3]
splice始終會(huì)返回一個(gè)數(shù)組,該數(shù)組包含從原數(shù)組中刪除的項(xiàng),如果沒(méi)有刪除則返回一個(gè)空數(shù)組。
位置方法
數(shù)組中位置查找的方法有兩個(gè) indexOf和lastIndexOf() ,這兩個(gè)方法都接受兩個(gè)參數(shù),要查找的項(xiàng)和查找的起始位置。第二個(gè)參數(shù)是可選的,如果不傳分別表示從數(shù)組的開(kāi)頭和結(jié)束進(jìn)行查找。這兩個(gè)方法會(huì)返回查找到的項(xiàng)的位置下標(biāo),如果沒(méi)有找到的話則返回-1,在查找的時(shí)候會(huì)使用嚴(yán)格等于進(jìn)行查找(===)。
var arr = [1,2,3,4,5] console.log(arr.indexOf(1)) //返回0 console.log(arr.indexOf("1")) //返回-1, 因?yàn)槭腔趪?yán)格等于的。 var arr = [1, 2, 3, 4, 5, 1] arr.lastIndexOf(1) // 5 , 因?yàn)槭菑淖詈箝_(kāi)始查找
迭代方法
數(shù)組的迭代方法有5種,每個(gè)方法都接受兩個(gè)參數(shù):要在每一項(xiàng)上運(yùn)行的函數(shù)和運(yùn)行該函數(shù)的作用于對(duì)象(可選,影響this的值)。在每項(xiàng)上運(yùn)行的函數(shù)可以接受三個(gè)參數(shù):數(shù)組的每一項(xiàng),當(dāng)前項(xiàng)的下標(biāo),數(shù)組對(duì)象本身。
(1). 第一個(gè)迭代方法every():對(duì)數(shù)組的每一項(xiàng)運(yùn)行給定函數(shù),如果該函數(shù)對(duì)每一項(xiàng)都返回true,則返回true
var arr = [1, 2, 3, 4, 5] var res = arr.every(function(item, index, array) { if(item == 1 || item == 2) { return true }else { return false } }) console.log(res) //false var arr = [1, 2, 3, 4, 5] var res = arr.every(function(item, index, array) { return true }) console.log(res) //true
(2). 第二個(gè)迭代filter()方法,對(duì)數(shù)組的每一項(xiàng)運(yùn)行給定函數(shù),返回該函數(shù)會(huì)返回true的項(xiàng)。
var arr = [1, 2, 3, 4, 5] var res = arr.filter(function(item, index, array){ if(item == 1 || item == 3 || item == 5){ return true } }) console.log(res) //[1, 3, 5]
(3). 第三個(gè)迭代方法forEach(),對(duì)數(shù)組的每一項(xiàng)運(yùn)行給定函數(shù),沒(méi)有返回值。
var arr = [1, 2, 3, 4, 5] var res = arr.forEach(function(item, index, array) { return item+1 }) console.log(res) //undefined
(4). 第四個(gè)迭代方法map():對(duì)數(shù)組的每一項(xiàng)運(yùn)行函數(shù),返回函數(shù)每次調(diào)用的結(jié)果組成的數(shù)組。
var arr = [1, 2, 3, 4, 5, 6] var res = arr.map(funtion(item, index, array) { return item + "元" }) console.log(res) // ["1元", "2元", "3元", "4元", "5元", "6元"]
(5). 第五個(gè)迭代方法some():對(duì)數(shù)組的每一項(xiàng)執(zhí)行函數(shù),如果函數(shù)對(duì)任意一項(xiàng)返回true則返回true。
var arr = [1,2,3,4,5,6] var res = arr.some(function(item, index, array){ if(item > 3) { return true }else { return false } }) console.log(res) //true
歸并方法
這里還有兩個(gè)歸并數(shù)組的方法:reduce() 和reduceRight() ,這兩個(gè)方法會(huì)迭代數(shù)組中所有的項(xiàng),然后返回一個(gè)最終的值。其中reduce()方法從數(shù)組的第一項(xiàng)開(kāi)始遍歷直到數(shù)組的最后一項(xiàng)。而reduceRight() 則是從數(shù)組最后面開(kāi)始遍歷到第一項(xiàng)。
這兩個(gè)方法都有兩個(gè)參數(shù):在每一項(xiàng)上調(diào)用的函數(shù)和作為歸并基礎(chǔ)的初始值。然后在每一項(xiàng)上都會(huì)執(zhí)行的函數(shù)會(huì)接受到四個(gè)參數(shù):前一個(gè)值,當(dāng)前值,項(xiàng)的索引,數(shù)組對(duì)象。這個(gè)函數(shù)返回的任何值都會(huì)作為第一個(gè)參數(shù)自動(dòng)傳給下一項(xiàng)。第一次迭代發(fā)生做數(shù)組的第2項(xiàng)上,所以第一個(gè)參數(shù)是數(shù)組的第一項(xiàng),第二個(gè)參數(shù)就是數(shù)組的第二項(xiàng)。
var arr = [1, 2, 3, 4, 5]f var sun = arr.reduce(function(pre, next, index, arr) { return pre+next }) console.log(sun) //15
reduceRight() 只不過(guò)是從數(shù)組的后面開(kāi)始進(jìn)行,其他的操作都是一樣的。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/88575.html
摘要:內(nèi)存泄露內(nèi)存泄露概念在計(jì)算機(jī)科學(xué)中,內(nèi)存泄漏指由于疏忽或錯(cuò)誤造成程序未能釋放已經(jīng)不再使用的內(nèi)存。判斷內(nèi)存泄漏,以字段為準(zhǔn)。 本文是 重溫基礎(chǔ) 系列文章的第二十二篇。 今日感受:優(yōu)化學(xué)習(xí)方法。 系列目錄: 【復(fù)習(xí)資料】ES6/ES7/ES8/ES9資料整理(個(gè)人整理) 【重溫基礎(chǔ)】1-14篇 【重溫基礎(chǔ)】15.JS對(duì)象介紹 【重溫基礎(chǔ)】16.JSON對(duì)象介紹 【重溫基礎(chǔ)】1...
摘要:作用域鏈?zhǔn)潜WC對(duì)執(zhí)行環(huán)境有權(quán)訪問(wèn)的所有變量和函數(shù)的有序訪問(wèn)。如上,包含的作用域鏈包含它自己的變量對(duì)象和全局環(huán)境的變量對(duì)象,為什么能在函數(shù)內(nèi)訪問(wèn),這就是通過(guò)作用域鏈找的。 前言JavaScript的變量類型是弱類型的,在特定的時(shí)間內(nèi)保存一個(gè)特定的值,變量的值和數(shù)據(jù)類型可以在腳本的生命周期內(nèi)隨意改變。 1. 基本類型和引用類型的值 JavaScript包含兩種不同類型的值:基本類型和引用類...
摘要:今天把接下來(lái)引用類型中的一些內(nèi)容全部記錄完畢基本包裝類型為了便于操作基本類型值,還提供了種特殊的引用類型。這三種類型具有與各自的基本類型響應(yīng)的特殊行為。重寫后的返回對(duì)象表示的數(shù)值類型,另外兩個(gè)方法則返回字符串形式的數(shù)值。 今天把接下來(lái)引用類型中的一些內(nèi)容全部記錄完畢~ 基本包裝類型 為了便于操作基本類型值,JavaScript還提供了3種特殊的引用類型:Boolean, Number,...
摘要:創(chuàng)建一個(gè)日期對(duì)象中國(guó)標(biāo)準(zhǔn)時(shí)間在調(diào)用構(gòu)造函數(shù)而不傳參數(shù)的情況下,新創(chuàng)建的對(duì)象自動(dòng)獲得當(dāng)前日期和時(shí)間。日期格式化方法類型還有一些專門用于將日期格式化為字符串的方法中國(guó)標(biāo)準(zhǔn)時(shí)間下午以上的這些方法都會(huì)根據(jù)系統(tǒng)環(huán)境而異。 咱們接著上面一篇繼續(xù)~ 1. Date類型 JavaScript中的Date類型使用自UTC時(shí)間,1970年1月1日零時(shí)開(kāi)始的毫秒數(shù)來(lái)保存日期。創(chuàng)建一個(gè)日期對(duì)象: var no...
摘要:繼承了如上,我們通過(guò)方法借調(diào)了超類的構(gòu)造函數(shù),實(shí)際上是在新創(chuàng)建的實(shí)力環(huán)境下調(diào)用了構(gòu)造函數(shù)。組合繼承組合繼承的基本思想將原型鏈和借用構(gòu)造函數(shù)的技術(shù)組合到一塊,從而發(fā)揮二者之長(zhǎng)的一種繼承模式。繼承方法在上面這個(gè)例子中,構(gòu)造函數(shù)定義了兩個(gè)屬性和。 在ECMAScript中只支持實(shí)現(xiàn)繼承,而且實(shí)現(xiàn)繼承主要是依靠原型鏈來(lái)實(shí)現(xiàn)的。 1. 什么是原型鏈 繼承基本思想:利用原型讓一個(gè)引用類型繼承另一個(gè)...
閱讀 2276·2021-11-16 11:44
閱讀 650·2019-08-30 15:55
閱讀 3282·2019-08-30 15:52
閱讀 3621·2019-08-30 15:43
閱讀 2205·2019-08-30 11:21
閱讀 445·2019-08-29 12:18
閱讀 1954·2019-08-26 18:15
閱讀 478·2019-08-26 10:32