前面的话

  对于确定某个对象是不是数组,一直是数组的一个经典问题。本文专门将该问题择出来,介绍什么才是正确的javascript数组检测方式

typeof

  首先,使用最常用的类型检测工具——typeof运算符

var arr = [1,2,3];
console.log(typeof arr);//'object'

  前面已经介绍过,数组的本质是一种特殊的对象,所以返回'object'。typeof运算符只能用来区分原始类型和对象类型,对于更具体的对象类型是无法鉴别出来的

instanceof

  这时,该instanceof运算符出场了,instanceof运算符用来判断一个对象是否是特定构造函数的实例

var arr = [1,2,3];
console.log(arr instanceof Array);//true var str = '123';
console.log(str instanceof Array);//false

  看上去很实用。但,这时就引出了数组检测的经典场景——网页中包含多个框架

  【1】先创建一个父网页box.html和子网页in.html,其中父网页通过iframe包含子网页

//子网页为空
//父网页
<iframe name="child" src="in.html"></iframe>

  【2】测试父网页和子网页的通信,注意一定要在服务器环境下测试

//子网页
var arr = [1,2,3]; //父网页
window.onload = function(){
console.log(child.window.arr);// [1,2,3]
}

  【3】测试成功,这时进行数组检测

//子网页
var arr = [1,2,3]; //父网页
function test(arr){
return arr instanceof Array;
}
window.onload = function(){
console.log(child.window.arr);// [1,2,3]
console.log(test(child.window.arr));//false
}

  测试后发现,数组检测的结果是false。这是因为网页中包含多个框架,那实际上就存在多个不同的全局环境,从而存在不同版本的Array构造函数。如果从一个框架向另一个框架传入一个数组,那么传入的数组与在第二个框架中原生创建的数组分别具有各自不同的构造函数

toString

  typeof操作符在这里帮不上忙,而instanceof操作符只能用于简单的情形,这时就需要祭出大杀器——toString(),通过引用Object的toString()方法来检查对象的类属性,对数组而言该属性的值总是"Array"

var arr = [1,2,3];
console.log(Object.prototype.toString.call(arr) === '[object Array]');//true

  或者,可以自定义类型识别函数

function type(obj){
return Object.prototype.toString.call(obj).slice(8,-1).toLowerCase();
}
var arr = [1,2,3];
console.log(type(arr));//'array'

  在多框架环境中测试,同样返回'array'

//子网页
var arr = [1,2,3]; //父网页
function test(arr){
return arr instanceof Array;
}
function type(obj){
return Object.prototype.toString.call(obj).slice(8,-1).toLowerCase();
}
window.onload = function(){
console.log(child.window.arr);// [1,2,3]
console.log(test(child.window.arr));//false
console.log(type(child.window.arr));//'array'
}

isArray

  为了让数组检测更方便,ECMAScript5新增了Array.isArray()方法。该方法的目的是最终确定某个值到底是不是数组,而不管它在哪个全局环境中创建的

var arr = [1,2,3];
console.log(Array.isArray([]));//true
console.log(Array.isArray({}));//false
console.log(Array.isArray(arr));//true

  在多框架环境中测试,同样返回true

//子网页
var arr = [1,2,3]; //父网页
console.log(Array.isArray(child.window.arr));//true

完整测试代码

【子网页(in.html)】

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script>
var arr = [1,2,3];
</script>
</body>
</html>

【父网页(box.html)】

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<iframe name="child" src="in.html"></iframe>
<script>
function test(arr){
return arr instanceof Array;
}
function type(obj){
return Object.prototype.toString.call(obj).slice(8,-1).toLowerCase();
}
window.onload = function(){
console.log(child.window.arr);// [1,2,3]
console.log(test(child.window.arr));//false
console.log(type(child.window.arr));//'array'
console.log(Array.isArray(child.window.arr));//true
}
</script>
</body>
</html>

  

