求star

开源不易,喜欢请点个star吧

Ocean Han
389 字
2 分钟
有关JS的一些常见技巧(持续更新)
2023-04-19

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那些骚操作持续更新/
作者
Ocean Han
发布于
2023-04-19
许可协议
CC BY-NC-SA 4.0
最后修改时间
2024-08-10 10:08:49