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类
Sep 08 Javascript
Javascript SHA-1:Secure Hash Algorithm
Dec 20 Javascript
JavaScript中的对象化编程
Jan 16 Javascript
javascript 学习之旅 (3)
Feb 05 Javascript
JS判断文本框内容改变事件的简单实例
Mar 07 Javascript
js获取窗口相对于屏幕左边和上边的位置坐标
May 15 Javascript
JS实现图片高亮展示效果实例
Nov 24 Javascript
关于Jquery中的bind(),on()绑定事件方式总结
Oct 26 Javascript
微信小程序 按钮滑动的实现方法
Sep 27 Javascript
angular中ui calendar的一些使用心得(推荐)
Nov 03 Javascript
JS实现简易换图时钟功能分析
Jan 04 Javascript
vue项目打包后路由错误的解决方法
Apr 13 Vue.js
利用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
PHPThumb图片处理实例
2014/05/03 PHP
thinkPHP框架乐观锁和悲观锁实例分析
2019/10/30 PHP
PhpStorm连接服务器并实现自动上传功能
2020/12/09 PHP
使用 JScript 创建 .exe 或 .dll 文件的方法
2011/07/13 Javascript
js子页面获取父页面数据示例
2014/05/15 Javascript
JavaScript中SetInterval与setTimeout的用法详解
2015/11/10 Javascript
js使用cookie记录用户名的方法
2015/11/26 Javascript
jQuery实现的省市县三级联动菜单效果完整实例
2016/08/01 Javascript
js判断是否为空和typeof的用法(详解)
2016/10/07 Javascript
利用jQuery对无序列表排序的简单方法
2016/10/16 Javascript
js常用的继承--组合式继承
2017/03/06 Javascript
利用Node.js检测端口是否被占用的方法
2017/12/07 Javascript
VS Code转换大小写、修改选中文字或代码颜色的方法
2017/12/15 Javascript
vue-cli3.0如何使用CDN区分开发、生产、预发布环境
2018/11/22 Javascript
详解webpack 最简打包结果分析
2019/02/20 Javascript
15 分钟掌握vue-next响应式原理
2019/10/13 Javascript
基于JS实现快速读取TXT文件
2020/08/25 Javascript
python实现的希尔排序算法实例
2015/07/01 Python
Python监控主机是否存活并以邮件报警
2015/09/22 Python
基于Python3 逗号代码 和 字符图网格(详谈)
2017/06/22 Python
使用Python实现博客上进行自动翻页
2017/08/23 Python
Python求解任意闭区间的所有素数
2018/06/10 Python
浅谈Tensorflow 动态双向RNN的输出问题
2020/01/20 Python
Pycharm配置PyQt5环境的教程
2020/04/02 Python
Python如何批量生成和调用变量
2020/11/21 Python
HTML5开发动态音频图的实现
2020/07/02 HTML / CSS
英国航空官网:British Airways
2016/09/11 全球购物
JRE、JDK、JVM之间的关系怎样
2012/05/16 面试题
机械设计专业应届生求职信
2013/11/21 职场文书
精彩的推荐信范文
2013/11/26 职场文书
英语专业个人求职信范文
2014/02/01 职场文书
旅行社各个岗位职责
2014/03/15 职场文书
先进党员事迹材料
2014/12/24 职场文书
升职自荐信范文
2015/03/27 职场文书
2015小学教师年度工作总结
2015/05/12 职场文书
css背景和边框标签实例详解
2021/05/21 HTML / CSS