- instanceof 从操作符原理及实现
用于判断构造函数 constructor 的原型 prototype 属性是否出现在对象的原型链上
function myInstanceof (object, constructor) {
// 错误处理不完善
if (typeof constructor !== 'function') {
throw new Error('constructor type error')
}
let getPrototype
if (Object.getPrototypeOf) {
getPrototype = Object.getPrototypeOf
} else {
getPrototype = function (obj) {
return obj.__proto__
}
}
let proto = getPrototype(object)
while(proto) {
if (proto === constructor.prototype) {
return true
}
proto = getPrototype(proto)
}
return false
}
- 为什么 0.1 + 0.2 !== 0.3,如何让其相等
计算机存储的的是二进制数据,0.1 和 0.2 在二进制中是无限循环小数(注意是二进制内的),而由于 JS 的标准是 IEEE 754 ,只能使用 64 位二进制数,且只能保留小数部分 52 位精度,剩余的会舍去,因此 0.1 + 0.2 二进制相加,结果之后转为十进制就是 0.30000000000000004
- Number.EPSILON ```javascript function compareFloat(f1, f2) { return Math.abs(f1 - f2) <= Number.EPSILON }
2. 化为整数
```javascript
function trans(num) {
let res
let powerOf10 = 0;
while(!Number.isInteger(num)) {
num *= 10
powerOf10 += 1
}
return [num, powerOf10]
}
// [3, 1]
- 化为字符串 ```javascript function trans(num) { let numStr = String(num) let [integer, decimal] = numStr.split(‘.’) return [Number(integer), Number(decimal)] }
// [0, 3] ```
- 如何获取安全的 undefined,为什么?
undefined 只是一个标识符,并不是关键字,因此可以用来做变量和赋值,为了保证兼容性后续版本的 JS 也是这么做的,但这样会影响对 undefined 的判断,因此可以用 void xx 的返回结果,为 undefined
void 操作符并不改变表达式,只让表达式不返回值,因此一般使用 void 0
取得 undefined
- void 0
- typeof NaN 的结果是?
是 ‘number’,用于指出数字类型中出错的情况(注意不是溢出或精度问题),指“执行数学运算未成功,失败后返回的结果”
注意 NaN !== NaN
,是一个自反的值