阿里妈妈事业群-电话面
判断是不是数组
Array.isArray(a)
a instanceof Array
a.constructor === Array
oBject.prototype.toString.call(a) === '[object Array]'
你提到instanceof就聊一聊instanceof
Instanceof 用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上
例如在表达式
left instanceof right
中 会沿着 left 的原型链查找看是否存在 right 的 prototype 对象
left.__proto__.__proto__... =?= right.prototype
那就说一说原型链
每一个构造函数都有一个prototype属性,指向了它的原型
每一个实例有一个__proto__属性,这个属性指向了它的原型,原型上还有__proto__,指向了它父类的原型,一直到Object.prototype为止,所以Object的原型,是一个对象的终极原型,它的prototype是null
访问实例的一个属性,会从它的实例内部查找,若没有就到它的原型,还没有就继续向父一级原型查找,一直找到Object.prototype位置,没有就返回undefined
原型链怎么实现继承
假设构造函数 B() 需要继承构造函数 A(),就可以通过将函数 B() 的显式原型指向一个函数 A() 的实例,然后再对 B 的显式原型进行扩展。那么通过函数 B() 创建的实例,既能访问函数 B() 的属性 b,也能访问函数 A() 的属性 a,从而实现了多层继承。
具体例子:
// 定义动物类 function Animal (name) { 属性、实例方法} // 原型方法 Animal.prototype.eat = function () { } // 原型链继承 function Cat (food) { } Cat.prototype = new Animal() Cat.prototype.name = 'cat'
除此之外,构造继承
function Cat (name) { Animal.call(this) this.name = name }
实例继承
function Cat (name) { var instance = new Animal() instance.name = name return instance }
通过原型链判断是不是数组
a.__proto__.__proto__... =?= Array.prototype
数组操作元素的方法 -> 主要考察map() forEach() filter()…方法
- 不改变原数组的方法
IndexOf()/lastIndexOf():返回元素在数组第一次/最后一次出现的索引,从0开始。