首页 > 其他分享 >js边界情形

js边界情形

时间:2024-01-14 15:32:26浏览次数:27  
标签:const 边界 0x0 js 情形 new alert buf view

// 在内存中分配两个字节并声明一个DataView const buf = new ArrayBuffer(2); const view = new DataView(buf);
// 填充缓冲,让第一位和最后一位都是1 view.setUint8(0, 0x80); // 设置最左边的位等于1 view.setUint8(1, 0x01); // 设置最右边的位等于1
// 缓冲内容(为方便阅读,人为加了空格) // 0x8 0x0 0x0 0x1
// 1000 0000 0000 0001
// 按大端字节序读取Uint16
// 0x80 是高字节,0x01 是低字节
// 0x8001 = 2^15 + 2^0 = 32768 + 1 = 32769 alert(view.getUint16(0)); // 32769
// 按小端字节序读取Uint16
// 0x01 是高字节,0x80 是低字节
// 0x0180 = 2^8 + 2^7 = 256 + 128 = 384 alert(view.getUint16(0, true)); // 384
// 按大端字节序写入Uint16 view.setUint16(0, 0x0004);
// 缓冲内容(为方便阅读,人为加了空格) // 0x0 0x0 0x0 0x4
// 0000 0000 0000 0100
    alert(view.getUint8(0)); // 0
    alert(view.getUint8(1)); // 4
// 按小端字节序写入Uint16 view.setUint16(0, 0x0002, true);
// 缓冲内容(为方便阅读,人为加了空格) // 0x0 0x2 0x0 0x0
// 0000 0010 0000 0000
    alert(view.getUint8(0)); // 2
    alert(view.getUint8(1)); // 0

1. 边界情形:

DataView 完成读、写操作的前提是必须有充足的缓冲区,否则就会抛出 RangeError:

const buf = new ArrayBuffer(6);
    const view = new DataView(buf);
// 尝试读取部分超出缓冲范围的值 view.getInt32(4);
// RangeError
// 尝试读取超出缓冲范围的值 view.getInt32(8);
// RangeError
// 尝试读取超出缓冲范围的值 view.getInt32(-1);
// RangeError
// 尝试写入超出缓冲范围的值 view.setInt32(4, 123); // RangeError
DataView 在写入缓冲里会尽最大努力把一个值转换为适当的类型,后备为 0。如果无法转换,则 抛出错误:
    const buf = new ArrayBuffer(1);
    const view = new DataView(buf);
    view.setInt8(0, 1.5);
    alert(view.getInt8(0)); // 1
    view.setInt8(0, [4]);
    alert(view.getInt8(0)); // 4
       view.setInt8(0, 'f'); 8 alert(view.getInt8(0)); // 0
    view.setInt8(0, Symbol());
    // TypeError

2. 定型数组:

定型数组是另一种形式的 ArrayBuffer 视图。虽然概念上与 DataView 接近,但定型数组的区别 在于,它特定于一种 ElementType 且遵循系统原生的字节序。相应地,定型数组提供了适用面更广的 API 和更高的性能。

设计定型数组的目的就是提高与 WebGL 等原生库交换二进制数据的效率。由于定 型数组的二进制表示对操作系统而言是一种容易使用的格式,JavaScript 引擎可以重度优化算术运算、 按位运算和其他对定型数组的常见操作,因此使用它们速度极快。

创建定型数组的方式包括读取已有的缓冲、使用自有缓冲、填充可迭代结构,以及填充基于任意类 型的定型数组。另外,通过.from()和.of()也可以创建定型数组:

// 创建一个 12 字节的缓冲
const buf = new ArrayBuffer(12);
// 创建一个引用该缓冲的Int32Array
const ints = new Int32Array(buf);
// 这个定型数组知道自己的每个元素需要 4 字节
// 因此长度为3
alert(ints.length); // 3

标签:const,边界,0x0,js,情形,new,alert,buf,view
From: https://blog.51cto.com/u_16298172/9240859

