[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算法
- 第八部分 工作代码总结
- 样式代码
- 框架代码
- 组件代码
- 功能代码
- 通用代码