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 相关文章推荐
列表内容的选择
Jun 30 Javascript
JQury slideToggle闪烁问题及解决办法
Jul 05 Javascript
《JavaScript高级程序设计》阅读笔记(一) ECMAScript基础
Feb 27 Javascript
浅析Bootstrap验证控件的使用
Jun 23 Javascript
基于angularjs实现图片放大镜效果
Aug 31 Javascript
jquery版轮播图效果和extend扩展
Jul 18 jQuery
vue移动端轻量级的轮播组件实现代码
Jul 12 Javascript
layui表单提交到后台自动封装到实体类的方法
Sep 12 Javascript
Element Dropdown下拉菜单的使用方法
Jul 26 Javascript
手把手带你搭建一个node cli的方法示例
Aug 07 Javascript
JavaScript实现4位随机验证码的生成
Jan 28 Javascript
react使用antd的上传组件实现文件表单一起提交功能(完整代码)
Jun 29 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
探讨fckeditor在Php中的配置详解
2013/06/08 PHP
关于JSON以及JSON在PHP中的应用技巧
2013/11/27 PHP
ThinkPHP上使用多说评论插件的方法
2014/10/31 PHP
php使用ftp实现文件上传与下载功能
2017/07/21 PHP
javascript实现div的显示和隐藏的小例子
2013/06/25 Javascript
js+html5实现canvas绘制简单矩形的方法
2015/06/05 Javascript
简介AngularJS中使用factory和service的方法
2015/06/17 Javascript
jQuery滚动加载图片实现原理
2015/12/14 Javascript
如何理解jQuery中的ajaxSubmit方法
2017/03/13 Javascript
Angular4学习笔记之实现绑定和分包
2017/08/01 Javascript
浅谈react+es6+webpack的基础配置
2017/08/09 Javascript
详解React Native网络请求fetch简单封装
2017/08/10 Javascript
jQuery实现火车票买票城市选择切换功能
2017/09/15 jQuery
vue 过滤器filter实例详解
2018/03/14 Javascript
JS实现获取当前所在周的周六、周日示例分析
2019/05/11 Javascript
简单了解TypeScript中如何继承 Error 类
2019/06/21 Javascript
js回调函数原理与用法案例分析
2020/03/04 Javascript
对vue生命周期的深入理解
2020/12/03 Vue.js
Django中利用filter与simple_tag为前端自定义函数的实现方法
2017/06/15 Python
python隐藏类中属性的3种实现方法
2019/12/19 Python
PyTorch笔记之scatter()函数的使用
2020/02/12 Python
Python中操作各种多媒体,视频、音频到图片的代码详解
2020/06/04 Python
Python实现在线批量美颜功能过程解析
2020/06/10 Python
通用的Django注册功能模块实现方法
2021/02/05 Python
英国行业制服供应商:Alexandra
2019/09/14 全球购物
物业管理员岗位职责范文
2013/11/25 职场文书
服装厂厂长岗位职责
2013/12/27 职场文书
安全标准化实施方案
2014/02/20 职场文书
社区食品安全实施方案
2014/03/28 职场文书
原料仓仓管员岗位职责
2014/07/08 职场文书
公司清洁工岗位职责
2015/04/15 职场文书
小学开学典礼新闻稿
2015/07/17 职场文书
青年志愿者活动感想
2015/08/07 职场文书
60句有关成长的名言
2019/09/04 职场文书
浅析CSS在DevTools 中架构演变
2021/10/05 HTML / CSS
Redis之RedisTemplate配置方式(序列和反序列化)
2022/03/13 Redis