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)}// 0for(let i in Array.from([1,,,])){console.log(i)}// 0 1 2for(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=16Object.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;//truevar 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.filesfiles[0] instanceof File // truefiles intanceof FileListfile instanceof Blob true
实际场景中,从 xhr file api canvas等地方读取的文件二进制流,如果使用js存,浪费又低效。
axios({method: 'post',url: '/export',responseType: 'arraybuffer',}).then(res => {// 假设 data 是返回来的二进制数据const data = res.dataconst 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 = urllink.setAttribute('download', 'excel.xlsx')document.body.appendChild(link)link.click()document.body.removeChild(link)// 记得 revoke 一下防止泄露})
