目录
- intanceof 操作符的实现原理及实现
- 为什么0.1+0.2 ! == 0.3,如何让其相等
intanceof 操作符的实现原理及实现
instanceof
是一个用于检查对象是否属于特定类的 JavaScript 操作符。它返回一个布尔值,指示对象是否是特定类的实例或者原型链中是否存在该类。
其基本语法如下:
object instanceof constructor
object
:要检查的对象实例。constructor
:用来检查对象是否为其实例的构造函数。
实现原理:
instanceof
操作符其实现原理是通过检查对象的原型链,看对象的原型链上是否存在指定类型的原型。
当你使用 object instanceof Type
时,JavaScript 引擎会沿着 object
的原型链向上查找,看是否能在原型链中找到 Type.prototype
。如果找到,就返回 true
;否则返回 false
。
实现:
function myInstanceof(obj, constructor) {let proto = obj.__proto__while (proto) {if (proto === constructor.prototype) {return true}proto = proto.__proto__}return false
}
在这个自定义的 myInstanceof
函数中,我们首先获取 obj
的原型,然后不断地沿着原型链往上查找,直到找到目标构造函数的原型或者到达原型链的末端。如果找到了目标构造函数的原型,就返回 true
;否则返回 false
。
思路:
- 获取对象的原型
__proto__
。 - 循环遍历原型链,直到找到目标构造函数的原型或者到达原型链的末端。
- 如果找到目标构造函数的原型,返回
true
;否则返回false
。
参考效果案例:
class Car {}
let myCar = new Car()
console.log(myInstanceof(myCar, Car)) // 输出 true
console.log(myInstanceof(myCar, Object)) // 输出 true,因为所有对象的原型链最终都指向 Object.prototype
console.log(myInstanceof([], Array)) // 输出 true
console.log(myInstanceof([], Object)) // 输出 true
console.log(myInstanceof({}, Array)) // 输出 false
为什么0.1+0.2 ! == 0.3,如何让其相等
在计算机中,浮点数的表示并不总是精确的。这是因为计算机使用二进制来表示小数,而在二进制系统中,有些小数无法准确地表示,就像十进制中的 1/3 一样。
当你计算 0.1 + 0.2 时,虽然在十进制中结果是 0.3,但在计算机内部,这两个浮点数的精确表示会导致一个微小的舍入误差。这导致了在计算机内部表示的值与我们期望的值略有不同。
要让它们相等,可以采用以下方法:
- 四舍五入: 可以将结果四舍五入到特定的小数位数。这种方法在实际应用中很常见,但也可能导致精度丢失。
- 使用整数进行计算: 将小数转换成整数进行计算,最后再转换回小数。这样可以避免浮点数计算过程中的精度问题。
参考效果案例:
// 四舍五入
let result = (0.1 * 10 + 0.2 * 10) / 10
console.log(result) // 输出 0.3// 使用整数进行计算
let result2 = (1 + 2) / 10
console.log(result2) // 输出 0.3
思路:
- 对于四舍五入的方法,我们可以通过放大倍数,进行整数运算,最后再缩小倍数得到结果。
- 使用整数进行计算的方法,可以将小数转换成整数进行计算,最后再转换回小数。
这些方法可以帮助我们解决浮点数计算中的精度问题。
持续学习总结记录中,回顾一下上面的内容:
intanceof 操作符的实现原理及实现、为什么0.1+0.2 ! == 0.3,如何让其相等