前端面试题总结-JavaScript(一)

50 阅读3分钟

一 原型和原型链

引用类型的四个规则

  1. 都具有对象特性,即可自由拓展属性。
  2. 都有一个隐式原型_proto_属性,属性值是一个普通的对象。
  3. 隐式原型_proto_的属性值指向它的构造函数的显示原型prototype属性值。
  4. 当你试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么它会去它的隐式原型 __proto__(也就是它的构造函数的显式原型 prototype)中寻找。

引用类型:Object、Array、Function、Date、RegExp。这里我姑且称 proto 为隐式原型,没有官方中文叫法,大家都瞎叫居多。

原型

  在JavaScript中是使用构造函数来新建一个对象的,每一个构造函数的内部都有一个prototype属性,它的属性值是一个对象,这个对象包含了可以由该构造函数的所有实例共享的属性和方法。当使用构造函数新建一个对象后,在这个对象的内部将包含一个指针,这个指针指向构造函数的prototype属性对应的值,在ES5中这个指针被称为对象的原型。
  一般来说不应该能够获取到这个值的,但是现在浏览器中都实现了 __proto__属性来访问这个属性,但是最好不要使用这个属性,因为它不是规范中规定的。ES5中新增了一个Object.getPrototypeOf()方法,可以通过这个方法来获取对象的原型。

原型链

  当访问一个对象的属性时,如果这个对象内部不存在这个属性,那么它就会去它的原型对象里找这个属性,这个原型对象又会有自己的原型,于是就这样一直找下去,也就是原型链的概念。原型链的尽头一般来说都是 Object.prototype所以这就是新建的对象为什么能够使用toString()等方法的原因。

原型链的终点

  由于Object是构造函数,原型链终点为Object.prototype.__proto__
  Object.prototype.__proto__=== null // true,所以,原型链的终点是null。原型链上的所有原型都是对象,所有的对象最终都是由Object构造的,而Object.prototype的下一级是Object.prototype.__proto__

二 普通函数与箭头函数的区别

1、 箭头函数不会创建自己的this

箭头函数不会创建自己的this,所以它没有自己的this,它只会从自己的作用域链的上一层继承this

箭头函数没有自己的this,它会捕获自己在定义时(注意,是定义时,不是调用时)所处的外层执行环境的this,并继承这个this值。所以,箭头函数中this的指向在它被定义的时候就已经确定了,之后永远不会改变。

2、.call()/.apply()/.bind()无法改变箭头函数中this的指向

3、箭头函数不能作为构造函数使用

4、箭头函数没有自己的arguments

箭头函数没有自己的arguments对象。在箭头函数中访问arguments实际上获得的是外层局部(函数)执行环境中的值。

可以在箭头函数中使用rest参数代替arguments对象,来访问箭头函数的参数列表!!

5、箭头函数没有原型prototype