面试题31:JS中判断是数组的四种方法

122 篇文章 11 订阅

目录

第一种:Array.isArray

第二种:instanceof

第三种:通过constructor判断

instanceof和constructor的判定也存在一些弊端

 第四种:通过Object.prototype.toString.call()判断

5.补充:typeof


第一种:Array.isArray

原理:Array.isArray()用于确定传递的值是否是一个数组,返回一个布尔值

const arr = [1,2,3,4]
console.log(Array.isArray(arr));  // true

 有个问题是Array.isArray()是ES5新增的方法,目的就是提供一个稳定可用的数组判断方法,对于ES5之前不支持此方法的问题,我们其实可以做好兼容进行自行封装,如下:

第二种:instanceof

原理:instanceof运算符用于检验构造函数的Array.prototype属性是否出现在对象的原型链中的任何位置,返回一个布尔值

const arr1=[1,2,3,4];
console.log(arr1 instanceof Array);

看下图:

第三种:通过constructor判断

原理:实例的构造函数属性constructor指向构造函数,通过constructor属性可以判断是否为一个数组

const arr = [1, 2, 3, 4]
console.log(arr.constructor === Array); // true
console.log(arr.__proto__.constructor === Array); //true

instanceof和constructor的判定也存在一些弊端

instanceof和constructor的判定也存在一些弊端,他们判定的数组必须定义在同一个页面,否则将会判定为false。

如果在iframe中的数组判定,就会出错。

 第四种:通过Object.prototype.toString.call()判断

原理:Object.prototype.toString.call()可以获取到对象的不同类型

let arr = [1, 2, 3, 4]
console.log(Object.prototype.toString.call(arr) === '[object Array]');  // true

对象的toString方式也可以判定数组类型,一般来说这种方式的判定是各大库的一种Array.isArray的代替实现。

例如,polyfill中,就是如此实现:

if (!Array.isArray) {
 Array.isArray = function(arg) {
  return Object.prototype.toString.call(arg) === '[object Array]';
 };
}

const arr = [1, 2, 3, 4]
Object.prototype.toString.call(arr) === '[object Array]'  // true
let arr = [1,2,3,4];
console.log(Object.prototype);//完整的原型对象
console.log(Object.prototype.toString);//f toString() {[native code]} 代表这是一个函数
console.log(Object.prototype.toString());//[object Object] 执行了上面的函数
//通过Object.prototype.toString 这个函数作为父类,调用父类.call(子类)方法初始化子类
console.log(Object.prototype.toString.call(arr));//[object Array]

 

5.补充:typeof

typeof 只能检测 基本数据类型,包括boolean、undefined、string、number、symbol,而null ,Array、Object ,使用typeof出来都是Object,函数的typeof 是function 无法检测具体是哪种引用类型。
 

console.log(typeof(100),'1');
console.log(typeof("name"),'2');
console.log(typeof(true),'3');
console.log(typeof(null),'4');
console.log(typeof(undefined),'5');
console.log(typeof([]),'6');
console.log(typeof(Function),'7');

总结

由上述几个方法判定,可以得出,其实polyfill的判定是最合理的,也最具有兼容性的一种判定。

利用toString判定,胜出。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
26.在JS如何获取id为username的文本框的值,如何获取名字为username的文本框的值,用JS代码表示(2分) var userName=document.getElementsByName("username")[0].value; var username=document.getElementById("username").value; 27.用JS代码清空所有文本框的值,用JS代码表示(3分) var inputs = document.getElementsByTagName("input"); for( var i = 0 ; inputs.length ; inputs++ ) { if(inputs[i].type == "text" ) { inputs[i].value = ""; } } 28.JS用什么方法去读取DIV标记的HTML内容,和文本内容,用代码表示,假设这个DIV的id为div1(2分) var div= document.getElementById(“div1”)[removed]; 29.用JS实现一个id为book的div的显示和隐藏(1分) .解释evel函数 (1分) evel函数可以接受一个字符串作为参数,并把此字符串当做一段javascript代码去执行,如果字符串执行结果是一个值则返回此值,否则返回undefined。如果参数不是一个字符串,则直接返回该参数 40.数组的join方法和字符串的split方法的作用是什么 (2分) join()把数组的所有元素放入一个字符串 参数separator默认逗号为分隔符 split() 将一个字符串分割为子字符串,将结果作为字符串数组返回,若字符串存在多个分割符号,亦可分割。 41.如何判断一个对象的值为null,用代码实现,假设对象的名字为obj (1分) var objld=doucment.getElementsByName(“obj”); if (objld==null){……} 42.用代码实现动态生成一个按钮,并添加到一个id为div1的标签 (2分)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值