惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

宝玉的分享
宝玉的分享
Recent Commits to openclaw:main
Recent Commits to openclaw:main
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
罗磊的独立博客
V
Visual Studio Blog
爱范儿
爱范儿
H
Help Net Security
J
Java Code Geeks
I
InfoQ
Recent Announcements
Recent Announcements
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Recorded Future
Recorded Future
Jina AI
Jina AI
Microsoft Security Blog
Microsoft Security Blog
WordPress大学
WordPress大学
GbyAI
GbyAI
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Y
Y Combinator Blog
Google DeepMind News
Google DeepMind News
Scott Helme
Scott Helme
S
SegmentFault 最新的问题
S
Securelist
L
LINUX DO - 热门话题
Cyberwarzone
Cyberwarzone
C
Cisco Blogs
Simon Willison's Weblog
Simon Willison's Weblog
G
Google Developers Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 叶小钗
T
The Blog of Author Tim Ferriss
博客园_首页
B
Blog
F
Fortinet All Blogs
AWS News Blog
AWS News Blog
V
Vulnerabilities – Threatpost
S
Secure Thoughts
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Forbes - Security
Forbes - Security
S
Security @ Cisco Blogs
T
Threat Research - Cisco Blogs
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
Schneier on Security
Project Zero
Project Zero
Martin Fowler
Martin Fowler
C
Cybersecurity and Infrastructure Security Agency CISA
N
Netflix TechBlog - Medium
N
News and Events Feed by Topic

囧克斯

奔四了,写给40岁的自己 有序退网 我和 Vue.js 的十年 我参与《代码之外 Beyond Code》的故事 博客站迁移至 VitePress 的备忘 写给我的奶奶 中文格式化小工具 zhlint 及其开发心得 vue-mark-display:用 markdown 语法轻松撰写幻灯片 我对技术会议的一些看法 VueConf Hangzhou 见闻 第四届 CSSConf CN 见闻 [译]Web 表单的未来 [译]苹果正在做一些他们的程序员明摆着不想要的东西 [译]为什么我不会无偿加班且你也不应该 [译]如果管理是唯一可走的路,那就完蛋了 [译]如何撰写 Git 提交信息 [译]C 程序的原则 Vue 2.0 来了! Weex 近 4 个月的开源之路 Weex 在 JS Runtime 内的多实例管理 我理解的 SPA 我理解的 Flux 架构 【整理】Vue 2.0 自 beta 1 到 beta 4 以来的主要更新 通过一张图走进 Vue 2.0 Code Review for Vue 2.0 Preview Vue 2.0 发布啦! 务实的小而美 Vue.js 1.0.0 发布了! [译]如何成为一名卓越的前端工程师 手机淘宝前端的图片相关工作流程梳理 [译]如何让办公室政治最小化 Vue.js 源码学习笔记 从原型到发布——“团队时间线” 1.0 开发心得 Vue + webpack 项目实践 用 Koa 写服务体验 webcomponents 笔记 之 配置管理 小秀个人的13~14年摄影作品 (共19张) 由今年D2前端论坛想到的 [译]CSS命名神马的真心难 [译]Git 分支的最佳实践 [译]撰写可测试的 JavaScript [译]语义化版本管理 [译]通过HTML5 Canvas API调节图像的亮度和颜色 [译]JavaScript V8性能小贴士 [译]视觉差,走起! [译]Chrome开发者工具中评估性能的五大新特性 精气神儿 细节无微不至,彩屏让人又爱又恨——新老“神机”大对决:Nokia 1050 vs Nokia 1202 秦升拿到红牌之后…… 用Sass重新整理自己的博客主题样式 Connect中间件使用手册 巧用 RequireJS Optimizer 给传统的前端项目打包 编辑器小调查结果 [译]JSLint 文档 烟火——写给蛇年的傲游和我 小秀个人的全年摄影作品 (共15张) 2012年终毫无正能量的总结 标签?ID?还是CLASS? 微创新=伪创新 HTML5峰会归来 分享bookmarklet一则:随意阅读 国际羽联和中国队之间的恶性循环 ZeroClipboard 学习笔记 “思考人生” 听杨东杰弹吉他 学习精髓 网站装修笔记20120426 网站装修笔记20120414 网站装修笔记20120406 分享Typecho插件:百度统计助手 我的得奖感言 网站装修笔记20120331 用CSS3制作尖角标签按钮样式 分享Typecho插件:Markdown 解析器 + 编辑器 分享Typecho皮肤:我的字很大 汇总自己过去的一些HTML5科普文章 html5中的消息通信简介 + 我的新网站开张 网站装修计划 文明看球 HTML5中的文件处理 之 File Writer API HTML5中的文件处理 之 File API 独生子女、互相等和不耐烦 IndexedDB技术简介(四) IndexedDB技术简介(三) IndexedDB技术简介(二) IndexedDB技术简介(一) 把博客的字体进一步调大,同时去掉了侧边栏 “模仿别人是为了找到自己” 写给我未婚妻的2011年 写给自己的2011年 手把手教你入门EaselJS做HTML5动画 “吃了吧,不吃就浪费了” 写给傲游的2011年 所谓专业 写给HTML5的2011年 对HTML5中LocalStorage的一些使用建议 回味一下我2011年看到的最过瘾的5场足球比赛 浅浅浅谈开饭店被顾客吃出“异物”的用户体验 前端的本职 继续对Mac穷追猛打 之 修改原生按钮文字大小的技巧
Typed Arrays 是神马?
勾三股四 · 2012-03-19 · via 囧克斯

