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 相关文章推荐
js监听键盘事件示例代码
Jul 26 Javascript
浅谈javascript 函数内部属性
Jan 21 Javascript
jquery使用hide方法隐藏指定id的元素
Mar 30 Javascript
jQuery常见的选择器及用法介绍
Dec 20 Javascript
原生Aajax 和jQuery Ajax 写法个人总结
Mar 24 jQuery
Angular+Bootstrap+Spring Boot实现分页功能实例代码
Jul 21 Javascript
JS沙箱模式实例分析
Sep 04 Javascript
微信小程序按钮去除边框线分享页面功能
Aug 27 Javascript
vue2.0 实现富文本编辑器功能
May 26 Javascript
在VUE style中使用data中的变量的方法
Jun 19 Javascript
ant design的table组件实现全选功能以及自定义分页
Nov 17 Javascript
可拖拽组件slider.js使用方法详解
Dec 04 Javascript
利用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基础知识:类与对象(2) 自动加载对象
2006/12/13 PHP
浅谈Laravel中的三种中间件的作用
2019/10/13 PHP
怎么选择Javascript框架(Javascript Framework)
2013/11/22 Javascript
JS实现控制表格单元格垂直对齐的方法
2015/03/30 Javascript
JS使用正则截取两个字符串之间的字符串实现方法详解
2017/01/06 Javascript
js实现移动端编辑添加地址【模仿京东】
2017/04/28 Javascript
bootstrap switch开关组件使用方法详解
2017/08/22 Javascript
详解利用 Vue.js 实现前后端分离的RBAC角色权限管理
2017/09/15 Javascript
bootstrap-Treeview实现级联勾选
2017/11/23 Javascript
react中使用swiper的具体方法
2018/05/15 Javascript
详解Angular-ui-BootStrap组件的解释以及使用
2018/07/13 Javascript
微信小程序dom操作的替代思路实例分析
2018/12/06 Javascript
详解解决小程序中webview页面多层history返回问题
2019/08/20 Javascript
解决vue更新路由router-view复用组件内容不刷新的问题
2019/11/04 Javascript
详细介绍解决vue和jsp结合的方法
2020/02/06 Javascript
vue+ts下对axios的封装实现
2020/02/18 Javascript
js构造函数constructor和原型prototype原理与用法实例分析
2020/03/02 Javascript
JavaScript indexOf()原理及使用方法详解
2020/07/09 Javascript
原生JavaScript实现换肤
2021/02/19 Javascript
python中的sort方法使用详解
2014/07/25 Python
django开发教程之利用缓存文件进行页面缓存的方法
2017/11/10 Python
用Python删除本地目录下某一时间点之前创建的所有文件的实例
2017/12/14 Python
对Python 2.7 pandas 中的read_excel详解
2018/05/04 Python
【python】matplotlib动态显示详解
2019/04/11 Python
详解numpy.meshgrid()方法使用
2019/08/01 Python
详解Python并发编程之从性能角度来初探并发编程
2019/08/23 Python
Python模块future用法原理详解
2020/01/20 Python
安装python3.7编译器后如何正确安装opnecv的方法详解
2020/06/16 Python
利用python清除移动硬盘中的临时文件
2020/10/28 Python
委托与事件是什么关系?为什么要使用委托
2014/04/18 面试题
办理暂住证介绍信
2014/01/11 职场文书
2014年道德讲堂实施方案
2014/03/05 职场文书
我的中国梦演讲稿400字
2014/08/19 职场文书
写作指导:怎么书写竞聘演讲稿?
2019/07/04 职场文书
golang正则之命名分组方式
2021/04/25 Golang
react中useState使用:如何实现在当前表格直接更改数据
2022/08/05 Javascript