ES6(ECMAScript 6)是即將到來的新版本JavaScript語言的標準,代號harmony(和諧之意,顯然沒有跟上我國的步伐,我們已經進入中國夢版本了)。上一次標準的製訂還是2009年推出的ES5。目前ES6的標準化工作正在進行中,預計14年12月會放出正式敲定的版本。但大部分標準已經就緒,且各瀏覽器對ES6的支援也正在實現中。
ES6為陣列添加了一些新特性,而這些新特性到目前為止完全可以運用到自己的業務層。在這一節中將總結有關於ES6給數組一些新特性的使用方法。
ES6提供的兩個靜態方法:
Array.from
Array.of
ES6提供操作、填充和過濾數組的方法:
Array.prototype.copyWidthin
Array.prototype.fill
Array.prototype.find
Array.prototype.findIndex
ES6中有關於陣列迭代的方法:
Array.prototype.keys
Array.prototype.values
Array.prototype.entries
Array.prototype[Symbol.iterator]
接下來主要看看這些方法的使用。
Array.from()
Array.from()方法主要用於將兩類物件(類似陣列的物件[array-like object]和可遍歷物件[iterable])轉為真正的陣列。
在ES5中常常使用下面這樣的方法將一個類似陣列的物件轉換成一個陣列:
function cast () { return Array.prototype.slice.call(arguments); } cast('a','b','c','d'); // ["a", "b", "c", "d"]
或者你也可以寫成:
function cast () { return [].slice.call(arguments); } cast('a','b','c','d'); // ["a", "b", "c", "d"]
在ES6中可以使用Array.from將一個類似陣列的物件轉換為一個真正的陣列。
所謂類似數組的對象,本質特徵只有一點,即必須有length屬性。因此,任何有length屬性的物件都是類似數組對象,都可以透過Array.from方法將其轉換成真正的陣列。
let arrayLike = { '0': 'a', '1': 'b', '2': 'c', length: 3 } console.log(Array.from(arrayLike)); // ["a","b","c"]
在ES6中,擴充運算子(...)也可以將某些資料結構轉為陣列。只不過它需要在背後呼叫遍歷器介面Symbol.iterator。
function cast (){ return [...arguments] } cast('a','b','c'); // ["a","b","c"]
值得注意的是如果一個物件沒有部署遍歷器接口,使用擴展運算符是無法將類似數組物件轉換成數組。
Array.from接受三個參數,但只有input是必須的:
input: 你想要轉換的類似陣列物件和可遍歷物件
map: 類似陣列的map方法,用來對每個元素進行處理,將處理後的值放入傳回的陣列
context: 綁定map中用到的this
只要是部署了iterator介面的資料結構,Array.from都能將其轉換為陣列:
let arr = Array.from('w3cplus.com') console.log(arr); // ["w","3","c","p","l","u","s",".","c","o","m"] let namesSet = new Set(['a', 'b']) let arr2 = Array.from(namesSet) console.log(arr2); //["a","b"]
上面的程式碼,因為字元呂和Set結構都具有iterator接口,因此可以被Array.from轉為真正的陣列。如果參數是真正的數組,Array.from也會傳回一個一模一樣的新數組:
let arr = Array.from([1, 2, 3]); console.log(arr); // [1,2,3]
前面也說過Array.from還可以接受第二個參數,作用類似陣列的map方法,用來對每個元素進行處理,處理後的值放入傳回的陣列:
Array.from(arrayLike, x => x * x); // 等同于 Array.from(arrayLike).map(x => x * x); Array.from([1, 2, 3], (x) => x * x) // [1, 4, 9]
如果map函數裡面用到了this關鍵字,還可以傳入Array.from的第三個參數,用來綁定this。
Array.from()可以將各種值轉為真正的數組,並且還提供map功能。這其實意味著,只要有一個原始的資料結構,你就可以先對它的值進行處理,然後轉成規範的陣列結構,進而可以使用數量眾多的陣列方法。
Array.from({ length: 2 }, () => 'jack') // ['jack', 'jack']
上面程式碼中,Array.from的第一個參數指定了第二個參數運行的次數。這種特性可以讓此方法的用法變得非常靈活。
Array.from()的另一個應用是,將字串轉為數組,然後傳回字串的長度。因為它能正確處理各種Unicode字符,可以避免JavaScript將大於uFFFF的Unicode字符,算是兩個字元的bug。
function countSymbols(string) { return Array.from(string).length; }
使用Array.from()也可以傳回各種資料型態:
function typesOf () { return Array.from(arguments, value => typeof value) } typesOf(null, [], NaN) // <- ['object', 'object', 'number']
你也可以使用map方法實作上面程式碼的功能:
function typesOf (...all) { return all.map(value => typeof value) } typesOf(null, [], NaN) // <- ['object', 'object', 'number'] Array.of
使用Array.of方法可以將一組值轉換為陣列。
Array.of = function of () { return Array.prototype.slice.call(arguments) }
但你不能用Array.of來取代Array.prototype.slice.call,他們的行為不一樣:
Array.prototype.slice.call([1, 2, 3]) // <- [1, 2, 3] Array.of(1, 2, 3) // <- [1, 2, 3] Array.of(3) // <- [1]
這個方法主要目的主要還是用來彌補陣列建構子Array()的不足,因為參數個數的不同,會導致Array()行為有所差異:
new Array() // <- [] new Array(undefined) // <- [undefined] new Array(1) // <- [undefined x 1] new Array(3) // <- [undefined x 3] new Array(1, 2) // <- [1, 2] new Array(-1) // <- RangeError: Invalid array length
Array.of基本上可以用來取代Array()或new Array(),並且不存在由於參數不同而導致的重載,而且他們的行為非常統一:
Array.of() // <- [] Array.of(undefined) // <- [undefined] Array.of(1) // <- [1] Array.of(3) // <- [3] Array.of(1, 2) // <- [1, 2] Array.of(-1) // <- [-1]
Array.of方法可以使用下面的代码来模拟实现:
function ArrayOf(){ return [].slice.call(arguments); }
copyWidthin
copyWidthin方法可以在当前数组内部,将指定位置的数组项复制到其他位置(会覆盖原数组项),然后返回当前数组。使用copyWidthin方法会修改当前数组。
Array.prototype.copyWithin(target, start = 0, end = this.length)
copyWidthin将会接受三个参数:
target: 这个参数是必须的,从该位置开始替换数组项
start: 这是一个可选参数,从该位置开始读取数组项,默认为0,如果为负值,表示从数组的右边向左开始读取
end: 这是一个可选参数,到该位置停止读取的数组项,默认等于Array.length。如果为负值,表示倒数
我们先来看一个简单的示例,下面声明了一个items数组:
var items = [1, 2, 3, ,,,,,,,]; // <- [1, 2, 3, undefined x 7]
下面的代码将在数组items的第六个位置开始粘贴数组项。粘贴过去的数组项是从items的第二位开始到第三位置结束。
items.copyWithin(6, 1, 3) // <- [1, 2, 3, undefined × 3, 2, 3, undefined × 2]
下面是更多例子:
// 将3号位复制到0号位 [1, 2, 3, 4, 5].copyWithin(0, 3, 4) // [4, 2, 3, 4, 5] // -2相当于3号位,-1相当于4号位 [1, 2, 3, 4, 5].copyWithin(0, -2, -1) // [4, 2, 3, 4, 5] // 将3号位复制到0号位 [].copyWithin.call({length: 5, 3: 1}, 0, 3) // {0: 1, 3: 1, length: 5} // 将2号位到数组结束,复制到0号位 var i32a = new Int32Array([1, 2, 3, 4, 5]); i32a.copyWithin(0, 2); // Int32Array [3, 4, 5, 4, 5] // 对于没有部署TypedArray的copyWithin方法的平台 // 需要采用下面的写法 [].copyWithin.call(new Int32Array([1, 2, 3, 4, 5]), 0, 3, 4); // Int32Array [4, 2, 3, 4, 5] Array.prototype.fill
Array.prototype.fill方法使用给定的值填充一个数组:
['a', 'b', 'c'].fill(0) // <- [0, 0, 0] new Array(3).fill(0) // <- [0, 0, 0]
上面这种方法用于空数组的初始化非常方便。数组中已有的元素会全部被抹去。
除此之外,Array.prototype.fill方法还可以接受第二个和第三个参数,用于指定填充的起始位置和结束位置。
['a', 'b', 'c',,,].fill(0, 2) // <- ['a', 'b', 0, 0, 0] new Array(5).fill(0, 0, 3) // <- [0, 0, 0, undefined x 2]
Array.prototype.fill提供的值可以是任意的,不仅可以是一个数值,甚至还可以是一个原始类型:
new Array(3).fill({}) // <- [{}, {}, {}]
不过这个方法不可以接受数组的映射方法,不过可以接受一个索引参数或类似下面这样的方式:
new Array(3).fill(function foo () {}) // <- [function foo () {}, function foo () {}, function foo () {}] Array.prototype.find
Array.prototype.find方法用于找出第一个符合条件的数组成员。它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为true的数组项,然后返回该数组项。如果没有符合条件的数组项,则返回undefined。
[1, 2, 3, 4, 5].find(item => item > 2) // <- 3 [1, 2, 3, 4, 5].find((item, i) => i === 3) // <- 4 [1, 2, 3, 4, 5].find(item => item === Infinity) // <- undefined
另外这种方法的回调函数可以接受三个参数,依次为当前的值、当前的位置和原始数组。
[1, 5, 10, 15].find(function(value, index, arr) { return value > 9; }) // 10 Array.prototype.findIndex
这个方法类似于.some和.find方法。像.some返回true;像.find返回item。如果array[index] === item则返回其index。
Array.prototype.findIndex方法主要是用来返回数组项在数组中的位置。其和Array.prototype.find方法非常类似,接受一个回调函数,如果符合回调函数的条件,则返回数组项在数组中的位置,如果所有数组项都不符合回调函数条件,则会返回-1。
[1, 2, 3, 4, 5].find(item => item > 2) // <- 2 [1, 2, 3, 4, 5].find((item, i) => i === 3) // <- 3 [1, 2, 3, 4, 5].find(item => item === Infinity) // <- -1
这个方法也可以接受第二个参数,用来绑定回调函数的this对象。
注:Array.prototype.find和Array.prototype.findIndex两个方法都可以发现NaN,弥补数组的indexOf方法的不足。
[NaN].indexOf(NaN) // -1 [NaN].findIndex(y => Object.is(NaN, y)) // 0
上面的代码中,indexOf方法无法识别数组的NaN成员,但是findIndex方法可以借助Object.is方法做到。
ES6遍历数组的方法
ES6提供了三个新方法:entries()、keys()和values(),用来遍历数组。它们都返回一个遍历器对象,可以用for...of循环进行遍历,唯一的区别是keys()是对数组的键名的遍历、values()是对数组键值的遍历,entries()方法是对数值的键值对的遍历。
for (let index of ['a', 'b'].keys()) { console.log(index); } // 0 // 1 for (let elem of ['a', 'b'].values()) { console.log(elem); } // 'a' // 'b' for (let [index, elem] of ['a', 'b'].entries()) { console.log(index, elem); } // 0 "a" // 1 "b"
如果不使用for...of循环,可以手动调用遍历器对象的next方法,进行遍历:
let letter = ['a', 'b', 'c']; let entries = letter.entries(); console.log(entries.next().value); // [0, 'a'] console.log(entries.next().value); // [1, 'b'] console.log(entries.next().value); // [2, 'c']
总结
这里简单的总结了有关于ES6中数组的相关方法。说实在的,初次接触ES6,很多东西都看得云里来雾里去。这里只是整理了一下这方面的相关知识。
关于JavaScript学习笔记之ES6数组方法小编就给大家介绍到这里,希望对大家有所帮助!