本文摘自 勾三股四 更早时期的 不老歌 博客。


在越来越多的W3C规范中见到TypedArrays和arrayBuffer这两个名词了,由于实际开发中还用不到,每次读到,就跳过去了。

当然这是不对滴……

今天,我们就来讨论一下这个JavaScript typed arrays

简介

首先,这个东东可以看做是对字符串格式的扩展,也可以看做是比字符串更好的描述二进制内容的数据类型。我们都知道,平时用记事本打开一个二进制文件,往往会看到一些稀奇古怪的字符、间歇的空格空行等等。这是因为二进制文件中每一个“字符”单位的数据都是无意义的,这不想文本文件那样,每个字符单位的数据可以独立查看和理解。所以,我们在处理二进制数据的时候,用字符串是很困难的,能用到的恐怕就只有类似

for (var i = 0; i < str.length; i++) {
    console.log(str.charCodeAt(i));
}

的操作,才有可能让我们进行二进制级别的数据操作。

我们今天要介绍的TypedArray比这样处理方便得多。

原理

TypedArray的大概原理就是以charCode数组的形式,把一个二进制文件进行分解和体现。而数字进制有8、16、32、64这么几种。

接口介绍

这里一共有2个独立的接口和1个系列的接口,独立的接口就是ArrayBuffer和ArrayBufferView,系列接口就是TypedArray系列,包括下面几种接口:

  • Int8Array 1B
  • Uint8Array 1B
  • Uint8ClampedArray 1B
  • Int16Array 2B
  • Uint16Array 2B
  • Int32Array 4B
  • Uint32Array 4B
  • Float32Array 4B
  • Float64Array 8B

    ArrayBuffer是用来记录数组形式的二进制数据的,主要有两个特性/方法:byteLength和slice(begin, end),用法和FileAPI中的Blob的接口相对应,基本一样。

    ArrayBufferView则是用来可视化展示数据的一个基本接口,它包含一个ArrayBuffer对象,其特性名为buffer,另外有两个特性可以决定数据展示的范围:byteOffset和byteLength。

    最后,TypedArray则是由ArrayBufferView继承而来,除了具有buffer、byteOffset、byteLength之外,还具有以下特性/方法:

    const BYTES_PER_ELEMENT // 取决于具体的单位字节数

    readonly length; // 长度

    getter get(index); // 数组取值
    setter set(index, value); // 数组赋值

    void set(array[, offset]); // 设置数据
    TypedArray subarray(begin[, end]); // 截取其中一部分

    举个简单的例子

    我们试着读取一下百度的favicon,打开http://www.baidu.com/,然后在命令行里敲入下面的代码:

    var a = new XMLHttpRequest;
    a.open('GET', 'http://www.baidu.com/favicon.ico');
    a.responseType = 'arraybuffer';
    a.send();
    这样a.response就会得到一个ArrayBuffer对象,对象的数据内容正代表了站点图标的二进制数据。然后我们继续运行
    var b = new Int16Array(a.response);
    这样就得到了一份16进制格式的数据。我们将其在命令行输出,这时就会看到:
    Int16Array
    0: 0
    1: 1
    2: 1
    3: 4112
    4: 16
    5: 1
    6: 4
    7: 296
    8: 0
    9: 22
    10: 0
    11: 40
    12: 0
    13: 16
    14: 0
    15: 32
    16: 0
    17: 1
    18: 4
    19: 0
    20: 0
    21: 128
    22: 0
    23: 0
    24: 0
    25: 0
    26: 0
    27: 0
    28: 0
    29: 0
    30: 0
    31: 0
    32: 0
    33: 0
    34: 128
    35: -32768
    36: 0
    37: -32768
    38: 128
    39: 128
    40: 0
    41: 128
    42: 128
    43: -32640
    44: 0
    45: -32640
    46: 128
    47: -16192
    48: 192
    49: 0
    50: 255
    51: -256
    52: 0
    53: -256
    54: 255
    55: 255
    56: 0
    57: 255
    58: 255
    59: -1
    60: 0
    61: -1
    62: 255
    63: -13108
    64: -13108
    65: -13108
    66: -13108
    67: -49
    68: -1
    69: -1
    70: -769
    71: -1841
    72: -14388
    73: -13188
    74: -881
    75: -817
    76: -13108
    77: -13108
    78: -817
    79: -817
    80: -13108
    81: -13108
    82: -817
    83: -1841
    84: -13108
    85: -13108
    86: -881
    87: -49
    88: -13172
    89: -14132
    90: -769
    91: -29489
    92: -13176
    93: -30516
    94: -824
    95: -13105
    96: -29489
    97: -824
    98: -820
    99: -13105
    100: -49
    101: -1793
    102: -824
    103: -29489
    104: -14200
    105: -14088
    106: -769
    107: -49
    108: -13060
    109: -13060
    110: -769
    111: -49
    112: -13060
    113: -13060
    114: -769
    115: -49
    116: -14088
    117: -28673
    118: -769
    119: -49
    120: -1
    121: -1
    122: -769
    123: -13108
    124: -13108
    125: -13108
    126: -13108
    127: 0
    128: 0
    129: 0
    130: 0
    131: 0
    132: 0
    133: 0
    134: 0
    135: 0
    136: 0
    137: 0
    138: 0
    139: 0
    140: 0
    141: 0
    142: 0
    143: 0
    144: 0
    145: 0
    146: 0
    147: 0
    148: 0
    149: 0
    150: 0
    151: 0
    152: 0
    153: 0
    154: 0
    155: 0
    156: 0
    157: 0
    158: 0
    buffer: ArrayBuffer
    byteLength: 318
    byteOffset: 0
    length: 159
    proto: Int16Array

    这正是站点图标的数据,数据非常可视化,非常友好。

    总结

    TypedArray的好处是,略显枯燥晦涩的位操作,可以摇身一变,变成我们熟悉的数学计算,一个比较好理解的事情,就是用js实现zip压缩算法。感兴趣的可以移步到zip.js去看看他们的实现。

    其实我这里还等于顺带介绍了XMLHttpRequest Level 2,新增的接口我刚才的例子中也提到了一部分。其它新增的接口还有请求与发送更丰富的数据格式、ajax请求可以显示进度(onprogress)等等,这里不做展开介绍了,感兴趣的可以自行移步学习。

    以上