什么才是正确的javascript数组检测方式的更多相关文章

  1. js array数组检测方式

    typeof var arr = [1,2,3]; console.log(typeof arr);//'object' 数组的本质是一种特殊的对象,所以返回'object'.typeof运算符只能用 ...

  2. JavaScript数据类型检测 数组(Array)检测方式

    前言 对于确定某个对象是不是数组,一直是数组的一个经典问题.本文专门将该问题择出来,介绍什么才是正确的javascript数组检测方式 typeof 首先,使用最常用的类型检测工具--typeof运算 ...

  3. JavaScript中检测数组的几种方式

    检测一个对象是否为数组的方式有: Array.isArray()          // true或false(es5) toString.call([]);       // [object Arr ...

  4. Javascript数组操作

    使用JS也算有段时日,然对于数组的使用,总局限于很初级水平,且每每使用总要查下API,或者写个小Demo测试下才算放心,一来二去,浪费不少时间:思虑下,堪能如此继续之?当狠心深学下方是正道. 原文链接 ...

  5. 谈谈JavaScript类型检测

      javascript内置的类型检测机制并非完全可靠.比如typeof操作符,并不能准确的判断数据是哪个类型,比如:数组和对象就不能通过typeof来区分. typeof [] ==="o ...

  6. JavaScript功能检测技术和函数构造

    Javascript与很多编程语言不同,它不能够控制其运行环境.再写php代码时,只要在服务器端部署了正确的版本,那么程序就绝对能够运行,对于其他python或ruby后端语言来说,也不存在什么灰色区 ...

  7. 第七章:Javascript数组

    数组是值的有序结合.每个值叫做一个元素,而每个元素在数组中都有一个位置,用数字表示,称为索引. javascript数组是无类型的:数组的元素可以是任意类型,并且同一个数组中的不同元素也可能有不同的类 ...

  8. JavaScript 数组基本操作

    简介 数组操作无论是在JavaScript中还是在其他语言中都是很常见.经常会用到的,现在我把JavaScript 数组基本操作整理一下,供大家参考学习.里边包含我自己的见解以及案例,希望能够帮助大家 ...

  9. JavaScript数组的22种方法

    原文:http://www.cnblogs.com/xiaohuochai/p/5682621.html javascript中数组的22种方法   前面的话 数组总共有22种方法,本文将其分为对象继 ...

随机推荐

  1. 8.1 消息通信 EventBus

    EventBus是一个事件发布和订阅的框架.EventBus是一款针对Android优化的发布/订阅事件总线.主要功能是替代Intent,Handler,BroadCast 在Fragment,Act ...

  2. 基于AutoCAD的ObjectARX之NET扩展(mcnetarx)-AcdbEntNext、AcdbEntLast

    1.AcdbEntLast用于获取最后一个创建的实体. 2.AcdbEntNext用于获取指定实体名称之后的下一个创建的实体. ' 定义保存实体名称的变量 Dim ent() As Integer = ...

  3. Eclipse - Failed to load the JNI shared Library (JDK)

    When I try opening Eclipse, a pop-up dialog states: Failed to load the JNI shared library "C:/J ...

  4. LDA和PLSA

    看了<LDA数学八卦>和July的博客,里面涉及到好多公式推导...感觉好复杂,于是记录一些重点简洁的东西,忽略大批量铺垫,直接回答LDA和PLSA是区别: 在pLSA模型中,我们按照如下 ...

  5. 初入liunx的一些基本的知识

    本系列的博客来自于:http://www.92csz.com/study/linux/ 在此,感谢原作者提供的入门知识 这个系列的博客的目的在于将比较常用的liunx命令从作者的文章中摘录下来,供自己 ...

  6. 在CentOS上搭建最^1024基本的Nginx反向服务器

    昨天有过去的同事突然问我,他在CentOS7上试验搭建反向服务器死活不成功.现将最简单的搭建步骤分享下: 0. 环境介绍 本次搭建的集群包括以下服务器 192.168.1.107:nginx反向服务器 ...

  7. 蛙蛙推荐:快速自定义Boostrap样式

    现在越来越多的网站使用Bootstrap,相信大家也审美疲劳了,所以我们要用Bootstrap的第一步就是先把顶部的导航栏来自定义一下. 我现在使用的是bootstrap3.0,顶部导航定义如下 &l ...

  8. ffmpeg进行视频转换

    参考 Mencoder使用方法 Windows下MEncoder下载和Linux下MEncoder的编译 如何降低FFMpeg.exe使用过程中的Cpu使用率 实际上是通过参数控制服务器上用于ffmp ...

  9. Sensor(GYROSCOPE)

    package com.example.sensor01; import java.util.List; import android.hardware.Sensor; import android. ...

  10. 去它的h5,我还是用js写原生跨平台app吧

    智能手机功能越来越强大,已经在逐渐替代电脑的作用.百度.腾讯.阿里的移动端日活数也在逐步的赶上甚至超越电脑端用户.叫喊着“mobile first”的公司越来越多,App开发者应运而生,且队伍日趋庞大 ...