前端周刊第三十七期

前端周刊发表每周前端技术相关的大事件、文章教程、一些框架的版本更新、以及代码和工具。每周定期发表,欢迎大家关注、转载。
如果外链不能访问,关注公众号前端每周看,里面有解决办法

大事件

  • Tesseract.js 3.0:用于 100 多种语言的纯 JS OCR—— 基于 C++ 的Tesseract库的一个端口,通常用于视觉文本识别。它甚至可以实时处理视频。v3 拥有显着的性能提升,运行时间减少了 84%,现在在支持的情况下使用 SIMD。

  • 提议的 JS 功能:提取器对象——在最近的 TC39 会议上进入第一阶段是一项提议,能够定义自己的逻辑(例如数据验证或转换)以作为对象解构过程的一部分运行。一个值得审查的建议。

  • ‘React 我爱你,但你让我失望’ —— 一个固执己见的 React 思想作品 - 欢呼😆 作者通过以“混合磁带”风格观察 React 的进展,并在其中加入代码和模因,从而获得创意。

文章

  1. Type-Level TypeScript: The Basics — 精美呈现的类型指南,包含要解决的挑战。虽然承诺 11 个“章节”将带您“从中级到高级”,但目前只有前两个可用。它们涵盖了TypeScript 为我们提供哪些类型的基础知识。

  2. 使用 Node.js 编写 Shell 脚本 — Axel 花了几个月的时间深入研究使用 Node 作为脚本语言的现实 — 这是最终结果。

  3. How to Build a Scrollable Text Gallery in Three.js — 尝试在Design Embraced上重现引人注目的滚动文本效果。这是排版和“网页设计”达到 11…

  4. Rest vs Spread 语法:…vs… — Quick:和有什么区别…?诡计问题。虽然它们看起来相同,但它们可以代表两种不同的事物。

  5. 2022 年《Gatsby》有什么新变化? — Gatsby(基于 React 的“反应式站点生成器”)今天可以做什么,以及如何使用一些新功能来简化从 v2 到 v4 的升级。

框架发布

  1. Glide 3.6 – 无依赖的滑块和轮播控件。

  2. React Calendar 3.9 – 强大的日历组件。

  3. Qwik 0.9 – 低 JS HTML-first 框架。

  4. ws 8.9
    ↳ 用于 Node.js 的简单快速的 WebSocket 客户端和服务器。

  5. Semgrep 0.114
    ↳ 多语言静态分析工具。考虑grep语法。

  6. Flat 6.0 – 展平/取消展平嵌套对象。

  7. React Joyride 2.5.3 – 为应用程序创建导览。

  8. Mantine 5.4 – 广泛的 React 组件库。

