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 相关文章推荐
ImageFlow可鼠标控制图片滚动
Jan 30 Javascript
JQuery jsonp 使用示例代码
Aug 12 Javascript
jQuery自定义插件详解及实例代码
Dec 29 Javascript
Java与JavaScript中判断两字符串是否相等的区别
Mar 13 Javascript
Javascript中八种遍历方法的执行速度深度对比
Apr 25 Javascript
浅谈express 中间件机制及实现原理
Aug 31 Javascript
jQuery选择器之属性过滤选择器详解
Sep 28 jQuery
js中url对象化管理分析
Dec 29 Javascript
详解React开发必不可少的eslint配置
Feb 05 Javascript
详解搭建es6+devServer简单开发环境
Sep 25 Javascript
vue实现axios图片上传功能
Aug 20 Javascript
在Vue.js中使用TypeScript的方法
Mar 19 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 时间日期操作实战
2011/08/26 PHP
如何使用PHP实现javascript的escape和unescape函数
2013/06/29 PHP
PHP根据传入参数合并多个JS和CSS文件的简单实现
2014/06/13 PHP
smarty实现多级分类的方法
2014/12/05 PHP
php验证身份证号码正确性的函数
2016/07/20 PHP
php用户密码加密算法分析【Discuz加密算法】
2016/10/12 PHP
laravel中短信发送验证码的实现方法
2018/04/25 PHP
Laravel timestamps 设置为unix时间戳的方法
2019/10/11 PHP
解决Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]
2020/04/06 PHP
Jquery实现仿腾讯娱乐频道焦点图(幻灯片)特效
2015/03/06 Javascript
基于jquery实现select选择框内容左右移动添加删除代码分享
2015/08/25 Javascript
jquery+css3实现会动的小圆圈效果
2016/01/27 Javascript
JS 调用微信扫一扫功能
2016/12/22 Javascript
jquery实现百叶窗效果
2017/01/12 Javascript
移动端刮刮乐的实现方式(js+HTML5)
2017/03/23 Javascript
浅谈js基础数据类型和引用类型,深浅拷贝问题,以及内存分配问题
2017/09/02 Javascript
vue实现简单瀑布流布局
2020/05/28 Javascript
vuex刷新后数据丢失的解决方法
2020/10/18 Javascript
[01:10:24]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第一场 2月28日
2021/03/11 DOTA
从零学Python之hello world
2014/05/21 Python
DataFrame中去除指定列为空的行方法
2018/04/08 Python
详解Python Matplot中文显示完美解决方案
2019/03/07 Python
Pandas之Fillna填充缺失数据的方法
2019/06/25 Python
python matplotlib库绘制散点图例题解析
2019/08/10 Python
django连接mysql数据库及建表操作实例详解
2019/12/10 Python
Python爬虫回测股票的实例讲解
2021/01/22 Python
中国茶叶、茶具一站式网上购物商城:醉品茶城
2018/07/03 全球购物
阿玛尼美妆英国官网:Giorgio Armani Beauty英国
2019/03/28 全球购物
Monica Vinader官网:英国轻奢珠宝品牌
2020/02/05 全球购物
汽车技术服务与营销专业推荐信
2013/11/29 职场文书
党员批评与自我批评发言稿
2014/10/14 职场文书
社区党员群众路线教育实践活动心得体会
2014/11/03 职场文书
教师年度考核个人总结
2015/02/12 职场文书
2015年十一国庆节演讲稿
2015/03/20 职场文书
使用qt quick-ListView仿微信好友列表和聊天列表的示例代码
2021/06/13 Python
Java数据结构之链表相关知识总结
2021/06/18 Java/Android