[TOC]
## Array.from\(\)
將兩類對象轉換成真正的數組:類似數組的對象(array-like object)和可遍歷(iterable)對象(包括ES6新增的數據結構Set和Map)。
```
let arraylike = {
0: 'a',
1: 'b',
2: 'c',
length:3
}
// ES5寫法
var arr1 = [].slice.call(arraylike) // ['a', 'b', 'c']
Array.prototype.slice.call
//ES6寫法
let arr2 = Array.from(arraylikje) // ['a', 'b', 'c']
```
實際應用常見的類數組對象是DOM操作返回的NodeList集合,以及函數內部的arguments對象。Array.from都可以將它們轉化為數組。
```
// NodeList集合
let p = document.querySelectorAll('p')
Array.from(p).foEach(function (p) {
cosole.log(p)
})
// arguments 對象
function foo() {
var args = Array.from(arguments)
}
```
擴展運算符\(...\)也可以將某些數據結構轉換為數組。如果一個對象沒有部署遍歷器接口(Symbol.iterator)則無法轉換。無法轉換類數組對象。
```
function foo() {
var args = [...arguments]
}
[...document.querySelectorAll('p')]
```
Array.from可接受第二個參數,對每個元素進行處理,將處理后的值放入返回的數組。
```
Array.from(arraylike, x => x * x)
//等同于
Array.from(arraylike).map(x => x * x)
Array.from([1, 2, 3]).map(x => x * x) // [1, 4, 9]
```
Array.from\(\)的另一個應用是將字符串轉化為數組,然后返回字符串的長度。因為它能正確處理各種Unicode字符,避免將大于\uFFFF的Unicode字符算作2個字符的BUG。
```
function contSymbols(string) {
return Array.from(string).length
}
```
## Array.of\(\)
將一組數值轉化為數組
```
Array.of(3, 1, 8) // [3,1,8]
Array.of(3) //[3]
```
這個方法的主要目的是彌補數組構造函數Array\(\)的不足。因為參數個數不同會導致Array的行為有差異。
```
Array() // []
Array(3) // [,,,]
Array(3, 1, 8) // [3,1,8]
```
## 數組實例的copyWithin\(\)
在當前數組內部將制定位置的成員復制到其他位置(會覆蓋原有成員),然后返回當前數組。
使用這個方法會修改當前數組。
```
Array.prototype.copyWithin(target, start = 0, end = this.length)
```
參數
* target\(必須\):從該位置開始替換數據
* start(可選):從該位置開始讀取數據,默認為0
* end(可選):到該位置前停止讀取數據,默認等于數組長度。
```
[1,2,3,4,5].copyWithin(0, 3)
// [4,5,3,5,5]
//將3號位置賦值到0位置
[1,2,3,4,5].copyWithin(0,3,4)
```
## 數組實例的find\(\)和findIndex\(\)
find方法用于找到第一個符合條件的數組元素。它的第一個參數是回調函數,所有數組成員一次執行該函數,直到找出第一個返回值為true的成員,然后返回該成員,否則返回undefined。
```
// 找出第一個小于10的成員
[1,4,-5,10].find((n) => n< 0) // -5
```
find方法的回調函數接受3個參數,依次為當前的值,當前位置和原數組。
```
[1,5,10,15].find(function(value, index, arr) {
return value > 9
}) //
```
findIndex方法用法和find類似,返回第一個符合條件的數組成員的位置,如果都不符合,返回-1。
這兩個方法都可接受第二個參數,用來綁定回調函數的this對象。
另外這兩個方法都可以發現NaN,彌補數組的IndexOf的不足。
```
[NaN].indexOf(NaN) // -1
[NaN].findIndex(y => Object.is(NaN, y)) // 0
```
## 數組實例的fill\(\)
使用給定值填充數組。
參數
* value\(必選\),用來填充的值
* start(可選):開始位置
* end(可選):結束為止
```
['a','b','c'].fill(7) // [7,7,7]
new Array(3).fill(7) // [7,7,7]
['a', 'b', 'c'].fill(7,1,2) // ['a'. 7 , 'c']
```
## 數組實例的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'
```
## 數組實例的includes\(\)
返回一個布爾值,表示數組是否包含給定的值。
該分的第二個參數是搜索的起始位置,默認為0。
```
[1,2,3].includes(2) // true
[1,2,3].includes(4) // false
[1,2,NaN].includes(NaN) // true
```
沒有該方法時通常使用數組indexOf方法。
indexOf方法有兩個缺點:一,不夠語義化,要與-1比較;二,內部使用===進行判斷,會對NaN誤判。
## 數組的空位
數組的空位是指數組在某個位置沒有值。
```
Array(3) // [,,,]
```
空位不是undefined。一個位置的值等于undefined依然是有值的。空位上沒有任何值,in運算符可以說明。
```
0 in [undefined,undefined,undefined] // true
0 in [,,,] // false
```
ES5大多數情況會忽略空位。
* forEach\(\)、filter\(\)、every\(\)和some\(\)會跳過空位
* map\(\)會跳過空位,但保留這個值
* join和toString\(\)將空位視為undefined,undefined和null被處理為空字符串
ES6將空位轉為undefined。
```
Array.from(['a',,'b'])
// ['a', undefined, 'b']
[...['a',,'b']]
// ['a', undefined, 'b']
```
## 數組推導
數組推導允許直接通過現有數組生成新數組。(ES7)
```
var a1 = [1,2,3,4]
var a2 = [for (i in a1) i * 2]
a2 // [2,4,6,8]
```
數組推導中,for ... of總是寫在最前面,返回的表達式寫在最后面。
for...of后面還可以附加if語句,用于設定循環的限制條件。
```
var years = [1954,1974,1990,2006,2010,2014]
[for (year of years) if(year > 2010) year]
// [2006,2010,2014]
```
數組推導可代替map和filter方法
```
[for (i of [1,2,3]) i*i]
// 等價于
[1,2,3].map(function (i) { return i * i })
```
- 第一部分 HTML
- meta
- meta標簽
- HTML5
- 2.1 語義
- 2.2 通信
- 2.3 離線&存儲
- 2.4 多媒體
- 2.5 3D,圖像&效果
- 2.6 性能&集成
- 2.7 設備訪問
- SEO
- Canvas
- 壓縮圖片
- 制作圓角矩形
- 全局屬性
- 第二部分 CSS
- CSS原理
- 層疊上下文(stacking context)
- 外邊距合并
- 塊狀格式化上下文(BFC)
- 盒模型
- important
- 樣式繼承
- 層疊
- 屬性值處理流程
- 分辨率
- 視口
- CSS API
- grid(未完成)
- flex
- 選擇器
- 3D
- Matrix
- AT規則
- line-height 和 vertical-align
- CSS技術
- 居中
- 響應式布局
- 兼容性
- 移動端適配方案
- CSS應用
- CSS Modules(未完成)
- 分層
- 面向對象CSS(未完成)
- 布局
- 三列布局
- 單列等寬,其他多列自適應均勻
- 多列等高
- 圣杯布局
- 雙飛翼布局
- 瀑布流
- 1px問題
- 適配iPhoneX
- 橫屏適配
- 圖片模糊問題
- stylelint
- 第三部分 JavaScript
- JavaScript原理
- 內存空間
- 作用域
- 執行上下文棧
- 變量對象
- 作用域鏈
- this
- 類型轉換
- 閉包(未完成)
- 原型、面向對象
- class和extend
- 繼承
- new
- DOM
- Event Loop
- 垃圾回收機制
- 內存泄漏
- 數值存儲
- 連等賦值
- 基本類型
- 堆棧溢出
- JavaScriptAPI
- document.referrer
- Promise(未完成)
- Object.create
- 遍歷對象屬性
- 寬度、高度
- performance
- 位運算
- tostring( ) 與 valueOf( )方法
- JavaScript技術
- 錯誤
- 異常處理
- 存儲
- Cookie與Session
- ES6(未完成)
- Babel轉碼
- let和const命令
- 變量的解構賦值
- 字符串的擴展
- 正則的擴展
- 數值的擴展
- 數組的擴展
- 函數的擴展
- 對象的擴展
- Symbol
- Set 和 Map 數據結構
- proxy
- Reflect
- module
- AJAX
- ES5
- 嚴格模式
- JSON
- 數組方法
- 對象方法
- 函數方法
- 服務端推送(未完成)
- JavaScript應用
- 復雜判斷
- 3D 全景圖
- 重載
- 上傳(未完成)
- 上傳方式
- 文件格式
- 渲染大量數據
- 圖片裁剪
- 斐波那契數列
- 編碼
- 數組去重
- 淺拷貝、深拷貝
- instanceof
- 模擬 new
- 防抖
- 節流
- 數組扁平化
- sleep函數
- 模擬bind
- 柯里化
- 零碎知識點
- 第四部分 進階
- 計算機原理
- 數據結構(未完成)
- 算法(未完成)
- 排序算法
- 冒泡排序
- 選擇排序
- 插入排序
- 快速排序
- 搜索算法
- 動態規劃
- 二叉樹
- 瀏覽器
- 瀏覽器結構
- 瀏覽器工作原理
- HTML解析
- CSS解析
- 渲染樹構建
- 布局(Layout)
- 渲染
- 瀏覽器輸入 URL 后發生了什么
- 跨域
- 緩存機制
- reflow(回流)和repaint(重繪)
- 渲染層合并
- 編譯(未完成)
- Babel
- 設計模式(未完成)
- 函數式編程(未完成)
- 正則表達式(未完成)
- 性能
- 性能分析
- 性能指標
- 首屏加載
- 優化
- 瀏覽器層面
- HTTP層面
- 代碼層面
- 構建層面
- 移動端首屏優化
- 服務器層面
- bigpipe
- 構建工具
- Gulp
- webpack
- Webpack概念
- Webpack工具
- Webpack優化
- Webpack原理
- 實現loader
- 實現plugin
- tapable
- Webpack打包后代碼
- rollup.js
- parcel
- 模塊化
- ESM
- 安全
- XSS
- CSRF
- 點擊劫持
- 中間人攻擊
- 密碼存儲
- 測試(未完成)
- 單元測試
- E2E測試
- 框架測試
- 樣式回歸測試
- 異步測試
- 自動化測試
- PWA
- PWA官網
- web app manifest
- service worker
- app install banners
- 調試PWA
- PWA教程
- 框架
- MVVM原理
- Vue
- Vue 餓了么整理
- 樣式
- 技巧
- Vue音樂播放器
- Vue源碼
- Virtual Dom
- computed原理
- 數組綁定原理
- 雙向綁定
- nextTick
- keep-alive
- 導航守衛
- 組件通信
- React
- Diff 算法
- Fiber 原理
- batchUpdate
- React 生命周期
- Redux
- 動畫(未完成)
- 異常監控、收集(未完成)
- 數據采集
- Sentry
- 貝塞爾曲線
- 視頻
- 服務端渲染
- 服務端渲染的利與弊
- Vue SSR
- React SSR
- 客戶端
- 離線包
- 第五部分 網絡
- 五層協議
- TCP
- UDP
- HTTP
- 方法
- 首部
- 狀態碼
- 持久連接
- TLS
- content-type
- Redirect
- CSP
- 請求流程
- HTTP/2 及 HTTP/3
- CDN
- DNS
- HTTPDNS
- 第六部分 服務端
- Linux
- Linux命令
- 權限
- XAMPP
- Node.js
- 安裝
- Node模塊化
- 設置環境變量
- Node的event loop
- 進程
- 全局對象
- 異步IO與事件驅動
- 文件系統
- Node錯誤處理
- koa
- koa-compose
- koa-router
- Nginx
- Nginx配置文件
- 代理服務
- 負載均衡
- 獲取用戶IP
- 解決跨域
- 適配PC與移動環境
- 簡單的訪問限制
- 頁面內容修改
- 圖片處理
- 合并請求
- PM2
- MongoDB
- MySQL
- 常用MySql命令
- 自動化(未完成)
- docker
- 創建CLI
- 持續集成
- 持續交付
- 持續部署
- Jenkins
- 部署與發布
- 遠程登錄服務器
- 增強服務器安全等級
- 搭建 Nodejs 生產環境
- 配置 Nginx 實現反向代理
- 管理域名解析
- 配置 PM2 一鍵部署
- 發布上線
- 部署HTTPS
- Node 應用
- 爬蟲(未完成)
- 例子
- 反爬蟲
- 中間件
- body-parser
- connect-redis
- cookie-parser
- cors
- csurf
- express-session
- helmet
- ioredis
- log4js(未完成)
- uuid
- errorhandler
- nodeclub源碼
- app.js
- config.js
- 消息隊列
- RPC
- 性能優化
- 第七部分 總結
- Web服務器
- 目錄結構
- 依賴
- 功能
- 代碼片段
- 整理
- 知識清單、博客
- 項目、組件、庫
- Node代碼
- 面試必考
- 91算法
- 第八部分 工作代碼總結
- 樣式代碼
- 框架代碼
- 組件代碼
- 功能代碼
- 通用代碼