什么才是正确的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>
什么才是正确的javascript数组检测方式的更多相关文章
- js array数组检测方式
typeof var arr = [1,2,3]; console.log(typeof arr);//'object' 数组的本质是一种特殊的对象,所以返回'object'.typeof运算符只能用 ...
- JavaScript数据类型检测 数组(Array)检测方式
前言 对于确定某个对象是不是数组,一直是数组的一个经典问题.本文专门将该问题择出来,介绍什么才是正确的javascript数组检测方式 typeof 首先,使用最常用的类型检测工具--typeof运算 ...
- JavaScript中检测数组的几种方式
检测一个对象是否为数组的方式有: Array.isArray() // true或false(es5) toString.call([]); // [object Arr ...
- Javascript数组操作
使用JS也算有段时日,然对于数组的使用,总局限于很初级水平,且每每使用总要查下API,或者写个小Demo测试下才算放心,一来二去,浪费不少时间:思虑下,堪能如此继续之?当狠心深学下方是正道. 原文链接 ...
- 谈谈JavaScript类型检测
javascript内置的类型检测机制并非完全可靠.比如typeof操作符,并不能准确的判断数据是哪个类型,比如:数组和对象就不能通过typeof来区分. typeof [] ==="o ...
- JavaScript功能检测技术和函数构造
Javascript与很多编程语言不同,它不能够控制其运行环境.再写php代码时,只要在服务器端部署了正确的版本,那么程序就绝对能够运行,对于其他python或ruby后端语言来说,也不存在什么灰色区 ...
- 第七章:Javascript数组
数组是值的有序结合.每个值叫做一个元素,而每个元素在数组中都有一个位置,用数字表示,称为索引. javascript数组是无类型的:数组的元素可以是任意类型,并且同一个数组中的不同元素也可能有不同的类 ...
- JavaScript 数组基本操作
简介 数组操作无论是在JavaScript中还是在其他语言中都是很常见.经常会用到的,现在我把JavaScript 数组基本操作整理一下,供大家参考学习.里边包含我自己的见解以及案例,希望能够帮助大家 ...
- JavaScript数组的22种方法
原文:http://www.cnblogs.com/xiaohuochai/p/5682621.html javascript中数组的22种方法 前面的话 数组总共有22种方法,本文将其分为对象继 ...
随机推荐
- linux下subversion server安装手册
linux下subversion server安装手册 安装基于的Linux版本为:Red Hat Enterprise Linux Server release 6.3. 一 准备需要的安装包. ( ...
- nil、Nil、NULL和NSNull的理解
http://blog.sina.com.cn/s/blog_4930f8e60101h71b.html 其实早就想研究一下nil.Nil.NULL和NSNull之间的区别,只是工作上除了nil,其它 ...
- iOS开发零基础--Swift教程 可选类型
可选类型的介绍 注意: 可选类型时swift中较难理解的一个知识点 暂时先了解,多利用Xcode的提示来使用 随着学习的深入,慢慢理解其中的原理和好处 概念: 在OC开发中,如果一个变量暂停不使用,可 ...
- 使用Fragment的两种方式:<fragment>与<FrameLayout>
Android中使用Fragment的两种方式:<fragment>与<FrameLayout> 1.静态使用:自定义类,继承Fragment,在xml中使用<fragm ...
- C2第十次解题报告
看过题解后如果觉得还算有用,请帮忙加点我所在团队博客访问量 http://www.cnblogs.com/newbe/ http://www.cnblogs.com/ne走迷宫wbe/p/406983 ...
- C2第九次解题报告
看过题解后如果觉得还算有用,请帮忙加点我所在团队博客访问量 http://www.cnblogs.com/newbe/ http://www.cnblogs.com/newbe/p/4069834.h ...
- 《理解 ES6》阅读整理:函数(Functions)(五)Name Property
名字属性(The name Property) 在JavaScript中识别函数是有挑战性的,因为你可以使用各种方式来定义一个函数.匿名函数表达式的流行使用导致函数调试困难,在栈信息中难以找出函数名. ...
- cobbler配置
:ks脚本关闭pxe,这样就不会重复安装 sed -i 's/pxe_just_once: 0/pxe_just_once: 1/g' /etc/cobbler/settings 6:TFTP服务器 ...
- Spring声明式事务管理基于@Transactional注解
概述:我们已知道Spring声明式事务管理有两种常用的方式,一种是基于tx/aop命名空间的xml配置文件,另一种则是基于@Transactional 注解. 第一种方式我已在上文为大 ...
- lxc on centos
终于把lxc的网络配通了,也不知道对不对,记一下 一开始都是雷同的地方 yum install libcgroup lxc lxc-templates 安装lxc cgroup 然后记得 chkcon ...