每天一题,坚持思考
题目
实现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;
}
实现思路
参数:
values(Array|String|Object):查询长度的值;
步骤:
- 判断
values的值,如果是null或者undefined则返回0; - 判断
values的类型,如果是字符串或者数组,那么就返回对象的length属性; - 剩下对象类型,使用
for...in来进行遍历,这里注意for...in会遍历整个原型链上的属性,所以需要用hasOwnProperty来进行判断是否是当前对象的属性,这里是借用了Object.prototype上的hasOwnProperty方法,因为如果直接调用对象上的这个方法,有可能被改写,所以这里借用了Object.prototype上的来进行判断,最后返回对象属性数组的length;
如果读者发现有不妥或者可以改善的地方,欢迎在评论区指出。如果觉得写得不错或者对你有所帮助,可以点赞、评论、转发分享,谢谢~