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 相关文章推荐
javascript学习网址备忘
May 29 Javascript
Jquery插件之多图片异步上传
Oct 20 Javascript
JavaScript中的运算符种类及其规则介绍
Sep 26 Javascript
js整数字符串转换为金额类型数据(示例代码)
Dec 26 Javascript
jquery制作居中遮罩层效果分享
Feb 21 Javascript
js键盘事件的keyCode
Jul 29 Javascript
JavaScript实现的多种鼠标拖放效果
Nov 03 Javascript
详解如何在Vue2中实现组件props双向绑定
Mar 29 Javascript
ionic2打包android时gradle无法下载的解决方法
Apr 05 Javascript
JS实现css hover操作的方法示例
Apr 07 Javascript
js实现json数组分组合并操作示例
Feb 12 Javascript
微信小程序 生成携带参数的二维码
Oct 23 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+mysql实现无限级分类 | 树型显示分类关系
2006/11/19 PHP
php set_time_limit()函数的使用详解
2013/06/05 PHP
PHP Header失效的原因分析及解决方法
2016/11/16 PHP
php过滤htmlspecialchars() 函数实现把预定义的字符转换为 HTML 实体用法分析
2019/06/25 PHP
prototype与jquery下Ajax实现的差别
2009/09/13 Javascript
javascript之学会吝啬 精简代码
2010/04/25 Javascript
extjs grid设置某列背景颜色和字体颜色的实现方法
2010/09/06 Javascript
关于锚点跳转及jQuery下相关操作与插件
2012/10/01 Javascript
屏蔽网页右键复制和ctrl+c复制的js代码
2013/01/04 Javascript
javascript中数组的冒泡排序使用示例
2013/12/18 Javascript
把jQuery的类、插件封装成seajs的模块的方法
2014/03/12 Javascript
Node.js中调用mysql存储过程示例
2014/12/20 Javascript
javascript动画算法实例分析
2015/07/31 Javascript
javascript图片延迟加载实现方法及思路
2015/12/31 Javascript
jQuery Validate验证框架详解(推荐)
2016/12/17 Javascript
微信小程序 天气预报开发实例代码源码
2017/01/20 Javascript
vue实现添加标签demo示例代码
2017/01/21 Javascript
vue+iview+less+echarts实战项目总结
2018/02/22 Javascript
vue webpack重写cookie路径的方法
2019/07/10 Javascript
[01:10]3.19DOTA2发布会 三代刀塔人第一代
2014/03/25 DOTA
详解Python中用于计算指数的exp()方法
2015/05/14 Python
Windows系统下使用flup搭建Nginx和Python环境的方法
2015/12/25 Python
python3操作微信itchat实现发送图片
2018/02/24 Python
python 修改本地网络配置的方法
2019/08/14 Python
细数nn.BCELoss与nn.CrossEntropyLoss的区别
2020/02/29 Python
对pytorch中x = x.view(x.size(0), -1) 的理解说明
2021/03/03 Python
Linux管理员面试题 Linux admin interview questions
2014/11/01 面试题
入学生会自荐书范文
2014/02/05 职场文书
小学庆六一活动方案
2014/02/28 职场文书
第一批党的群众路线教育实践活动工作总结
2014/03/03 职场文书
趣味运动会策划方案
2014/06/02 职场文书
企业总经理任命书
2014/06/05 职场文书
软环境建设心得体会
2014/09/09 职场文书
小学运动会开幕词
2016/03/04 职场文书
2019年警察入党转正申请书最新范文
2019/09/03 职场文书
欧元符号 €
2022/02/17 杂记