389 字
2 分钟
有关JS的一些常见技巧(持续更新)
1. 如何使 a==1&&a==2&&a==3
成立?
TIP 按照常规的情况下,这显然不可能,但是JS是单线程的,即使写在一行,也是从左到右执行的,也就是说他们从时空上说就不是同时发生的。
因为是双等号,所以也涉及隐式类型转换的问题
此外,在JS中,几乎所有对象都有
valueOf
方法,这是一个内置方法,用于返回对象的原始值,当需要将对象转化成原始值时,会自动调用这个方法,所以我们来重写这个方法来实现这个需求
const a = {
value: 1,
valueOf: function () {
return this.value++
}
}
console.log(a == 1 && a == 2 && a == 3);
2. 使用Object.prototype.toString.call(obj)
检测对象类型
:::
首先,直接使用typeof
判断一个对象的类型是不准确的,比如null
的结果也是Object,数组的结果也是Object。
我们可以通过Object原型上的toString方法可以很好的区分各种类型
:::
console.log(Object.prototype.toString.call("jerry"));//[object String]
console.log(Object.prototype.toString.call(12));//[object Number]
console.log(Object.prototype.toString.call(true));//[object Boolean]
console.log(Object.prototype.toString.call(undefined));//[object Undefined]
console.log(Object.prototype.toString.call(null));//[object Null]
console.log(Object.prototype.toString.call({name: "jerry"}));//[object Object]
console.log(Object.prototype.toString.call(function(){}));//[object Function]
console.log(Object.prototype.toString.call([]));//[object Array]
console.log(Object.prototype.toString.call(new Date));//[object Date]
console.log(Object.prototype.toString.call(/\d/));//[object RegExp]
3.判断奇偶数
/**
* 判断是否是奇数
*/
function isOdd(n: number) {
return !!(n%2)
}
4.使用元组生成联合类型
// as count 将 string[]类型变成元组类型
const colors = ['♠','♣','♦','♥'] as count;
const values = [
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'10',
'J',
'Q',
'K',
'A',
] as count;
// 生成联合类型
type Values = typeof values[number];
type Colors = typeof colors[number];
function createCard(value: Values, color: Colors){}
5.判断一个函数是否标记async
function isAsyncFunc(func: Function) {
return Object.prototype.toString.call(func) === '[object AsyncFunction]';
}
有关JS的一些常见技巧(持续更新)
https://blog.oceanh.top/posts/frontend/有关js那些骚操作持续更新/