js判断一个对象是数组(函数)的方法实例


Posted in Javascript onDecember 19, 2019

1.typeof操作符

js判断一个对象是数组(函数)的方法实例

示例:

// 数值
typeof 37 === 'number';
 
// 字符串
typeof '' === 'string';
 
// 布尔值
typeof true === 'boolean';
 
// Symbols
typeof Symbol() === 'symbol';
 
// Undefined
typeof undefined === 'undefined';
 
// 对象
typeof {a: 1} === 'object';
typeof [1, 2, 4] === 'object';
 
// 下面的例子令人迷惑,非常危险,没有用处。避免使用它们。
typeof new Boolean(true) === 'object';
typeof new Number(1) === 'object';
typeof new String('abc') === 'object';
 
// 函数
typeof function() {} === 'function';

从上面的实例我们可以看出,利用typeof除了array和null判断为object外,其他的都可以正常判断。

2.instanceof操作符 和 对象的constructor 属性

这个操作符和JavaScript中面向对象有点关系,了解这个就先得了解JavaScript中的面向对象。因为这个操作符是检测对象的原型链是否指向构造函数的prototype对象的。

var arr = [1,2,3,1];
console.log(arr instanceof Array); // true
 
var fun = function(){};
console.log(fun instanceof Function); // true
var arr = [1,2,3,1];
console.log(arr.constructor === Array); // true
 
var fun = function(){};
console.log(arr.constructor === Function); // true

第2种和第3种方法貌似无懈可击,但是实际上还是有些漏洞的,当你在多个frame中来回穿梭的时候,这两种方法就亚历山大了。由于每个iframe都有一套自己的执行环境,跨frame实例化的对象彼此是不共享原型链的,因此导致上述检测代码失效

var iframe = document.createElement('iframe'); //创建iframe
document.body.appendChild(iframe); //添加到body中
xArray = window.frames[window.frames.length-1].Array;
var arr = new xArray(1,2,3); // 声明数组[1,2,3]
alert(arr instanceof Array); // false
alert(arr.constructor === Array); // false

4.使用 Object.prototype.toString 来判断是否是数组

Object.prototype.toString.call( [] ) === '[object Array]' // true
 
Object.prototype.toString.call( function(){} ) === '[object Function]' // true

这里使用call来使 toString 中 this 指向 obj。进而完成判断

5.使用 原型链 来完成判断

[].__proto__ === Array.prototype // true
 
var fun = function(){}
fun.__proto__ === Function.prototype // true

6.Array.isArray()

Array.isArray([])  // true

ECMAScript5将Array.isArray()正式引入JavaScript,目的就是准确地检测一个值是否为数组。IE9+、 Firefox 4+、Safari 5+、Opera 10.5+和Chrome都实现了这个方法。但是在IE8之前的版本是不支持的。

总结:

综上所述,我们可以综合上面的几种方法,有一个当前的判断数组的最佳写法:

var arr = [1,2,3];
var arr2 = [{ name : 'jack', age : 22 }];
function isArrayFn(value){
  // 首先判断浏览器是否支持Array.isArray这个方法
  if (typeof Array.isArray === "function") {
    return Array.isArray(value);
  }else{
    return Object.prototype.toString.call(value) === "[object Array]";
    // return obj.__proto__ === Array.prototype;
  }
}
console.log(isArrayFn(arr)); // true
console.log(isArrayFn(arr2)); // true

上述代码中,为何我们不直接使用原型链的方式判断(兼容性好),而是先判断浏览器支不支持Array.isArray()这个方法,如果不支持才使用原型链的方式呢?我们可以从代码执行效率上看:
js如何判断一个对象是数组

js判断一个对象是数组(函数)的方法实例 从

