js判断是否是数组
今天我就教大家如何在js中判断一个对象是否是数组。有的新手同学可能觉得直接用typeof就可以了,哈哈哈……你可以试试typeof。什么返回数组?羊毛面料?
如果你想看js检查对象的内容,可以看我的文章。
现代浏览器解决方案
如果忽略旧的浏览器,只考虑当前的浏览器,我们可以使用ES5语法,如下:
/** * 时间:2019年8月16日 * 家庭教程:https://codeqd.com/wp-content/uploads/2023/09/ */ Array.isArray(obj);
此方法兼容Chrome 5、Firefox 4.0、IE 9、Opera 10.5和Safari 5。有关详细兼容性,请阅读本文。
考虑兼容性,还可以添加以下代码:
/** * 时间:2019年8月16日 * 家庭教程:https://codeqd.com/wp-content/uploads/2023/09/ */ if (typeArray.isArray === '未定义') { Array.isArray = 函数(obj) { return Object.prototype.toString.call(obj) === '[object Array]'; } };
如果您使用 jQuery,则可以使用 jQuery.isArray(obj) 或 $.isArray(obj)。
另一种解决方案
数组是对象(typeof[] ===“object”),但与传统对象不同,它们具有长度属性(typeof({}).length ===“undefined”)。 null 也是一个对象(typeof null === "object"),但由于 null 不是对象,因此无法访问 null 属性。这是规范中的一个错误,这可以追溯到 JavaScript 的设计。关于这个介绍,可以查看我的文章(JavaScript基本类型:为什么typeof null返回“object”)。
不幸的是,这忽略了 [] 与 {length: 0}。所以现在我们需要转向原型链。
完整代码如下:
/** * 时间:2019年8月16日 * 家庭教程:https://codeqd.com/wp-content/uploads/2023/09/ */ 函数 is_array(数组){ 返回数组! == 空 && 数组类型 === "对象" && array.__proto__ === Array.prototype; } [ [], [1,2,3], {长度: 0}, {}, 1, 0, 无穷大, NaN, "1", "[1,2,3]", null, 未定义, [null], [未定义], {a:[]}, [{}]、[{长度:0}]、[无限制]、[NaN]、 {__proto__: 数组.prototype} ].filter(is_array) // 期望结果: [ [], [1,2,3], [null], [undefined], [{}], [{length: 0}], [Unlimited], [NaN] ] // 实际结果: [ [], [1,2,3], [null], [undefined], [{}], [{length: 0}], [Undefined], [NaN], {__proto__: Array .原型}]
接下来,我们来看另一个例子。我们创建一个恶意对象,修改数组以达到通过测试的目的。这个效果可以通过将__proto__对象改为Array的Array.prototype来实现。
/** * 时间:2019年8月16日 * 家庭教程:https://codeqd.com/wp-content/uploads/2023/09/ */ a = {__proto__: Array.prototype}; // 大批 {} A。按 (5) // [5] A。长度=5 a // [5, 空 x 4]b = a.map(n => n*n) // [25, 空 x 4] b.推(未定义) b.推(未定义) b // [25,空 x 4,未定义,未定义] b[1] // 未定义 b[1] === b[5] // 正确 Array.isArray(a) // false is_array(a) // 正确 Array.isArray(b) // true
可以看到,虽然我们写的函数返回true,但是a却不是true。因此,有效判断一个对象是否为数组的唯一方法就是Array.isArray方法。
我个人认为开发者应该鼓励用户使用新的浏览器版本以避免不必要的问题,而如果支持旧的JS版本意味着支持旧的浏览器,那就意味着鼓励使用不安全的软件。用户面临着软件带来的安全风险。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。