ES6之前,JS无法直接处理二进制数据。Node为了弥补这个不足,加入了Buffer。 ES6加入了处理二进制数据的一些类,这些类和Buffer功能大体一致,也有不同之处。下面简单说说不同点。 ES6 ES6处理二进制数据更为谨慎,提供很多的相关类。ArrayBuffer用来表示原始的二进制数据,然而你并不能直接操作它所表示的二进制数据。你可以通过TypedArray,把二进制数据当做某种基础数据类型的数组来访问,或者用DataView来读写,修改二进制数据。 TypedArray仅仅是一个概念,并不是直接可以使用的类。TypedArray指的是如下几个类。 Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array 如名字所示,分别用相应的数据格式表示相应的二进制数据,这里不存在转换。 DataView是用来读写二进制数据的,你可以从已有的二进制数据上创建,以此来操作这些二进制数据。关键的是如果需要指定大端还是小段,需要作为参数传入。例如dataview.getInt32(byteOffset [, littleEndian]) Node 用于表示二进制数据的只有一个Buffer类,在这个类上,你可以读写数据,访问数据。这个应该不用多说了,多多少少很定用过吧。 其他 使用 其实我觉得Buffer方便,DataView必须在ArrayBuffer或者TypedArray之上创建,所以用起来稍显麻烦,不过读写操作上二者差不多。 源码 ArrayBuffer那些类,会由v8实现,而Buffer其实用的也是用v8的ArrayBuffer来封装的。 // Node.JS 6.3.1 src/node_buffer.cc 309行 MaybeLocal<Object> New(Environment* env, size_t length) { EscapableHandleScope scope(env->isolate()); // V8 currently only allows a maximum Typed Array index of max Smi. if (length > kMaxLength) { return Local<Object>(); } void* data; if (length > 0) { data = BUFFER_MALLOC(length); // 用malloc直接分配内存 if (data == nullptr) return Local<Object>(); } else { data = nullptr; } Local<ArrayBuffer> ab = // 将内存封装成ArrayBuffer ArrayBuffer::New(env->isolate(), data, length, ArrayBufferCreationMode::kInternalized); Local<Uint8Array> ui = Uint8Array::New(ab, 0, length); // Buffer一开始都是Uint8Array Maybe<bool> mb = ui->SetPrototype(env->context(), env->buffer_prototype_object()); if (mb.FromMaybe(false)) return scope.Escape(ui); // Object failed to be created. Clean up resources. free(data); return Local<Object>(); } 所以基本可以认为Buffer是对ES6处理二进制数据方法的一种封装。你不用去编写Uint8Array,DataView等类来处理数据,直接在Buffer上操作就可以了。而且这种C/C++的封装也比JS自己写好很多。 问题在于ES6的更加强大,甚至出现了SharedArrayBuffer,分配在共享内存上,感兴趣可以查一查资料。 最后 后半夜大了这么多字,给点赞同呗,^_^。
ES6之前,JS无法直接处理二进制数据。Node为了弥补这个不足,加入了Buffer。
ES6加入了处理二进制数据的一些类,这些类和Buffer功能大体一致,也有不同之处。下面简单说说不同点。
ES6
ES6处理二进制数据更为谨慎,提供很多的相关类。ArrayBuffer用来表示原始的二进制数据,然而你并不能直接操作它所表示的二进制数据。你可以通过TypedArray,把二进制数据当做某种基础数据类型的数组来访问,或者用DataView来读写,修改二进制数据。
TypedArray仅仅是一个概念,并不是直接可以使用的类。TypedArray指的是如下几个类。
Int8Array
Uint8Array
Uint8ClampedArray
Int16Array
Uint16Array
Int32Array
Uint32Array
Float32Array
Float64Array
如名字所示,分别用相应的数据格式表示相应的二进制数据,这里不存在转换。
DataView
是用来读写二进制数据的,你可以从已有的二进制数据上创建,以此来操作这些二进制数据。关键的是如果需要指定大端还是小段,需要作为参数传入。例如dataview.getInt32(byteOffset [, littleEndian])
Node
用于表示二进制数据的只有一个Buffer类,在这个类上,你可以读写数据,访问数据。这个应该不用多说了,多多少少很定用过吧。
其他
使用
其实我觉得Buffer方便,DataView必须在ArrayBuffer或者TypedArray之上创建,所以用起来稍显麻烦,不过读写操作上二者差不多。
源码
ArrayBuffer
那些类,会由v8
实现,而Buffer
其实用的也是用v8
的ArrayBuffer
来封装的。所以基本可以认为Buffer是对ES6处理二进制数据方法的一种封装。你不用去编写Uint8Array,DataView等类来处理数据,直接在Buffer上操作就可以了。而且这种C/C++的封装也比JS自己写好很多。
问题在于ES6的更加强大,甚至出现了SharedArrayBuffer,分配在共享内存上,感兴趣可以查一查资料。
最后
后半夜大了这么多字,给点赞同呗,^_^。