1、ArrayBuffer
var buffer = new ArrayBuffer(2);
//向内存申请5个字节的空间,一个字节占8位,也就是2*8=16位
2、DataView
var dataview = new DataView(buffer);//创建dataview视图指向该内存区域
dataview.setInt8(0,'100')
dataview.setInt8(1,'104')
//100和104二进制均是8位
console.log(dataview.getInt8(0))
console.log(dataview.getInt8(1))
//所以根据偏移量能够输出100和104
如果使用setInt8存储位数大于8位的数字会如何呢?
/**
如代码,申请了2个字节的内存空间
第一个字节存了正好8位的数字
第二个字节存的是9位的数字300
最后偏移一个字节量,输出的是44
*/
var buffer = new ArrayBuffer(2);
var dataview = new DataView(buffer);
dataview.setInt8(0,'100')
dataview.setInt8(1,'300')
console.log(dataview.getInt8(1))
如图所示
100 = 1100100
300 = 100101100
第二个字节只有8位的空间,300却有9位,存储会从低位到高位,多出来的就会舍去,故300存在第二个字节中的实际二进制应该如下,所以第二个字节取出来的是44
如果第二个字节打头的是1,则取出来的是负数,如
var buffer = new ArrayBuffer(2);
var dataview = new DataView(buffer);
dataview.setInt8(0,'100')
dataview.setInt8(1,'200')
console.log(dataview.getInt8(1))
//output:-56
200的二进制是11001000,内存存储如下图所示
字节开始的首位是符号位,所以在取第二个字节的值时,取的是后七位
当值为负数时,最后的值是补码的值
补码 = -(反码(10进制)+1)
即后7位的反码为0110111,转为10进制为55,根据公式加1,前面加个负号,即为-56
如果申请了1字节的空间,却要存2个字节的数据,则会报错溢出
如果申请了2个字节的空间,存的数据只用了8位,那么该数据在内存中是怎么样存储的呢?
如下
var buffer = new ArrayBuffer(2);
var dataview = new DataView(buffer);
dataview.setInt16(0,'100')
console.log(dataview.getInt16(0))
console.log(dataview.getInt8(1))
内存中如下图
由于是以16位的方式将100存储在2个字节中,所以应该从低位到高位,因此使用gitInt8()获取值时,需要偏移一个字节量
其他格式区别
Int8Array:8位有符号整数,长度1个字节
Uint8Array:8位无符号整数,长度1个字节
Uint8ClampedArray:8位无符号整数,长度1个字节,溢出处理不同
Int16Array:16位有符号整数,长度2个字节
Uint16Array:16位无符号整数,长度2个字节
Int32Array:32位有符号整数,长度4个字节
Uint32Array:32位无符号整数,长度4个字节
Float32Array:32位浮点数,长度4个字节
Float64Array:64位浮点数,长度8个字节
3、汉字及字母等的 ascll码均为数字,那么我们就可以理解它们是如何在内存中存储的了
let a = 'hello world'
var buffer = new ArrayBuffer(11);
var dataview = new DataView(buffer);
let array = Array.from(a,x => x.charCodeAt())
//转成ascll码
for(let i in array){
dataview.setInt8(i,array[i])//存储
}
let str ='' ;
//取值
for(let i = 0;i<array.length;i++){
let temp = String.fromCharCode(dataview.getInt8(i))
str += temp;
}
console.log(str)
//output:hello world
一个字符,占据多少个字节,完全可以从它的ascll码确定,当然,也可以用更多的字节来存储,诸如不同的编码方式,字符的占据字节也不一样