JavaScriptの最新トレンドには、TypeScriptの台頭、最新のフレームワークとライブラリの人気、WebAssemblyの適用が含まれます。将来の見通しは、より強力なタイプシステム、サーバー側のJavaScriptの開発、人工知能と機械学習の拡大、およびIoTおよびEDGEコンピューティングの可能性をカバーしています。

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

Pythonはデータサイエンスや機械学習により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、簡潔な構文とリッチライブラリエコシステムで知られており、データ分析とWeb開発に適しています。 2。JavaScriptは、フロントエンド開発の中核です。 node.jsはサーバー側のプログラミングをサポートしており、フルスタック開発に適しています。

JavaScriptは、最新のブラウザにすでに組み込まれているため、インストールを必要としません。開始するには、テキストエディターとブラウザのみが必要です。 1)ブラウザ環境では、タグを介してHTMLファイルを埋め込んで実行します。 2)node.js環境では、node.jsをダウンロードしてインストールした後、コマンドラインを介してJavaScriptファイルを実行します。

Quartzタイマーを使用してタスクをスケジュールする場合、Quartzでタスク通知を事前に送信する方法、タスクの実行時間はCron式によって設定されます。今...

JavaScriptプログラミング、プロトタイプチェーンの関数パラメーターの理解と操作のJavaScriptのプロトタイプチェーンの関数のパラメーターを取得する方法は、一般的で重要なタスクです...

WeChatアプレットWeb-ViewでVue.jsを使用する動的スタイルの変位障害がvue.jsを使用している理由の分析...

複数のリンクの同時ゲットリクエストを作成し、結果を返すために順番に判断する方法は? TamperMonkeyスクリプトでは、複数のチェーンを使用する必要があることがよくあります...


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

SublimeText3 中国語版
中国語版、とても使いやすい

ホットトピック



