util.js源码判断数组方法及其延伸总结

127 7 个月前
util.js是对javascript开发过程中一些常用函数的封装,我查看的版本是 0.11.0 ,学习每一个函数,并把相关知识延伸,方便后续复习

util.js源码判断数组方法如下:

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;
  }

关于instanceofconstructor再说点题外话:

let obj = Object.create(null);
console.log(typeof obj);
console.log(obj instanceof Object);
console.log(obj.constructor);
//object
//false
//undefined

Object.create():该方法可以指定原型对象和属性,返回一个新的对象。

关于哎,到处都是坑~~~

分类栏目
© 2018邮箱:11407215#qq.comGitHub沪ICP备12039518号-6