摘要:方法由于構(gòu)造函數(shù)創(chuàng)建數(shù)組時(shí)的怪異行為,比方說如下方法總會(huì)創(chuàng)建一個(gè)包含所有參數(shù)的數(shù)組方法不通過屬性確定返回值的類型,它使用當(dāng)前構(gòu)造函數(shù),也就是方法中的值來確定正確的返回?cái)?shù)據(jù)的類型方法以前總是使用將類數(shù)組轉(zhuǎn)換成數(shù)組方法可接受可迭代對(duì)象或類數(shù)組對(duì)
Array.of方法
由于Array構(gòu)造函數(shù)創(chuàng)建數(shù)組時(shí)的怪異行為,比方說如下:
let items = new Array(2) console.log(items.length)//2 items = new Array("2") console.log(items.length)//1
Array.of方法總會(huì)創(chuàng)建一個(gè)包含所有參數(shù)的數(shù)組
let items = Array.of(1, 2) console.log(items.length)//2 console.log(items[0])//1
Array.of方法不通過Symbol.species屬性確定返回值的類型,它使用當(dāng)前構(gòu)造函數(shù),也就是of方法中的this值來確定正確的返回?cái)?shù)據(jù)的類型
Array.from方法以前總是使用Array.prototype.slice.call(arrayLike)將類數(shù)組轉(zhuǎn)換成數(shù)組
Array.from方法可接受可迭代對(duì)象或類數(shù)組對(duì)象,最終返回一個(gè)數(shù)組
Array.from也是通過this來確定返回?cái)?shù)組的類型
Array.from接受第二個(gè)參數(shù),表示映射函數(shù),第三個(gè)參數(shù)表示映射函數(shù)中的this的值
來看幾個(gè)例子:
function translate() { return Array.from(arguments, (value) => value + 1) } let numbers = translate(1, 2, 3) console.log(numbers) //2、3、4
let helper={ diff:1, add(value){ return value+this.diff } } function translate(){ return Array.from(arguments,helper.add,helper) } let numbers = translate(1, 2, 3) console.log(numbers) //2、3、4
看看用Array.from轉(zhuǎn)換可迭代對(duì)象
let numbers = { *[Symbol.iterator]() { yield 1; yield 2; yield 3; } } let numbers2 = Array.from(numbers, value => value + 1) console.log(numbers2) //2、3、4find方法和findIndex方法
find方法和findIndex方法都接受兩個(gè)參數(shù),一個(gè)是回調(diào)函數(shù),另外一個(gè)是可靠參數(shù)用于指定回調(diào)函數(shù)中this的值
let numbers = [25, 30, 35, 40, 45] console.log(numbers.find(n => n > 35))//40 console.log(numbers.findIndex(n => n > 35))//3
如果要在數(shù)組中根據(jù)某個(gè)條件查找匹配的元素,那么find方法和findIndex方法可以很好的完成任務(wù),但是如果只想查找與某個(gè)值匹配的元素,則indexOf和lastIndexOf應(yīng)該是更好的選擇
fill方法fill方法可以用指定的值填充一至多個(gè)數(shù)組元素,當(dāng)傳入一個(gè)值時(shí),fill方法會(huì)用這個(gè)值重寫數(shù)組中的所有值
fill方法的第二個(gè)參數(shù)表示開始索引,第三個(gè)參數(shù)作為不包含結(jié)束索引,如果沒有傳第三個(gè)參數(shù)則默認(rèn)使用numbers.length作為不包含結(jié)束索引
如果開始索引和結(jié)束索引為負(fù)值,那么這些值會(huì)與數(shù)組的length屬性相加為作為最終位置
調(diào)用copyWithin方法時(shí)需要傳入兩個(gè)參數(shù),一個(gè)是方法開始填充值的索引位置,另一個(gè)是開始復(fù)制值的索引位置,第三個(gè)參數(shù)為可選參數(shù),用來限制被重寫元素的數(shù)量,也就是指定停止復(fù)制值的位置
let numbers = [1, 2, 3, 4] numbers.copyWithin(2, 0, 1) console.log(numbers)//1,2,1,4
跟fill方法一樣,copyWithin方法的所有參數(shù)都接受負(fù)數(shù)值,并且會(huì)自動(dòng)與數(shù)組長(zhǎng)度相加來作為最終使用的索引
定型數(shù)組JS中數(shù)字是以64位浮點(diǎn)格式存儲(chǔ)并按需轉(zhuǎn)換成32位整數(shù)
數(shù)組緩沖區(qū)是所有定型數(shù)組的根基,數(shù)組緩沖區(qū)包含的實(shí)際字節(jié)數(shù)量在創(chuàng)建時(shí)就已確定,可以修改緩沖區(qū)內(nèi)的數(shù)據(jù),但是不能修改緩沖區(qū)的尺寸大小
let buffer = new ArrayBuffer(10) let buffer2 = buffer.slice(4, 6) console.log(buffer2.byteLength)//2
數(shù)組緩沖區(qū)是內(nèi)存中的一段地址,視圖是用來操作內(nèi)存的接口,視圖可以操作數(shù)組緩沖區(qū)或緩沖區(qū)字節(jié)的子集,并按照其中一種數(shù)值型數(shù)據(jù)類型來讀取和寫入數(shù)據(jù)
let buffer = new ArrayBuffer(10), view1 = new DataView(buffer), view2 = new DataView(buffer, 5, 2); console.log(view1.buffer === buffer)//true console.log(view2.byteOffset)//5 console.log(view2.byteLength)//2
事實(shí)上你可以寫入兩個(gè)int8類型的值,然后使用int16類型的方法從緩沖區(qū)中讀出這些值
let buffer = new ArrayBuffer(10), view = new DataView(buffer); view.setInt8(0, 5) view.setInt8(1, -1) console.log(view.getInt8(0))//5
定型數(shù)組實(shí)際上就是用于數(shù)組緩沖區(qū)的特定類型的視圖,你可以強(qiáng)制使用特定的數(shù)據(jù)類型,而不是通過使用通用的DataView對(duì)象來操作數(shù)組緩沖區(qū)
創(chuàng)建定型數(shù)組的方式
1、 通過數(shù)組緩沖區(qū)來生成定型數(shù)組的實(shí)例
let buffer = new ArrayBuffer(10), view = new Int8Array(buffer); console.log(view.byteLength)
2、通過構(gòu)造函數(shù)中傳入一個(gè)數(shù)字,這個(gè)數(shù)字表示分配給數(shù)組的元素?cái)?shù)量
let ints = new Int32Array(10); console.log(ints.byteLength)//20 console.log(ints.length)//10
調(diào)用定型數(shù)組的構(gòu)造函數(shù)時(shí)如果不傳參數(shù),會(huì)按照傳入0來處理,這樣由于緩沖區(qū)沒有分配到任何比特,因?yàn)閯?chuàng)建的定型數(shù)組不能用來保存數(shù)據(jù)
可以將定型數(shù)組、可迭代對(duì)象、數(shù)組、類數(shù)組對(duì)象作為構(gòu)造函數(shù)的參數(shù)傳入
let ints1 = new Int16Array([25, 50]), ints2 = new Int32Array(ints1); console.log(ints1.buffer === ints2.buffer)//false console.log(ints1.length)//2 console.log(ints2.byteLength)//8 console.log(ints2.length)//2 console.log(ints2[0])//25 console.log(ints2[1])//50
每個(gè)定型數(shù)組中元素大小指的是每個(gè)元素表示的字節(jié)數(shù),該值存儲(chǔ)在每個(gè)構(gòu)造函數(shù)和每個(gè)實(shí)例中BYTES_PER_ELEMENT屬性中
console.log(Uint32Array.BYTES_PER_ELEMENT)定型數(shù)組和普通數(shù)組的異同點(diǎn)
相同點(diǎn):
1、可以修改length屬性來改變普通數(shù)組的大小,而定型數(shù)組的length屬性是一個(gè)不可寫屬性,所以不能修改定型數(shù)組的大小,如果嘗試修改這個(gè)值,在非嚴(yán)格模式下會(huì)直接忽略該操作,在嚴(yán)格模式下會(huì)拋出錯(cuò)誤
2、定型數(shù)組也包括許多在功能上與普通數(shù)組方法等效的方法,但是定型數(shù)組中的方法會(huì)額外的檢查數(shù)值類型是否安全
比方說:copyWithin、findIndex、lastIndexOf、slice、entries、forEach、map、some、fill、indexOf、reduce、sort、filter、join、reduceRight、values、find、keys、reverse
3、相同的迭代器(也就是keys、values、entries),這意味著可以把定型數(shù)組當(dāng)作普通數(shù)組一樣來使用展開運(yùn)算符、for of 循環(huán)
let ints = new Int16Array([25, 50]), intsArray = [...ints]; console.log(intsArray instanceof Array)//true console.log(intsArray[0])//25
4、所有定型數(shù)組都包含有靜態(tài)of方法和from方法(也就是Array.of和Array.from)
差異點(diǎn):
1、定型數(shù)組不是普通數(shù)組,它不繼承自Array,通過Array.isArray方法檢測(cè)定型數(shù)組返回的是false
let ints = new Int16Array([25, 50]) console.log(ints instanceof Array)//false console.log(Array.isArray(ints))//false
2、當(dāng)操作普通數(shù)組時(shí),其可以變大變小,但定型數(shù)組卻始終保持相同的尺寸。給定型數(shù)組中不存在的數(shù)值索引賦值會(huì)被忽略,而在普通數(shù)組中就可以
let ints = new Int16Array([25, 50]); console.log(ints.length);//2 console.log(ints[0])//25 console.log(ints[1])//50 ints[2]=5; console.log(ints.length)//2 console.log(ints[2])//undefined
定型數(shù)組同樣會(huì)檢查數(shù)據(jù)類型的合法性,0被用于代替所有非法值;所有修改定型數(shù)組值的就去執(zhí)行時(shí)都會(huì)受到相同限制
let ints = new Int16Array(["hi"]) console.log(ints.length)//1 console.log(ints[0])//0
3、以下方法在定型數(shù)組中不可使用,concat、shift、pop、splice、push、unshift
因?yàn)樯鲜隽斜碇谐齝oncat外,所有方法都可以改變數(shù)組的尺寸,由于定型數(shù)組的尺寸不可更改,因而這些方法不適用于定型數(shù)組,之所以concat不行是因?yàn)閮蓚€(gè)定型數(shù)組合并后的結(jié)果會(huì)變得不確定
4、定型數(shù)組新的附加方法set和subarray
set方法將其它數(shù)組復(fù)制到已有的定型數(shù)組
subarray提取已有定型數(shù)組的一部分作為一個(gè)新的定型數(shù)組
set方法接受兩個(gè)參數(shù):一個(gè)是數(shù)組(定型數(shù)組或普通數(shù)組都支持),一個(gè)是可選的偏移量,表示開始插入數(shù)據(jù)的位置,如果什么都不傳,默認(rèn)的偏移量是0
let ints = new Int16Array(4); ints.set([25, 50]) ints.set([75, 100], 2) console.log(ints)//[25, 50, 75, 100]
subarray方法接受兩個(gè)參數(shù):一個(gè)是可選的開始位置,一個(gè)是可選的結(jié)束位置(不包含當(dāng)前結(jié)束位置的值 ),最后返回一個(gè)新的定型數(shù)組,也可以省略這兩個(gè)參數(shù)來克隆一個(gè)新的定型數(shù)組
let ints = new Int16Array([25, 50, 75, 100]), subInts = ints.subarray(1, 3); console.log(subInts)//[50, 75]
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/88502.html
摘要:方法由于構(gòu)造函數(shù)創(chuàng)建數(shù)組時(shí)的怪異行為,比方說如下方法總會(huì)創(chuàng)建一個(gè)包含所有參數(shù)的數(shù)組方法不通過屬性確定返回值的類型,它使用當(dāng)前構(gòu)造函數(shù),也就是方法中的值來確定正確的返回?cái)?shù)據(jù)的類型方法以前總是使用將類數(shù)組轉(zhuǎn)換成數(shù)組方法可接受可迭代對(duì)象或類數(shù)組對(duì) Array.of方法 由于Array構(gòu)造函數(shù)創(chuàng)建數(shù)組時(shí)的怪異行為,比方說如下: let items = new Array(2) console....
摘要:創(chuàng)建數(shù)組中創(chuàng)建數(shù)組的方式數(shù)組字面量一個(gè)數(shù)組。傳入一個(gè)回調(diào)函數(shù),找到數(shù)組中符合當(dāng)前搜索規(guī)則的第一個(gè)元素,返回它,并且終止搜索。用新元素替換掉數(shù)組內(nèi)的元素,可以指定替換下標(biāo)范圍。 ES5提供的數(shù)組已經(jīng)很強(qiáng)大,但是ES6中繼續(xù)改進(jìn)了一些,主要是增加了新的數(shù)組方法,所以這章的知識(shí)非常少。 創(chuàng)建數(shù)組 ES5中創(chuàng)建數(shù)組的方式:數(shù)組字面量、new一個(gè)數(shù)組。 const arr1 = [] //數(shù)組字...
摘要:最近買了深入理解的書籍來看,為什么學(xué)習(xí)這么久還要買這本書呢主要是看到核心團(tuán)隊(duì)成員及的創(chuàng)造者為本書做了序,作為一個(gè)粉絲,還是挺看好這本書能給我?guī)硪粋€(gè)新的升華,而且本書的作者也非常厲害。 使用ES6開發(fā)已經(jīng)有1年多了,以前看的是阮一峰老師的ES6教程,也看過MDN文檔的ES6語法介紹。 最近買了《深入理解ES6》的書籍來看,為什么學(xué)習(xí)ES6這么久還要買這本書呢?主要是看到Daniel A...
閱讀 2158·2021-09-22 10:56
閱讀 1465·2021-09-07 10:11
閱讀 1800·2019-08-30 15:54
閱讀 2290·2019-08-30 15:44
閱讀 2307·2019-08-29 12:40
閱讀 3031·2019-08-28 18:25
閱讀 1735·2019-08-26 10:24
閱讀 3186·2019-08-23 18:39