- isNaN 和 Number.isNaN 函数的区别
- 函数 isNaN,会尝试将这个参数转换为数值,任何不能被转换为数值的值都会返回 true,因此非数字的值也会返回 true,会影响 NaN 的判断
- 函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字才会继续判断是否为 NaN,不会进行隐式转换,对于 NaN 的判断更准确
- == 操作符引起的隐式转换规则
如果对比双方的类型不一样,就会进行类型转换。比如对比 x 和 y ,会遵循以下流程
- 首先会判断两者类型是否相同,相同的话比较两种的数值大小
- 然后会判断是否在对比 null 和 undefined,是的话会返回 true
- 判断两者是否为 string 和 number,是的话会转 string 为 number
- 判断其中一方是否为 boolen,是的话会把 boolean 转为 number
判断其中乙方是否是 object,且另一方为 string、number 或 symbol,是的话会把 object 通过 toString 转为原始类型
'1' == { name: 'js' }
'1' == '[object Object]'
其他值到字符串的转换规则 ```javascript Null 和 Undefined,转换为字符串 ‘null’ 和 ‘undefined’
Bool ,转换为 ‘true’ 和 ‘false’
Number,直接转换,极大或极小的数字会用科学计数法
Symbol,直接转换,但是不能隐式转换,必须用显式强制类型转换
普通对象,通过自定义的 toString,调用并返回值;否则会调用 Object.prototype.toString
1. 找出数组里出现次数最少的值(可以尝试用堆)
```javascript
function minNthOfArray(arr) {
let map = new Map()
for(let i = 0; i < arr.length; i++) {
map.set(arr[i], map.has(arr[i]) ? map.get(arr[i]) + 1 : 1)
}
let min = Infinity
let res
for(let i of map.keys()) {
const value = map.get(i)
if (min > value) {
min = value
res = i
}
}
return res
}
interface InitInterface {
count: number;
message: string;
asyncMethod<T, U>(input: Promise<T>): Promise<Action<U>>
syncMethod<T, U>(action: Action<T>): Action<U>
}
type MethodsTransformation<T> = T extends asyncMethod<infer A, infer B>
? newAsyncMethod<A, B>
: T extends syncMethod<infer C, infer D>
? newSyncMethod<C, D>
: never;
type PickMethods<T> = {
[K in keyof T]: T[K] extends Function ? K : never;
}[keyof T];
type EffectModuleMethods = PickMethods<EffectModule>;
type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;
type Connect = (module: EffectModule) => {
[N in EffectModuleMethods]: MethodsTransformation<EffectModule[N]>
}
type Result {
asyncMethod<T, U>(input: T): Action<U>
syncMethod<T, U>(action: T): Action<U>
}