作者:SamanthaMing译者:前端小智来源:medium点赞再看,微信搜索【大招天下】关注这个没有大厂背景,但是有向上和积极的态度。本文已收录到GitHubhttps://github.com/qq44924588...,文章已分类,也整理了很多我的文档和教程资料。下面的代码片段用于检查变量或值是否为数组。Array.isArray方法可以在主流浏览器中使用。对于旧的浏览器,你可以使用polyfill?const变量=['?','?','?'];//主流浏览器Array.isArray(variable);//旧浏览器Object.prototype.toString.call(variable)==='[objectArray]';检查数组的现代方法检查数组的最佳方法是使用内置的Array.isArray()?Array.isArray([]);//trueArray.isArray(['?']);//trueArray.isArray(newArray('?'));//真正的浏览器支持浏览器对Array.isArray()的支持很好?Polyfillforolderbrowsersifneeded为了让旧浏览器支持它,你可以使用这个MDNpolyfill。if(!Array.isArray){Array.isArray=function(org){returnObject.prototype.toString.call(org)==='[objectArray]'}}其他方式:如果使用Are,则使用Lodash或Underscore外部库,它们也有一些内置方法?Lodash检查值是否为数组对象。constarray=['?','?','?'];constnotArray='非数组';_.isArray(数组);//true_.isArray(notArray);//如果对象是数组,则返回falseUnderscoretrue。constarray=['?','?','?'];constnotArray='非数组';_.isArray(数组);//true_.isArray(notArray);//false为什么我们不能使用typeof?通常,我们想要检查一个值的类型,我们只是使用typeoftypeof'string';//'string'typeof100;//'number'typeoftrue;//'boolean'typeoffalse;//'boolean'typeoffunction(){};//'函数'typeof{};//'object'typeof[];//'对象'<--?问题是数组实际上在Object数据类型的保护之下。所以typeof的返回值是没有问题的。不幸的是,这并不能真正帮助我们,因为我们只想检查该值是否为数组。typeofType示例返回值Stringtypeof"hello""string"Booleantypeoftruetypeoffalse"boolean"Numbertypeof100"number"Undefinedtypeofundefined"undefined"Functiontypeoffunction(){}"function"Nulltypeofnull"object"非基本类型typeof{}typeof[]"object"基本类型在JS中有6种基本数据类型stringnumberbigintbooleanundefinedsymbol非基本类型(object)object指的是一种数据结构,包含了数据和使用数据的指令。它们是通过引用存储的,我更喜欢称它为“非原始类型”,但它们被称为对象。objectarrayfunction虽然当我们在函数上使用typeof来检查函数的类型时它返回“function”,但它实际上是一个对象。MDN:虽然每个Function构造函数都派生自Object构造函数,但它是Function的特殊简写。代码诊断???我已经收到很多开发人员提供不同的解决方案来检查数组。乍一看,它们似乎是一个很好的解决方案。有点遗憾的是,有些问题或极端情况使它们不太理想。Array.lengthconstarray=['?','?','?'];array.length;的问题//3?如果数组有长度,我们可以假设它是一个数组?????不幸的是,这个解决方案的问题是还有其他数据类型也有长度ie,例如:字符串。因此,这可能会导致误报。conststring='不是数组';string.length;//9即使一个对象也可以有一个长度属性:constobject={length:2};constarray=['?','?','?'];typeofarray==='object'&&Boolean(array.length);//truetypeofobject==='object'&&Boolean(object.length);//true<--?instanceofconstarray=['?','?','?'];arrayinstanceofArray;//true这个方法在ES5中很常见,在很多情况下,它都能很好地工作。但是,有一个陷阱!它不适用于多个上下文(例如框架或窗口)。因为每个框架在它自己的执行环境中都有不同的作用域。因此,它具有不同的全局对象和不同的构造函数。因此,如果您尝试根据框架的上下文测试数组,它不会返回true,而是错误地返回false。window.frames:frames[]是窗口中所有命名框架的数组。该数组的每个元素都是一个Window对象,对应于窗口中的一个框架。constframeNode=document.createElement('iframe');//创建一个iframe元素节点document.body.appendChild(frameNode);//从当前窗口访问框架constframeBrowser=window.frames[window.frames.length-1];//访问我们创建的框架的“数组”对象frameArray=frameBrowser.Array;//在我们的框架环境中创建一个新数组constnewFrameArray=newframeArray('?','?','?');newFrameArrayinstanceofArray;//?falseArray.isArray(newFrameArray);//?真正的构造函数问题constarray=['?','?','?'];array.constructor===Array;//true这是另一个很好的解决方案。不幸的是,这与instanceof有同样的问题。它也不适用于多种情况。//...newFrameArray.constructor===数组;//?falseArray.isArray(newFrameArray);//?true实时知道,之后为了解决这些bug,我花了很多时间在日志调试上。顺便给大家推荐一个好用的BUG监控工具Fundebug。交流文章每周更新一次。可以微信搜索【大千世界】立即阅读,回复【福利】还有很多前端视频等着你。本文已收录到GitHubhttps://github.com/qq449245884/xiaozhi,欢迎Star。
