Api
api使用不提。
注意 forEach``find
可以提前退出,every some 当然也是。但是 map/reduce/filter 没有办法中途退出。除了reduce 都没办法逆序。
Array.sort
Array.from
// 写node爬虫时候挺常见的
Array.form(数组、类数组)
Array.prototype.slice.appay(类数组)
[].slice.call(list) instanceof Array
Array.reduce
最基础的就是数组求和:
var a = [1,2,3,4,5]
// 请计算a的数组和
a.reduce(
(prev,cur)=> prev+cur,
0
)
栈、队列
稀疏数组
没有从0开始索引的数组。一般情况下length长度就是元素个数。但数组本身可以是稀疏的,也就是该有的地方没有。造成的现象是 length 长度大于实际元素个数。
var a = new Array(5) // 有长度没内容
a[1000]=0 // 中间是空的,尾部有值。
a=[,,] // 数组是可以逗号结尾的,长度是2
尤其注意,es6新增的api和早期的版本处理不太一致。比如:
for(let i in [1,,,,]){
console.log(i)
}
// 0
for(let i in Array.from([1,,,])){
console.log(i)
}
// 0 1 2
for(let i in Array.of(...[1,,,])) {
console.log(i)
} // 0 1 2
Type Array
定型数组。js的数组和webGL中的数组不匹配。导致耗时。有点跨语言、跨协议的意思了。
首先就是 ArrayBuffer
和 SahredArrayBuffer
,后者是前者的变体,后者无需复制就可以在执行上下文之间传递。
const buf = new ArrayBuffer(16);
// 在内存中分配16字节
// buf.length=16
Object.prototype.toLocaleString.call(buf)
// [object ArrayBuffer]
ArrayBuffer
一经创建就不能再调整,如果要调整可以通过 slice新开辟空间。
如果要读取、写入内容,需要通过视图,比如 DataView
,这个专为 文件I/O
和 网络I/O
设计,支持对缓冲数据的高度控制,但相比其他视图类型性能就差点。
const buf = new ArrayBuffer(16)
const fullDataView = new DataView(buf)
fullDataView;
fullDataView.buffer===buf;//true
var f1=new DataView(buf,0,8)
var f2=new DataView(buf,9)
DataView 使用 ElementType 实现js 数字类型到 缓冲内二进制格式的转换。
具体内容就不弄了,不是很懂。还有字节序、大端字节序、小端字节序。
通过DataView 完成读写的前提是有足够的缓冲区,否则会 RangeError,哦范围报错这里还有一个场景,js报错时候困惑过。
其他的就先略过了,等用到了再看。应用场景:Blob、数据下载导出
文件下载
文件下载二进制有多种方式:
- 后端负责生成现成的文件,给你文件连接,前端通过 window.open(url) 里实现下载
- 后端返回二进制数据流,内容是乱码
- 如果是get,还是 window.open
- 如果是post,除了考虑改成get,就需要前端做拼装
数据流这个,主要是 blob
的概念。这部分可以和 Type Array 结合来看。
blob 详解
blob
是一个不可变、原始数据类型的类文件对象,里面的东西不一定是js的原生格式(也即是二进制乱码) Blob 表示二进制类型的大对象,通常是影像、声音或多媒体文件,在 javaScript 中 Blob 表示一个不可变、原始数据的类文件对象。
一般这样用:
new Blob(blobParts, options)
- blobParts
- ArrayBuffer
- ArrayBufferView
- Blob
- DOMString
连接起来组成具体数据。
- options
- type 指定 mime
- endings 行结束符 \n 如何被写入。
- native 根据系统来
- 默认值 transparent 保持内部不变
返回的 blob
- 属性
- size 包含的数据大小
- type 表示 mime类型
- 方法
- slice()
- stream()
- text()
- arrayBuffer()
File 对象是一种特殊的 blob对象,集成了blob的属性和方法,也可以用于 fromData 二进制上传
比如通过 Inpt:type 的值
var files = event.target.files
files[0] instanceof File // true
files intanceof FileList
file instanceof Blob true
实际场景中,从 xhr file api canvas等地方读取的文件二进制流,如果使用js存,浪费又低效。
axios({
method: 'post',
url: '/export',
responseType: 'arraybuffer',
})
.then(res => {
// 假设 data 是返回来的二进制数据
const data = res.data
const url = window.URL.createObjectURL(new Blob([data], {type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}))
const link = document.createElement('a')
link.style.display = 'none'
link.href = url
link.setAttribute('download', 'excel.xlsx')
document.body.appendChild(link)
link.click()
document.body.removeChild(link)
// 记得 revoke 一下防止泄露
})