25_underscore.js_isArrayLike.html

KenNaNa · 2018-08-03 18:32:46 · 753 次点击 · 预计阅读时间 2 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2018-08-03 18:32:46 的文章,其中的信息可能已经有所发展或是发生改变。

    
    // 我们还需要用到上次的
    var shallowProperty = function(key) {
        return function(obj) {
          return obj == null ? void 0 : obj[key];
        };
      };
      //首先我们得来弄清楚啥是类数组对
      var arr = Array();//这是真正的数组具有length属性
      console.log(arr.length)//0
      // 真正的数组对象是可以使用Array.prototype对象上的所有方法的
      // 但是类数组也具有length属性
      // 但是呢,他们不能使用Array.prototype上的所有方法
      // 这就是区别所在啊

      var o = {
          length:2,
          name:'ken',
          age:18
      }
      // 那么那些是类数组对象呢
      // 比如函数参数里面的 arguments
      // 比如DOM对象,我们通过getElementsBy* 等方式获取的集合都是类数组
      // 都可以使用下标操作的,

      // 但是我们要如何判断一个对象是一个类数组对象
      // 光判断具有length属性是行不通的,
      // 上面我们说过,他们不具备Array.prototype 上的所有方法
      // length 属性的值必须是有限的
      // 下面我们来看看我们underscore.js是如何实现的呢
      var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;

      var getLength = shallowProperty('length');
      var isArrayLike = function(collection) {
          // 获取length属性
        var length = getLength(collection);
        // 判断length的类型是否number类型
        return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;
    };
    console.log(isArrayLike(o))

    // 但是我们感觉也不够精确啊
    // 我觉得应该判断方法
    // 我们自己来实现以下
    var isArrayLike = function(collection){
        var length = getLength(collection);
        return (!(Array.prototype.alice in collection) && !(Array.prototype.split in collection)) && typeof length === 'number' && length>=0 && length<=MAX_ARRAY_INDEX;
    }
    var oPs = document.querySelectorAll("p")
    console.log(isArrayLike(o));//true
    console.log(isArrayLike(oPs));//true
    function call(a,b){
        console.log(isArrayLike(arguments));//true;
    }
    call(1,2);

在这里附上我的github地址

我的github

© 2018 GitHub, Inc.


有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

753 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传