这张图片我们可以看到,Array.isArray()这个方法的执行速度比原型链的方式快了近一倍。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
jquery.ui.draggable中文文档(原文翻译)
Nov 15 Javascript
jQuery判断数组是否包含了指定的元素
Mar 10 Javascript
原生js和jQuery实现淡入淡出轮播效果
Dec 25 Javascript
基于jQuery实现点击最后一行实现行自增效果的表格
Jan 12 Javascript
Google 地图API Map()构造器详解
Aug 06 Javascript
JS实现动态增加和删除li标签行的实例代码
Oct 16 Javascript
Angularjs之filter过滤器(推荐)
Nov 27 Javascript
Bootstrap基本组件学习笔记之导航(10)
Dec 07 Javascript
ThinkPHP+jquery实现“加载更多”功能代码
Mar 11 Javascript
详解使用React进行组件库开发
Feb 06 Javascript
了解ESlint和其相关操作小结
May 21 Javascript
jQuery操作事件完整实例分析
Jan 10 jQuery
利用JS如何获取form表单数据
Dec 19 #Javascript
在Vue项目中使用Typescript的实现
Dec 19 #Javascript
JS数据类型STRING使用实例解析
Dec 18 #Javascript
JS精确判断数据类型代码实例
Dec 18 #Javascript
使用webpack/gulp构建TypeScript项目的方法示例
Dec 18 #Javascript
小程序简单两栏瀑布流效果的实现
Dec 18 #Javascript
js数据类型转换与流程控制操作实例分析
Dec 18 #Javascript
You might like
一个比较简单的PHP 分页分组类
2009/12/10 PHP
PHP 常用数组内部函数(Array Functions)介绍
2013/06/05 PHP
joomla数据库操作示例代码
2016/01/06 PHP
php使用函数pathinfo()、parse_url()和basename()解析URL
2016/11/25 PHP
laravel 去掉index.php伪静态的操作方法
2019/10/12 PHP
JavaScript 动态添加表格行 使用模板、标记
2009/10/24 Javascript
js trim函数 去空格函数与正则集锦
2009/11/20 Javascript
js 采用delete实现继承示例代码
2014/05/20 Javascript
JavaScript控制listbox列表框的项目上下移动的方法
2015/03/18 Javascript
浅谈Web页面向后台提交数据的方式和选择
2016/09/23 Javascript
JS设计模式之单例模式(一)
2017/09/29 Javascript
vue.js层叠轮播效果的实例代码
2018/11/08 Javascript
如何让node运行es6模块文件及其原理详解
2018/12/11 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变opacity实现)
2019/01/24 Javascript
python重试装饰器示例
2014/02/11 Python
python中reduce()函数的使用方法示例
2017/09/29 Python
tensorflow实现KNN识别MNIST
2018/03/12 Python
Flask框架学习笔记之表单基础介绍与表单提交方式
2019/08/12 Python
Python AutoCAD 系统设置的实现方法
2020/04/01 Python
TensorFlow2.X使用图片制作简单的数据集训练模型
2020/04/08 Python
Python如何获取文件指定行的内容
2020/05/27 Python
Python实现寻找回文数字过程解析
2020/06/09 Python
浅谈HTML5新增及移除的元素
2016/06/27 HTML / CSS
墨尔本照明批发商店:Mica Lighting
2017/12/28 全球购物
阿联酋彩妆品牌:OUD MILANO
2019/10/06 全球购物
用你熟悉的语言写一个连接ORACLE数据库的程序,能够完成修改和查询工作
2012/06/11 面试题
用Java语言将一个键盘输入的数字转化成中文输出
2013/01/25 面试题
优秀团队获奖感言
2014/02/19 职场文书
关于诚信的活动方案
2014/08/18 职场文书
初中中等生评语
2014/12/29 职场文书
2015年扫黄打非工作总结
2015/05/13 职场文书
力克胡哲观后感
2015/06/10 职场文书
python 如何在list中找Topk的数值和索引
2021/05/20 Python
Django模型层实现多表关系创建和多表操作
2021/07/21 Python
不负正版帝国之名 《重返帝国》引领SLG手游制作新的标杆
2022/04/07 其他游戏
MySQL一劳永逸永久支持输入中文的方法实例
2022/08/05 MySQL