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 28 Javascript
javascript 全角转换实现代码
Jul 17 Javascript
javascript中callee与caller的用法和应用场景
Dec 08 Javascript
Javascript中正则表达式的全局匹配模式分析
Apr 26 Javascript
客户端js判断文件类型和文件大小即限制上传大小
Nov 20 Javascript
javascript制作loading动画效果 loading效果
Jan 14 Javascript
jquery实现的美女拼图游戏实例
May 04 Javascript
JS组件系列之Bootstrap table表格组件神器【二、父子表和行列调序】
May 10 Javascript
js省市县三级联动效果实例
Apr 15 Javascript
jQuery Masonry瀑布流插件使用方法详解
Jan 18 Javascript
详谈jQuery中的一些正则匹配表达式
Mar 08 Javascript
bootstrap table实现iview固定列的效果实例代码详解
Sep 30 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+ajax实现无刷新数据分页的办法
2015/11/02 PHP
PHP删除数组中特定元素的两种方法
2019/02/28 PHP
mongodb和php的用法详解
2019/03/25 PHP
ImageFlow可鼠标控制图片滚动
2008/01/30 Javascript
js 跨域和ajax 跨域问题小结
2009/07/01 Javascript
SwfUpload在IE10上不出现上传按钮的解决方法
2013/06/25 Javascript
Javascript排序算法之计数排序的实例
2014/04/05 Javascript
Vue.js每天必学之构造器与生命周期
2016/09/05 Javascript
JS优化与惰性载入函数实例分析
2017/04/06 Javascript
js 获取元素的具体样式信息getcss(实例讲解)
2017/07/05 Javascript
JS获取日期的方法实例【昨天,今天,明天,前n天,后n天的日期】
2017/09/28 Javascript
Angular.JS读取数据库数据调用完整实例
2019/07/02 Javascript
js实现飞机大战小游戏
2020/08/26 Javascript
python利用beautifulSoup实现爬虫
2014/09/29 Python
Python lambda和Python def区别分析
2014/11/30 Python
详解python脚本自动生成需要文件实例代码
2017/02/04 Python
python利用不到一百行代码实现一个小siri
2017/03/02 Python
Python闭包的两个注意事项(推荐)
2017/03/20 Python
Python列表切片操作实例总结
2019/02/19 Python
Python使用pyserial进行串口通信的实例
2019/07/02 Python
Python3之字节串bytes与字节数组bytearray的使用详解
2019/08/27 Python
Python2比较当前图片跟图库哪个图片相似的方法示例
2019/09/28 Python
pytorch中nn.Conv1d的用法详解
2019/12/31 Python
一款利用html5和css3动画排列人物头像的实例演示
2014/12/05 HTML / CSS
html5启动原生APP总结
2020/07/03 HTML / CSS
英国最大的在线奢侈手表零售商:Jura Watches
2018/01/29 全球购物
娇韵诗俄罗斯官方网站:Clarins俄罗斯
2020/10/03 全球购物
英国专业美容产品在线:Mylee(从指甲到脱毛)
2020/07/06 全球购物
护士毕业实习感言
2014/03/05 职场文书
兽医医药专业求职信
2014/07/27 职场文书
2019XX公司员工考核管理制度!
2019/08/07 职场文书
vue实现简单数据双向绑定
2021/04/28 Vue.js
Java 泛型详解(超详细的java泛型方法解析)
2021/07/02 Java/Android
解决Mysql多行子查询的使用及空值问题
2022/01/22 MySQL
24年收藏2000多部退役军用电台
2022/02/18 无线电
Kubernetes部署实例并配置Deployment、网络映射、副本集
2022/04/01 Servers