使用小技巧

2022-10-28  本文已影响0人  barriers

1 node.js中实现一个sleep函数

import * as dayjs from 'dayjs';

export class TurnRecordController {
  sleep = (delay: number) =>
    new Promise((resolve) => setTimeout(resolve, delay));
  private readonly sleepTime = 7 * 1000;

  constructor() {}

  async getMany() {
    console.log(dayjs().format('YYYY-MM-DD HH:mm:ss'));
    await this.sleep(this.sleepTime);
    console.log(dayjs().format('YYYY-MM-DD HH:mm:ss'));
    return true;
  }
}
  1. node.js中copy

浅拷贝:

# 法1
var obj = { foo: "foo", bar: "bar" };
var copy = { ...obj };

# 法2
var obj = { foo: "foo", bar: "bar" };
var copy = Object.assign({}, obj);

var obj1 = { foo: "foo" };
var obj2 = { bar: "bar" };
var copySpread = { ...obj1, ...obj2 };
// Object { foo: "foo", bar: "bar" }
var copyAssign = Object.assign({}, obj1, obj2);

如果要操作的对象拥有的属性都是值类型,那么我们可以用扩展语法或者Object.assign(...);上面方法的问题是,如果对象的属性本身也是对象,那么实际被拷贝的只是那些指针(浅拷贝)。

深拷贝

var obj = { a: 0, b: { c: 0 } };
var copy = JSON.parse(JSON.stringify(obj));

这个方法只在对象包含可序列化值,并且没有循环引用的时候有用。其中一个不可序列化的类型的就是日期对象 - 尽管它显示出来是字符串化的ISO格式,JSON.parse只会把它解析成为一个字符串,而不是日期类型

Node.js的8.0.0版本提供了一个 序列化 api 可以跟结构化克隆媲美

const v8 = require('v8');
const buf = v8.serialize({a: 'foo', b: new Date()});
const cloned = v8.deserialize(buf);
cloned.b.getMonth();

node8.0.0版本以下的话,比较稳定的方法,可以考虑用 lodash的cloneDeep函数,它的思想也多少有点基于结构化克隆算法

上一篇下一篇

猜你喜欢

热点阅读