什么才是正确的javascript数组检测方式

前面的话

  对于确定某个对象是不是数组,一直是数组的一个经典问题。本文专门将该问题择出来,介绍什么才是正确的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>

时间: 2024-10-10 22:34:22

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

JavaScript中检测数组的几种方式

检测一个对象是否为数组的方式有: Array.isArray()         // true或false(es5) toString.call([]);      // [object Array] arr.constructor;      // Array() instanceof Array   // true或false 兼容性写法: if(typeof Array.isArray==="undefined"){ Array.isArray = function(arg){

Javascript数组小结

Javascript数组小结 Javascript将指定的数字索引值转换成字符串--索引值1变成"1"--然后将其作为属性名来使用. 数组的length修改后,数组中大于设定值的元素将被删除 数组的添加删除: 1)  修改length属性值(删除) 2)  push.pop在数组的尾部进行插入.删除操作并返回操作元素:unshift和shift()在数组的首部进行插入.删除操作 3)  delete可以删除数组元素,但它不会改变数组的length属性,只是将该值置空. 4)  spli

第七章:Javascript数组

数组是值的有序结合.每个值叫做一个元素,而每个元素在数组中都有一个位置,用数字表示,称为索引. javascript数组是无类型的:数组的元素可以是任意类型,并且同一个数组中的不同元素也可能有不同的类型.数组的元素可能是对象或其他数组,这允许创建更加复杂的数据结构,如对象的数组和数组的数组. javascript数组的索引是基本零的32位数值:第一个元素的索引为0,最大的索引为4 294 967 294(2的32次方-2),数组最大能容纳4 294 967 295个元素. javascript数

JavaScript数据检测

前言:随着编程实践的增加,慢慢发现关于数据类型的检测至关重要.我认为程序就是为了处理数据和展示数据.所以,数据的检测对于编程来说也至关重要.因为只有符合我们预期的输入,才可能产生正确的输出.众所周知,JavaScript是弱类型语言,这带来很多便利的同时,也带来了不少问题.为了减少编程实践中在变量判断方面出现的问题,我们需要对不确定的变量进行检测,以保证处理符合预期的数据.本文是对数据检测的总结. 1.检测原始值 ECMAScript 有 5 种原始类型(primitive type),即 Un

JavaScript 数组基本操作

简介 数组操作无论是在JavaScript中还是在其他语言中都是很常见.经常会用到的,现在我把JavaScript 数组基本操作整理一下,供大家参考学习.里边包含我自己的见解以及案例,希望能够帮助大家,使用的是ECMAScript 5. 字符串与数组转换 有时候我们需要把字符串进行转换为数组,则需要split方法,把数组转换为字符串则需要join方法 var star="js,php,java,c++"; star=star.split(","); console.

javascript 数组的常用操作函数

join() Array.join(/* optional */ separator) 将数组转换为字符串,可带一个参数 separator (分隔符,默认为","). 与之相反的一个方法是:String.splict() ,将字符串分隔成若干块来创建一个新的数组. reverse() Array.reverse(),颠倒数组元素的顺序,返回逆向的数组.注意此方法会修改原来数组元素的位置,而不是返回一个新的数组. sort() sort() 方法将数组中的元素排序并返回排序后的数组.s

JavaScript 数组遍历方法的对比

前言 JavaScript 发展至今已经发展出多种数组的循环遍历的方法,不同的遍历方法运行起来那个比较快,不同循环方法使用在那些场景,下面将进行比较: 各种数组遍历的方法 for 语句 代码: var arr = [1,2,4,6] for(var i = 0, len = arr.length; i < len; i++){ console.log(arr[i]) } 复制代码 这是标准for循环的写法也是最传统的语句,字符串也支持,定义一个变量i作为索引,以跟踪访问的位置,len是数组的长度

JavaScript数组遍历map()的原型扩展

在 JavaScript 1.6 里,javascript 数组增加了几个非常有用的方法:indexOf.lastIndexOf.every. filter. forEach. map. some,其中前两个可以归为元素定位方法,而后面的几个则可以归为迭代(iterative)方法. 遗憾的是:这些新方法并非所有浏览器都支持,在这种情况下,我们就需要自己动手了,在这些介绍的文章中,我们同时提供了在不支持这些新特性的浏览器中的实现方法. 原生方法如下: 1 var mappedArray = ar

javascript数组原型方法

1.javascript数组原型方法. 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>jstest</title> 6 </head> 7 <body> 8 <script> 9 var arr = ["1","2&q