JS进阶知识点及常考面试题
Jan 23, 2019
1.call、apply 和 bind
面试题:call、apply 及 bind 函数内部实现是怎么样的?
- 定义:调用一个对象的一个方法,用另一个对象代替当前对象
- 使用:B.call(A, args1, args2),B.apply(A, arguments),A 对象应用 B 对象的方法
实现 call 方法:
1 | Function.prototype.myCall = function(context) { |
- bind()是 ES5 中的方法,bind 后函数不会立即执行,只是返回一个改变了上下文的函数副本,call 和 apply 是直接执行函数,ie6~ie8 不支持该方法
实现 bind 方法:
1 | Function.prototype.myBind = function (context) { |
2.new
面试题:new 的原理是什么?通过 new 的方式创建对象和通过字面量创建有什么区别?
通过 new 来调用构造函数时,函数体内会发生:
- 创建一个空对象,将它的引用赋给 this,并继承函数的原型
- 通过 this 将属性和方法添加至这个对象
- 最后返回 this 指向的新对象
自己实现一个 new
1 | function create() { |
字面量优势:
- 代码量更少容易阅读
- 可以强调对象是一个简单的可变的散列表,不必一定派生自某个类
- 对象字面量可以在解析时被优化,不需要“作用域解析”,因为存在你已经创建了一个同名的构造函数 Object()的可能,当调用 Object()的时候,解析器需要顺着作用域链从当前作用域开始查找,找到全局 Object()构造函数为止
- Object()可以接收参数,通过这个参数可以把对象实例的创建过程委托给另一个内置构造函数,并返回另一个对象实例,往往不是我们想要的结果
1 | // 字符串对象 |
3.instanceof
面试题:instanceof 的原理是什么?
instanceof 可以正确的判断对象的类型,因为内部机制是通过判断对象的原型链中是不是能找到类型的 prototype。
1 | function myInstanceof(left, right) { |
3.数字精度问题
面试题:为什么 0.1 + 0.2 != 0.3?如何解决这个问题?
0.1 在二进制中是无限循环的一些数字,不只是 0.1,JS 采用的 IEEE 754 双精度版本(64 位)的浮点数标准会裁减掉数字,0.1 就会变成 0.100000000000000002,同样的 0.2 在二进制中也是无限循环的,所以相加不是 0.3。
为什么 console.log(0.1)是正确的?因为在输入内容的时候二进制转换为了十进制,然后再转为字符串,这个转换的过程中取了近似值。
做计算时可以调用如下的函数:
1 | floatAdd: function(arg1, arg2) { |