阿西河

所有教程

公众号
🌙
阿西河前端的公众号

我的收藏

    最近访问  (文章)

      教程列表

      抓包专区
      测试专区

      JavaScript ArrayBuffer transfer() 方法的总结

      这是一个实验中的功能
      此功能某些浏览器尚在开发中,请参考浏览器兼容性表格以得到在不同浏览器中适合使用的前缀。由于该功能对应的标准文档可能被重新修订,所以在未来版本的浏览器中该功能的语法和行为可能随之改变。

       静态**ArrayBuf**fer.transfer() 方法返回一个新的ArrayBuffer, 其内容取自oldBuffer的数据,并且根据 newByteLength 的大小来对数据进行截取或者以0扩展。 如果 newByteLength 未定义,则使用 oldBuffer 的byteLength。这个操作使得 oldBuffer 处于被移除的状态。

      语法

      ArrayBuffer.transfer(oldBuffer [, newByteLength]);
      

      参数

      oldBuffer

       要转移的ArrayBuffer对象。

      newByteLength

      ArrayBuffer 对象的字节长度。

      返回值

      一个新的ArrayBuffer对象。

      描述

      ArrayBuffer.transfer()方法允许你增长和移除 ArrayBuffer 对象。不需复制就能增长一个ArrayBuffer的功能,对于大的缓冲区来说,有速度优势 (类似realloc) 。当释放底层内存时,移除ArrayBuffer的功能给开发者提供了显式控制。这避免了必须丢弃所有引用和等待垃圾回收。

      示例

      var buf1 = new ArrayBuffer(40);
      new Int32Array(buf1)[0] = 42;
      
      var buf2 = ArrayBuffer.transfer(buf1, 80);
      buf1.byteLength; // 0 but if you use the polyfill then the value is still 40
      buf2.byteLength; // 80
      new Int32Array(buf2)[0]; // 42
      
      var buf3 = ArrayBuffer.transfer(buf2, 0);
      buf2.byteLength; // 0 but if you use the polyfill then the value is still 80
      buf3.byteLength; // 0
      
      

      Polyfill

      You can partially work around this by inserting the following code at the beginning of your scripts, allowing use of much of the functionality of transfer() in implementations that do not natively support it. This is not the exact equivalent of this API, but this function transfers data from one ArrayBuffer to another ArrayBuffer.

      if(!ArrayBuffer.transfer) {
          ArrayBuffer.transfer = function (source, length) {
              source = Object(source);
              var dest = new ArrayBuffer(length);
              if(!(source instanceof ArrayBuffer) || !(dest instanceof ArrayBuffer)) {
                  throw new TypeError("Source and destination must be ArrayBuffer instances");
              }
              if(dest.byteLength >= source.byteLength) {
                  var nextOffset = 0;
                  var leftBytes = source.byteLength;
                  var wordSizes = [8, 4, 2, 1];
                  wordSizes.forEach(function (_wordSize_) {
                      if (leftBytes >= _wordSize_) {
                          var done = transferWith(_wordSize_, source, dest, nextOffset, leftBytes);
                          nextOffset = done.nextOffset;
                          leftBytes = done.leftBytes;
                      }
                  });
              }
              return dest;
              function transferWith(wordSize, source, dest, nextOffset, leftBytes) {
                  var ViewClass = Uint8Array;
                  switch (wordSize)  {
                      case 8:
                          ViewClass = Float64Array;
                          break;
                      case 4:
                          ViewClass = Float32Array;
                          break;
                      case 2:
                          ViewClass = Uint16Array;
                          break;
                      case 1:
                          ViewClass = Uint8Array;
                          break;
                      default:
                          ViewClass = Uint8Array;
                          break;
                  }
                  var view_source = new ViewClass(source, nextOffset, Math.trunc(leftBytes / wordSize));
                  var view_dest = new ViewClass(dest, nextOffset, Math.trunc(leftBytes / wordSize));
                  for(var i=0; i
      
      规范
      
      Not part of any current specification draft document, but has been proposed for a future ECMA-262 edition.
      
      浏览器兼容性
      
      The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.
      
      Update compatibility data on GitHubDesktopMobileServerChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.jstransfer ExperimentalNon-standardChrome
                      No support
                    
                    NoEdge
                      No support
                    
                    NoFirefox
                      No support
                    
                    NoIE
                      No support
                    
                    NoOpera
                      No support
                    
                    NoSafari
                      No support
                    
                    NoWebView Android
                      No support
                    
                    NoChrome Android
                      No support
                    
                    NoFirefox Android
                      No support
                    
                    NoOpera Android
                      No support
                    
                    NoSafari iOS
                      No support
                    
                    NoSamsung Internet Android
                      No support
                    
                    Nonodejs
                      No support
                    
                    NoLegend
                      
                       No support
                        
                      No supportExperimental. Expect behavior to change in the future.Experimental. Expect behavior to change in the future.Non-standard. Expect poor cross-browser support.Non-standard. Expect poor cross-browser support.
      
      相关链接
      
      
       JavaScript typed arrays
      
      
      卖前端学习教程

      只需几十元,就能买到培训班的内部教程!开启高薪之路!

      零基础小白阿里P7的教程都有!

      同时长期收购所有培训班的前端教程

      目录
      目录