相关文章

  • Json Schema介绍 和 .net 下的实践 - 基于Lateapexearlyspeed.Json.Schema - 基础1 -
    本系列旨在介绍JsonSchema的常见用法,以及.net实现库Lateapexearlyspeed.Json.Schema的使用这篇文章将介绍JsonSchema中的type关键字,和string类型的常见验证功能。用例基于.net的LateApexEarlySpeed.Json.Schemanugetpackage。这是新创建的一个JsonSchema在.net下的高性能......
  • C#调用webapi发送带json参数的post请求
    嗯。。很久不更新,因为跳槽新公司了,要学的东西太多太忙了。也没时间记录,今天又写了一个C#调用webapi发送带json参数的post请求拿数据的方法,所以来到这里记录一下///<paramname="url">请求地址</param>///<paramname="jsonParas">请求体</param>///<paramnam......
  • C#将从数据库查处的table格式的数据转为json
    这里的代码是封装好的类,将Datatable作为参数传进来即可解析出json格式的数据,看代码publicstaticstringToJson(DataTabledt){intcount=dt.Rows.Count;//将DataTable格式的数据转换成json格式StringBuilderjsonBuilder=ne......
  • SpringBoot集成Jackson实现JSON序列化
    一、前言Jackson是一个在Java中常用的JSON序列化和反序列化库,它具有操作简单、性能优秀、支持多种数据格式等特点,被广泛应用于各种服务端开发中。SpringMVC框架的默认json解析器也是Jackson。当前常见的json解析器还有Gson、fastjson等,jackson的优势是解析大的json文件处理速度快,运......
  • Next.js 开发指南 路由篇 | App Router
    Next.js开发指南路由篇|AppRouter 前言路由(routers)是应用的重要组成部分。所谓路由,有多种定义,对于应用层的单页应用程序而言,路由是一个决定URL如何呈现的库,在服务层实现API时,路由是解析请求并将请求定向到处理程序的组件。简单的来说,在Next.js中,路由决定了一个页......
  • Next.js 开发指南 初始篇 | Next.js CLI
    Next.js开发指南初始篇|Next.jsCLI 基础篇、实战篇、源码篇、面试篇四大篇章带你系统掌握Next.js! 前言欢迎学习Next.js!在学习具体的知识点之前,我们先来创建一个Next.js项目。创建了可运行的项目,才能在学习的时候边调试边理解,从而达到事半功倍的效果。幸运的是......
  • js 排序方法
    数组有两个方法可以用来对元素重新排序:reverse()和sort()。顾名思义,reverse()方法就是将数组元素反向排列。比如:letvalues=[1,2,3,4,5];values.reverse();alert(values);//5,4,3,2,1这里,数组values的初始状态为[1,2,3,4,5]。通过调用reverse()反向排序,......
  • js 队列方法
    就像栈是以LIFO形式限制访问的数据结构一样,队列以先进先出(FIFO,First-In-First-Out)形式限制访问。队列在列表末尾添加数据,但从列表开头获取数据。因为有了在数据末尾添加数据的push()方法,所以要模拟队列就差一个从数组开头取得数据的方法了。这个数组方法叫shift(),它会删除......
  • js 栈方法
    ECMAScript给数组提供几个方法,让它看起来像是另外一种数据结构。数组对象可以像栈一样,也就是一种限制插入和删除项的数据结构。栈是一种后进先出(LIFO,Last-In-First-Out)的结构,也就是最近添加的项先被删除。数据项的插入(称为推入,push)和删除(称为弹出,pop)只在栈的一个地方发生......
  • js 搜索和位置方法
    ECMAScript提供两类搜索数组的方法:按严格相等搜索和按断言函数搜索。1.严格相等:ECMAScript提供了3个严格相等的搜索方法:indexOf()、lastIndexOf()和includes()。其中,前两个方法在所有版本中都可用,而第三个方法是ECMAScript7新增的。这些方法都接收两个参数:要查找的元......