代码和工具

  1. Linkify 4.0:以纯文本形式链接 URL、电子邮件地址等:给定一些包含链接和电子邮件等内容的纯文本,Linkify 将生成正确的代码以将其显示在 Web 上。不仅是 URL 或电子邮件,还有主题标签、@提及、IP 地址等。

  2. TinyBase 2.0:用于构建应用程序状态的库:当您想要围绕应用程序中的状态管理进行更多数据库式结构时。演示很好地解释了,所以检查一下。

  3. .docxDOCX 7.5:从节点或浏览器生成 Word文件:布局文档的代码非常冗长,但其中包含很多功能。这是一个基于 CodePen 的基本示例

  4. pcl.js:用于浏览器的点云库(PCL),由 WebAssembly 提供支持:“点云”本质上是在 3D 空间中投影的大量点(现场示例。)这是将大型 C++ 库引入

  5. Japa:Node 的替代测试框架:Japa 与AdonisJS (一个 Node.js Web 框架)来自同一团队,无需构建工具即可滑入您现有的工作流程。您可以获得对端点的 OpenAPI 模式驱动测试、数据集驱动测试和 VS Code 扩展的一流支持。

  6. Vue 的命令面板:Vue.js 的 Ctrl/Cmd+K 样式界面:灵感来自 React 的cmdk和kbar。 顺便说一句,如果您从未尝试在浏览 GitHub 时按 Cmd+K(在非 Mac 上按 Ctrl+K)… 试一试。

  7. Precessing (p8g):一个通用的、跨语言的 2D 库:你很少看到一个用于 C、C++、Java和JavaScript 的图形库——是的,WebAssembly 再次负责。你会得到一个 Canvas-esque API ( docs ) 加上输入处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我明白了。下面是一个简单的杂志订阅管理系统的代码实现: ``` #include <iostream> #include <string> using namespace std; class Magazine { protected: string name; string period; double price; public: static int count; Magazine(string n, string p, double pr) : name(n), period(p), price(pr) { count++; } virtual void display() { cout << "Name: " << name << endl; cout << "Period: " << period << endl; cout << "Price: " << price << endl; } }; class WeeklyMagazine : public Magazine { public: WeeklyMagazine(string n, double pr) : Magazine(n, "weekly", pr) {} void display() { cout << "Weekly Magazine:" << endl; Magazine::display(); } }; class MonthlyMagazine : public Magazine { public: MonthlyMagazine(string n, double pr) : Magazine(n, "monthly", pr) {} void display() { cout << "Monthly Magazine:" << endl; Magazine::display(); } }; int Magazine::count = 0; class MagazineSet { private: Magazine* magazines[100]; public: static int count; MagazineSet() {} MagazineSet(const MagazineSet& other) { for (int i = 0; i < other.count; i++) { if (dynamic_cast<WeeklyMagazine*>(other.magazines[i])) { magazines[i] = new WeeklyMagazine(*dynamic_cast<WeeklyMagazine*>(other.magazines[i])); } else if (dynamic_cast<MonthlyMagazine*>(other.magazines[i])) { magazines[i] = new MonthlyMagazine(*dynamic_cast<MonthlyMagazine*>(other.magazines[i])); } } count = other.count; } MagazineSet& operator=(const MagazineSet& other) { if (this != &other) { for (int i = 0; i < count; i++) { delete magazines[i]; } for (int i = 0; i < other.count; i++) { if (dynamic_cast<WeeklyMagazine*>(other.magazines[i])) { magazines[i] = new WeeklyMagazine(*dynamic_cast<WeeklyMagazine*>(other.magazines[i])); } else if (dynamic_cast<MonthlyMagazine*>(other.magazines[i])) { magazines[i] = new MonthlyMagazine(*dynamic_cast<MonthlyMagazine*>(other.magazines[i])); } } count = other.count; } return *this; } void addMagazine(Magazine* mag) { magazines[count] = mag; count++; } void display() { for (int i = 0; i < count; i++) { magazines[i]->display(); } } }; int MagazineSet::count = 0; int main() { MagazineSet set1; WeeklyMagazine mag1("Magazine1", 5.0); MonthlyMagazine mag2("Magazine2", 10.0); set1.addMagazine(&mag1); set1.addMagazine(&mag2); cout << "MagazineSet1:" << endl; set1.display(); MagazineSet set2 = set1; set2.addMagazine(new WeeklyMagazine("Magazine3", 3.0)); cout << "MagazineSet2:" << endl; set2.display(); return 0; } ``` 在上面的代码中,我们定义了一个Magazine类和两个子类WeeklyMagazine和MonthlyMagazine,分别表示周刊和月刊。MagazineSet类用于管理多个杂志的订阅,其中包含了一个Magazine类型的数组magazines,以及一个静态成员变量count,记录当前订阅的杂志数目。 在Magazine类中,我们定义了一个静态成员变量count,用于记录杂志的总数。同时,我们还定义了一个虚函数display,以实现多态。在子类WeeklyMagazine和MonthlyMagazine中,我们重载了这个函数,以实现不同的输出效果。 在MagazineSet类中,我们重载了复制构造函数和赋值运算符,以便正确地复制一个MagazineSet对象。在addMagazine函数中,我们将要添加的杂志指针存储到数组中,并增加count计数器。在display函数中,我们遍历数组并调用display函数输出每个杂志的信息。 在main函数中,我们创建了一个MagazineSet对象set1,并向其中添加了两个杂志对象。然后,我们复制了set1对象,并向复制的对象set2中添加了一个杂志对象。最后,我们分别输出了set1和set2对象的杂志信息。 希望这个简单的代码示例能帮助你更好地理解继承和多态的概念。如果你还有其他问题或者需要进一步的解释,请随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiyangbaixue

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值