每天一题,size

469 阅读1分钟

每天一题,坚持思考

题目

实现size函数,判断当前值(数组,对象,字符串)的长度。

size('1234'); // 4
size({a: 1, b: 2}); // 2
size([1, 2, 3]); // 3

具体实现

// 判断是否为数组
function isArray(arr) {
    return Object.prototype.toString.call(arr) === '[object Array]';
}

function size(values) {
    // 如果values值是null,undefined,返回0
    if (values == null) return 0;
    // 字符串或者数组,则返回length值
    if (typeof values === 'string' || isArray(values)) return values.length;
    
    // 对象则需要遍历,因为for...in会遍历原型链上的属性,所以调用Object原型链上hasOwnProperty属性来判断
    var result = [];
    for (var key in values) {
        if (Object.prototype.hasOwnProperty.call(values, key)) {
            result[result.length] = key;
        }
    }
    return result.length;
}

实现思路

参数:

  1. values(Array|String|Object):查询长度的值;

步骤:

  1. 判断values的值,如果是null或者undefined则返回0;
  2. 判断values的类型,如果是字符串或者数组,那么就返回对象的length属性;
  3. 剩下对象类型,使用for...in来进行遍历,这里注意for...in会遍历整个原型链上的属性,所以需要用hasOwnProperty来进行判断是否是当前对象的属性,这里是借用了Object.prototype上的hasOwnProperty方法,因为如果直接调用对象上的这个方法,有可能被改写,所以这里借用了Object.prototype上的来进行判断,最后返回对象属性数组的length

如果读者发现有不妥或者可以改善的地方,欢迎在评论区指出。如果觉得写得不错或者对你有所帮助,可以点赞、评论、转发分享,谢谢~