所有分类
  • 所有分类
  • 后端开发
JavaScript小技巧大揭秘!如何判断另一半是数组?

JavaScript小技巧大揭秘!如何判断另一半是数组?

从上面的实例我们可以看出,利用typeof除了array和null判断为object外,其他的都可以正常判断。因为这个操作符是检测对象的原型链是否指向构造函数的prototype对象的。来判断是否是数组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这个家伙,简单案例告诉我们,除了数组和空值,其他东西大部分都能用它搞定。真的挺好用的,但要记得,如果网页里有好多iframe,那麻烦就大!因为每个iframe都是个小程序,所以里头的函数你可能就看不见了。

var arr = [1,2,3,1];
console.log(arr instanceof Array); // true
 
var fun = function(){};
console.log(fun instanceof Function); // true

咱们来唠唠关于’instanceof’和object’styleOf()’属性的事儿。别看它们跟JavaScript面向对象好像没啥关联,实际上还是有些联系的!这个小技巧,主要就是通过查看对象原型链里头是否存在一个叫prototype的构造函数对象。看似简简单单,可在实战中,你会遇到各种各样的问题,特别是当我们处理跨iframe的对象实例化的时候。唉,你想,每个iframe都是完全独立的,那这个方法在这里就有点行不通咯。

var arr = [1,2,3,1];
console.log(arr.constructor === Array); // true
 
var fun = function(){};
console.log(arr.constructor === Function); // true

JavaScript小技巧大揭秘!如何判断另一半是数组?

你想问的那个东东是数组吗?直接拿 Object.prototype.toString来看!不过要注意了,要用call调用,这样就能把this指向obj了。但别忘了这招儿只适用于IE8及以上版本,老版本浏览器就抓瞎~

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

放心,咱这儿还有别的招儿!告诉你,ES5给我们带来了个新功能—Array.isArray(),这玩意儿能准确判断手里的数据是不是数组。好多浏览器现在都能用上这个,像IE9和更高版本、Firefox 4或以上,还有Safari 5或更高,Opera 10.5或更高以及 Chrome等。但是对用IE8或更老版本的人来说,这招儿效果可能没那么好。所以,处理数据时要注意咯,保证拿到的真是数组才行哟。

Object.prototype.toString.call( [] ) === '[object Array]' // true
 
Object.prototype.toString.call( function(){} ) === '[object Function]' // true

为啥咱们不再用原型链来测兼容性?说白了就是不够快~试想,浏览器要是有了Array.isArray()方法,那还要费劲找原型链干嘛?再说了,它速度可是原型链的两倍,这多方便

好,我现在就给你说一下咋解决这问题!总的来说,最有效的做法就是首先判断一下这玩意儿是不是Array(),要是不对的话,那就直接用咱们熟悉的with方法,这样不仅能保证兼容性还可以提升效率呐!今天的课就到这里,希望这堆知识能帮到你们有啥不懂的记得在下面留言再次感谢大伙儿一直以来的支持!

[].__proto__ === Array.prototype // true
 
var fun = function(){}
fun.__proto__ === Function.prototype // true

原文链接:https://www.icz.com/technicalinformation/web/2024/03/11462.html,转载请注明出处~~~
0

评论0

请先
注意:请收藏好网址www.icz.com,防止失联!站内免费资源持续上传中…!赞助我们
显示验证码
没有账号?注册  忘记密码?