JavaScript数组检测函数中[object array]字符串的作用是什么?
关于你这段数组检测代码的问题说明
你代码中比对字符串的实际作用与问题
你写在if判断里的"[object array]" 本质是用来做字符串相等匹配的参照值,但这段值存在两个致命问题,完全达不到设计目的:
- 格式和规范要求的返回值不匹配
原本用Object.prototype.toString.call(input)做类型检测的逻辑,是依靠这个方法返回标准化的类型标签字符串工作的,规范规定的返回格式为[object 构造函数名],其中构造函数名的首字母固定大写:- 检测真实数组时,方法返回的正确值是
"[object Array]"(注意Array的首字母大写) - 检测字符串返回
"[object String]",检测普通对象返回"[object Object]"
你写的参照值把Array写成了全小写的array,哪怕调用的toString方法完全正确,两个字符串也永远不可能相等。
- 检测真实数组时,方法返回的正确值是
- 额外的代码隐患:你代码里裸写的
toString.call(input),在没有全局重写toString的环境下,实际调用的是全局对象继承自Object原型的toString方法,能返回正确的类型标签,但如果页面引入了其他脚本重写了全局的toString方法,整个判断逻辑会直接失效。
这段代码的实际运行效果
因为字符串永远匹配不上,if里的分支永远不会触发,不管传入什么值,函数最终都会返回false:
- 传入字符串
'welcome'时,方法返回"[object String]",和参照值不匹配,控制台打印false - 传入数组
[1,2,3,4,5]时,方法返回"[object Array]"(大写A),和参照值还是不匹配,控制台照样打印false
也就是说这段代码根本实现不了识别数组的作用。
修正后的可用写法
要让这个判断逻辑生效,只需要把参照值改成正确的大写格式,同时显式调用Object原型上的toString方法,避免全局toString被篡改的问题:
var is_array = function(input){ return Object.prototype.toString.call(input) === "[object Array]" }
这种写法的可靠性远高于typeof、instanceof,哪怕跨iframe传入的数组对象,也能正确识别。
内容的提问来源于stack exchange,提问作者Xeeshad Tanvir
相关产品推荐
相关产品推荐

