资讯专栏INFORMATION COLUMN

Slice无参调用可以将类数组对象(含有length属性)转化成数组

MudOnTire / 1363人阅读

摘要:首先,有两个用法,一个是一个是,第一个返回的是字符串,第二个返回的是数组,这里我们看第个。最后,附个转成数组的通用函数据说这样比快

Array.prototype.slice.call(arguments)

根据call的使用方法,我们可以猜测以下可能相等:

[].slice.call(arguments)  => arguments.slice()

我带着好像少了一个必需参数的疑问去查资料后得知:
Array.prototype.slice.call(arguments)能将具有length属性的对象转成数组,除了IE下的节点集合(因为ie下的dom对象是以com对象的形式实现的,js对象与com对象不能进行转换)
如:

 var a={length:2,0:"first",1:"second"};
 Array.prototype.slice.call(a);//  ["first", "second"]
  
 var a={length:2};
 Array.prototype.slice.call(a);//  [undefined, undefined]

可能刚开始学习js的童鞋并不是很能理解这句为什么能实现这样的功能。比如我就是一个,所以,来探究一下。

首先,slice有两个用法,一个是String.slice,一个是Array.slice,第一个返回的是字符串,第二个返回的是数组,这里我们看第2个。

Array.prototype.slice.call(arguments)能够将arguments转成数组,那么就是arguments.toArray().slice();到这里,是不是就可以说Array.prototype.slice.call(arguments)的过程就是先将传入进来的第一个参数转为数组,再调用slice

再看call的用法,如下例子

var a = function(){
     console.log(this);    // "littledu"
     console.log(typeof this);      //  Object
     console.log(this instanceof String);    // true
}
a.call("littledu");

可以看出,call了后,就把当前函数推入所传参数的作用域中去了,不知道这样说对不对,但反正this就指向了所传进去的对象就肯定的了。
到这里,基本就差不多了,我们可以大胆猜一下slice的内部实现,如下

1 Array.prototype.slice = function(start,end){
2      var result = new Array();
3      start = start || 0;
4      end = end || this.length; //this指向调用的对象,当用了call后,能够改变this的指向,也就是指向传进来的对象,这是关键
5      for(var i = start; i < end; i++){
6           result.push(this[i]);
7      }
8      return result;
9 }

大概就是这样吧,理解就行,不深究。

最后,附个转成数组的通用函数

var toArray = function(s){
 2     try{
 3         return Array.prototype.slice.call(s);
 4     } catch(e){
 5             var arr = [];
 6             for(var i = 0,len = s.length; i < len; i++){
 7                 //arr.push(s[i]);
                   arr[i] = s[i];  //据说这样比push快
 8             }
 9              return arr;
10     }
11 }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/95959.html

相关文章

  • 详解call bind apply - 区别/使用场景/es6实现/es3实现

    摘要:的区别接收数组一连串参数返回一个函数的使用场景将类数组含有属性的对象转化为数组类数组例如通过获取的元素含有属性的对象具有属性,并且可以通过下标来访问其中的元素,但是没有中的等方法。 call,apply,bind的区别 apply接收数组 func.apply(obj, [arus]) call一连串参数 func.call(obj, param1, param2....) bind...

    Alex 评论0 收藏0
  • 把玩 JavaScript 中的 bind

    摘要:此模式调用函数的时候,被绑定到全局对象。构造器调用模式如果在一个函数前面带上来调用,那么背地里将会创建一个连接到该函数的成员的新对象,同时会被绑定到新对象上。 前言 今天闲着无聊随便逛了逛MDN,忽而看到一个方法Function.prototype.bind(),突然发现除了使用这个方法之外都没有仔细琢磨过这个方法。于是乎,找到了kill time的事情-写博客。 基础知识简介 ...

    shenhualong 评论0 收藏0
  • 理解javascript类数组

    摘要:也就是说,为一些常规对象增加一些属性可以使其变成类数组对象。实际上,类数组的定义只有一条,具有属性。在中,所有的数组方法都是通用的。 什么是类数组 javascript中一些看起来像却不是数组的对象,叫做类数组。也就是说,为一些常规对象增加一些属性可以使其变成类数组对象。 类数组的特征: 有索引(数字)属性和length属性的对象 不具有数组的方法。间接调用数组的一些方法,比如pus...

    yzzz 评论0 收藏0
  • JavaScript数组方法总结

    摘要:如重排序方法它的原理是先调用数组的方法,之后再进行字符串的比较。长度为的数组。返回的是被删除的项,如果没删除则返回空数组,而且之前的数组也被改变位置方法可以检测变量,它的两个参数是第一个是要查找的值或变量,第二个是从哪开始找。 length属性方法 数组的length属性不单单是只读的,还可以写入var color = [‘red’,’blue’,’black’];Color.leng...

    Forest10 评论0 收藏0
  • js基础篇

    摘要:安全防范机制未声明变量声明未初始化变量使用来做安全防范机制可以预防报错数组数组可以容纳任何类型的值。因此与进行操作即可截取中的位数位。 安全防范机制 未声明变量undeclared、声明未初始化变量undefined var a b typeof a //undefined typeof b //undefined 使用typeof来做安全防范机制可以预防报错 if(typeof...

    solocoder 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<