9021年底了,突然想在这个最后一个月准备一下,试试机会,能否更进一步。所以开始准备一些基础知识,也随带总结出来给各位想换工作的同学。希望大家能找到自己想要的工作。祝大家好运!
如果你知道更多的方式评论给我。谢谢!
总结回顾
一、instanceof
var array = []; array instanceof Array;
PS:instanceof的实现原理(判断左边对象的原型链上是否存在右边原型)
function myInstanceof(left, right) { let right = right.prototype; let left = left.__proto__; while (true) { if (left === null || rigth === undefined) { return false; } else { if (left === right) { return true; } else { left = left.__proto__; } } } } 复制代码
二、constructor
var array = []; array.constructor === Array
PS:instanceof和constructor判断的变量,必须在当前页面申明的,比如,一个页面(父页面)一样一个框架,框架中引入一个页面(子页面),在子页面中声明的array,并将其复制给父元素的一个变量,判断该变量,将返回false。
原因:array是复合类型。在传递的过程中,仅仅是引用地址的传递。 每个页面的array原生对象引用的地址是不一样的,在子页面中声明的array,所对应的构造函数,是子页面的array对象,在父页面进行判断时,使用的并不是子页面的array;
三、__ proto__.constructor
var array = []; array.__proto__.constructor === Array;
每个对象都有一个__proto__属性,该属性指向构造函数的原型对象,对象可以通过这个属性访问到构造函数的原型对象,__proto__属性是没有写入ES6正文的属性, 而是写入了附录中,原因是他本质上是一个内部属性,而不是一个正式的API,只是被浏览器广泛支持,才被加入ES6,只有浏览器有这个属性,其他环境是没有。所以重某种角度来说,我们是不建议在实际生产中使用的,而是使用Object.getPrototypeOf(target)来进行操作。
var array = []; Object.getPrototypeOf(array).constructor === Array; 复制代码
四、Array.isArray
var array = []; Array.isArray(array);
es6中加入了新的判断方法,存在兼容性问题。
五、toString(最常用)
考虑Array.isArray的兼容性问题
if(!Array.isArray){ Array.isArray = function(arg){ return Object.prototype.toString.call(arg)==='[object Array]'; } } var array = []; Array.isArray(array);