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图片平滑连续滚动插件
Apr 27 Javascript
jQuery 动画弹出窗体支持多种展现方式
Apr 29 Javascript
初学js 新节点的创建 删除 的步骤
Jul 04 Javascript
使用JSLint提高JS代码质量方法分享
Dec 16 Javascript
使用Plupload实现直接上传附件至七牛云存储
Dec 26 Javascript
Jquery Mobile 自定义按钮图标
Nov 18 Javascript
全屏js头像上传插件源码高清版
Mar 29 Javascript
AngularJS基础 ng-list 指令详解及示例代码
Aug 02 Javascript
JavaScript学习笔记--常用的互动方法
Dec 07 Javascript
详解JavaScript中return的用法
May 08 Javascript
详解bootstrap用dropdown-menu实现上下文菜单
Sep 22 Javascript
如何用vue实现网页截图你知道吗
Nov 17 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
PHP.MVC的模板标签系统(一)
2006/09/05 PHP
php制作的简单验证码识别代码
2016/01/26 PHP
用js实现的自定义的对话框的实现代码
2010/03/21 Javascript
Jquery公告滚动+AJAX后台得到数据
2011/04/14 Javascript
jquery easyui combobox模糊过滤(示例代码)
2013/11/30 Javascript
从js向Action传中文参数出现乱码问题的解决方法
2013/12/29 Javascript
jquery实现点击label的同时触发文本框点击事件的方法
2015/06/05 Javascript
JavaScript 数组some()和filter()的用法及区别
2016/05/20 Javascript
限制复选框最多选择项的实现代码
2016/05/30 Javascript
老生常谈js-react组件生命周期
2017/05/02 Javascript
详解Vue.use自定义自己的全局组件
2017/06/14 Javascript
详谈innerHTML innerText的使用和区别
2017/08/18 Javascript
bootstrap table实现点击翻页功能 可记录上下页选中的行
2017/09/28 Javascript
尝试自己动手用react来写一个分页组件(小结)
2018/02/09 Javascript
JavaScript中将值转换为字符串的五种方法总结
2019/06/06 Javascript
vue通过数据过滤实现表格合并
2020/11/30 Javascript
微信小程序中button去除默认的边框实例代码
2019/08/01 Javascript
swiper4实现移动端导航切换
2020/10/16 Javascript
SpringBoot+Vue 前后端合并部署的配置方法
2020/12/30 Vue.js
[33:09]完美世界DOTA2联赛循环赛 Forest vs DM BO2第二场 10.29
2020/10/29 DOTA
使用Python脚本生成随机IP的简单方法
2015/07/30 Python
python实现视频分帧效果
2019/05/31 Python
Django Rest framework认证组件详细用法
2019/07/25 Python
Python使用get_text()方法从大段html中提取文本的实例
2019/08/27 Python
Python定时发送天气预报邮件代码实例
2019/09/09 Python
详解tensorflow2.x版本无法调用gpu的一种解决方法
2020/05/25 Python
next在python中返回迭代器的实例方法
2020/12/15 Python
蹦床仓库:Trampoline Warehouse
2018/12/06 全球购物
MAC Cosmetics官方网站:魅可专业艺术彩妆
2019/04/10 全球购物
Shopbop中文官网:美国亚马逊旗下时尚购物网站
2020/12/15 全球购物
计算机专业个人求职自荐信
2013/09/21 职场文书
学生安全教育材料
2014/02/14 职场文书
网络管理员岗位职责
2014/03/17 职场文书
实习评语大全
2014/04/26 职场文书
苹果M1芯片安装nginx 并且部署vue项目步骤详解
2021/11/20 Servers
python缺失值填充方法示例代码
2022/12/24 Python