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 相关文章推荐
让iframe框架网页在任何浏览器下自动伸缩
Aug 18 Javascript
在IE浏览器中resize事件执行多次的解决方法
Jul 12 Javascript
js/jquery获取文本框输入焦点的方法
Mar 04 Javascript
js实现的奥运倒计时时钟效果代码
Dec 09 Javascript
Json解析的方法小结
Jun 22 Javascript
分享JS代码实现鼠标放在输入框上输入框和图片同时更换样式
Sep 01 Javascript
JS识别浏览器类型(电脑浏览器和手机浏览器)
Nov 18 Javascript
JQuery Dialog对话框 不能通过Esc关闭的原因分析及解决办法
Jan 18 Javascript
JavaScript实现鼠标点击导航栏变色特效
Feb 08 Javascript
jQuery访问json文件中数据的方法示例
Jan 28 jQuery
一次微信小程序内地图的使用实战记录
Sep 09 Javascript
Vue替代marquee标签超出宽度文字横向滚动效果
Dec 09 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/02/03 PHP
php生成excel文件的简单方法
2014/02/08 PHP
php字符串的替换,分割和连接方法
2016/05/23 PHP
JS 非图片动态loading效果实现代码
2010/04/09 Javascript
jquery动态增加text元素以及删除文本内容实例代码
2013/07/01 Javascript
jquery实现隐藏与显示动画效果/输入框字符动态递减/导航按钮切换
2013/07/01 Javascript
JQuery插件fancybox无法在弹出层使用左右键的解决办法
2013/12/25 Javascript
使用jQuery实现验证上传图片的格式与大小
2014/12/03 Javascript
Javascript中实现trim()函数的两种方法
2015/02/04 Javascript
JavaScript中的Math.SQRT1_2属性使用简介
2015/06/14 Javascript
JS填写银行卡号每隔4位数字加一个空格
2016/12/19 Javascript
angular-ui-sortable实现可拖拽排序列表
2016/12/28 Javascript
利用n工具轻松管理Node.js的版本
2017/04/21 Javascript
Webpack实现按需打包Lodash的几种方法详解
2017/05/08 Javascript
一次记住JavaScript的6个正则表达式方法
2018/02/22 Javascript
浅谈vue项目打包优化策略
2018/09/29 Javascript
在vue中使用Echarts画曲线图的示例
2020/10/03 Javascript
Python使用redis pool的一种单例实现方式
2016/04/16 Python
Python实现获取磁盘剩余空间的2种方法
2017/06/07 Python
python实现俄罗斯方块游戏
2020/03/25 Python
python特性语法之遍历、公共方法、引用
2018/08/08 Python
Django文件存储 默认存储系统解析
2019/08/02 Python
PyTorch中permute的用法详解
2019/12/30 Python
python MD5加密的示例
2020/10/19 Python
UNIONBAY官网:美国青少年服装品牌
2019/03/26 全球购物
JAVA招聘远程笔试题
2015/07/23 面试题
喝酒检查书范文
2014/02/23 职场文书
计算机网络及管理学专业求职信
2014/06/05 职场文书
应届生面试求职信
2014/07/02 职场文书
财务科长个人对照检查材料
2014/09/18 职场文书
2014年公路养护工作总结
2014/12/04 职场文书
2015年全民国防教育日活动总结
2015/03/23 职场文书
难以忽视的真相观后感
2015/06/05 职场文书
2015初中政治教学工作总结
2015/07/21 职场文书
MySQL安装后默认自带数据库的作用详解
2021/04/27 MySQL
vue实现input输入模糊查询的三种方式
2022/08/14 Vue.js