js如何判断一个对象是数组(函数)

js如何判断一个对象是数组(函数)

1.typeof操作符 

示例:

// 数值
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操作符 

这个操作符和JavaScript中面向对象有点关系,了解这个就先得了解JavaScript中的面向对象。因为这个操作符是检测对象的原型链是否指向构造函数的prototype对象的。

var arr = [1,2,3,1];
console.log(arr instanceof Array); // true 

var fun = function(){};
fun.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()这个方法,如果不支持才使用原型链的方式呢?我们可以从代码执行效率上看:

从这张图片我们可以看到,Array.isArray()这个方法的执行速度比原型链的方式快了近一倍。

  

原文地址:https://www.cnblogs.com/momozjm/p/12059034.html

时间: 2024-10-24 05:13:14

js如何判断一个对象是数组(函数)的相关文章

如何判断一个对象是数组还是对象

一.typeof判断数据类型(判断数组跟对象都返回object) console.log(typeof null); // "object" console.log(typeof function () { return 1; }); // "function" console.log(typeof '梦龙小站'); // "string" console.log(typeof 1); // "number" console.

JS中判断对象是不是数组的方法

JavaScript中检测对象的方法 1.typeof操作符 这种方法对于一些常用的类型来说那算是毫无压力,比如Function.String.Number.Undefined等,但是要是检测Array的对象就不起作用了. 利用typeof除了array和null判断为object外,其他的都可以正常判断 alert(typeof null); // "object" alert(typeof function () { return 1; }); // "function&

判断对象是数组

Object.prototype.toString.call(b).slice(8,-1) 注:返回值为  "Array" Object.prototype.toString.call(b) 注:返回值为  "[object Array]"  slice(8,-1)为开始点为索引8,结束点为倒数第一个即-1 获取对象类型,为什么用 Object.prototype.toString.call(obj) 而不用 obj.toString() 呢? var c = [1

如何判断一个对象是可迭代对象

方法是通过collections模块的iterable类型来判断. >>> from collections import Iterable >>> isinstance('abc',Iterable)#str是否可迭代 True >>> isinstance([1,2,3],Iterable)#list是否可迭代 True >>> isinstance(123,Iterable)#整数是否可迭代 False

判断对象是否为数组/函数

打印Object的prototype属性: 有一个toString方法,不同于一般变量的toString方法,当Object的toString方法执行时: 1.获取当前对象的[[Class]]属性的值; 2.返回 "[object " + 第一步得出的值+ "]"格式的字符串,例如[object Array], 解析: [[Class]]是一种内部属性,所有的对象(原生对象和宿生对象)都拥有该属性,描述该对象的类型 (值得注意的是[[Class]]的值只能是Obje

js数据类型判断和数组判断

这么基础的东西实在不应该再记录了,不过嘛,温故知新~就先从数据类型开始吧 js六大数据类型:number.string.object.Boolean.null.undefined string: 由单引号或双引号来说明,如"string" number:什么整数啊浮点数啊都叫数字,你懂的~ Boolean: 就是true和false啦 undefined:未定义,就是你创建一个变量后却没给它赋值~ null: 故名思久,null就是没有,什么也不表示 object: 这个我也很难解释的

js 的数组怎么push一个对象. Js数组的操作push,pop,shift,unshift JavaScript使用push方法添加一个元素到数组末 JavaScript数组函数unshift、shift、pop、push使用

push()函数用于向当前数组的添加一个或多个元素,并返回新的数组长度.新的元素将会依次添加到数组的末尾. 该函数属于Array对象,所有主流浏览器均支持该函数. 语法 array.push( item1 [,items... ] )参数 参数 描述item1 任意类型添加到当前数组末尾处的元素.items 可选参数/任意类型要添加到当前数组末尾处的其他项,可以有多个.注意:如果添加的元素类型为数组类型(Array),仍然会被当作一个元素看待,只是这个元素是数组类型而已.如果要合并两个数组,请使

前端JS:判断list(数组)中的json对象是否重复

前端JS:判断list(数组)中的json对象是否重复 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Test</title> <script> function displayDate(){ var arr = [{ d: '2015-10-12',C:'Apple'}, { d: '2015-10-12',C:'Apple'}

js中判断数组中是否包含某元素的方法

方法一:array.indexOf(item,start):元素在数组中的位置,如果没与搜索到则返回 -1. 参数 描述 item 必须.查找的元素. start 可选的整数参数.规定在数组中开始检索的位置.它的合法取值是 0 到 stringObject.length - 1. 如省略该参数,则将从字符串的首字符开始检索. 实际用法:if(arr.indexOf(某元素) > -1){//则包含该元素} var fruits = ["Banana", "Orange&