最近闲得无聊翻看了下util.js
(0.11.0), 其判断数组的方法是:
function isArray(arr){
return Array.isArray(arr)
}
Array.isArray()
早在ES5
就己经有了,util.js
再单独定义本没必要,不过新版本中己经废弃,直接使用Array.isArray()
来判断。
关于数组判断的基础知识:
typeof A
:检测数据 A 类型。
A instanceof B
:检测数据 A 的原型链上是否有 B 的原型对象 。
A.constructor
:返回初始化 A 的构造函数。
typeof
运算符判断数组时,返回object
,此时我们们以结合使用上面的判断写出如下判断方法:
function isArray(arr){
return typeof arr === "object" && arr instanceof Array
}
function isArray(arr){
return typeof arr === "object" && arr.constructor === Array
}
以上两个方法可以判断数组,但是得注意了,如果我们使用框架(iframe),每个框架都有其全局window
和各自不同的内置javascript对象,这时要防止引用混乱的情况
var iframe = document.createElement('iframe');
document.body.appendChild(iframe);
xArray = window.frames[window.frames.length-1].Array;
var arr = new xArray("1","2","3","4","5");
//这个写法IE下是不支持的,标准浏览器firefox,chrome下有
console.log(arr); // 打印出 ["1", "2", "3", "4", "5"]
console.log(arr instanceof Array); // false
console.log(arr.constructor === Array); // false
在查看jquery
源码可以看到它所用的另一种方法,这种方法也被很多开发者所借鉴
Object.portotype.toString.call(value)//or
{}.portotype.toString.call(value)
以上方法返回值如下:
Object.prototype.toString.call("jerry");//[object String]
Object.prototype.toString.call(12);//[object Number]
Object.prototype.toString.call(true);//[object Boolean]
Object.prototype.toString.call(undefined);//[object Undefined]
Object.prototype.toString.call(null);//[object Null]
Object.prototype.toString.call({name: "jerry"});//[object Object]
Object.prototype.toString.call(function(){});//[object Function]
Object.prototype.toString.call([]);//[object Array]
Object.prototype.toString.call(new Date);//[object Date]
Object.prototype.toString.call(/\d/);//[object RegExp]
function Person(){};
Object.prototype.toString.call(new Person);//[object Object]
var obj = Object.create( null );
Object.prototype.toString.call(obj);//"[object Object]"
Object.getPrototypeOf(obj)//null
Jquery
获取类型的方法:
var class2type = {};
"Boolean Number String Function Array Date RegExp Object Error Symbol".split(" ").forEach(function(name,i,arr){
class2type["[object " + name + "]"] = name.toLowerCase();
})
function toType( obj ) {
if ( obj == null ) {
return obj + "";
}
return typeof obj === "object" || typeof obj === "function" ? class2type[ {}.toString.call( obj ) ] || "object" : typeof obj;
}
关于instanceof
和constructor
再说点题外话:
let obj = Object.create(null);
console.log(typeof obj);
console.log(obj instanceof Object);
console.log(obj.constructor);
//object
//false
//undefined
Object.create()
:该方法可以指定原型对象和属性,返回一个新的对象。
关于哎,到处都是坑~~~
网友评论