鸿蒙开发实战二 TypeScript和JavaScript的区别

简介

基于第一篇文章中提到的:https://mp.csdn.net/mp_blog/creation/editor/143515906

  •  声明式开发范式:采用基于TypeScript声明式UI语法扩展而来的ArkTS语言,从组件、动画和状态管理三个维度提供UI绘制能力。

  • 类Web开发范式:采用经典的HML、CSS、JavaScript三段式开发方式,即使用HML标签文件搭建布局、使用CSS文件描述样式、使用JavaScript文件处理逻辑。该范式更符合于Web前端开发者的使用习惯,便于快速将已有的Web应用改造成方舟UI框架应用。

 那么下面介绍TypeScript和JavaScript之间到底有哈区别

一、表格对比列表

二、语法

2.1 类型注解

  • JavaScript: 不支持类型注解,变量的类型由值来推断。
  • TypeScript: 支持静态类型注解,可以在变量、函数参数、函数返回值等地方显式指定类型。
// TypeScript
function add(a: number, b: number): number {
  return a + b;
}

2.2 类和接口

  • JavaScript: 使用原型链来实现对象的继承,没有类和接口的概念。
  • TypeScript: 引入了类和接口,支持面向对象的编程风格。
// TypeScript
interface Shape {
  calculateArea(): number;
}

class Circle implements Shape {
  constructor(private radius: number) {}

  calculateArea() {
    return Math.PI * this.radius ** 2;
  }
}

2.3 枚举

  • JavaScript: 不支持枚举类型。
  • TypeScript: 支持枚举类型,可以定义一组命名的常量值。
// TypeScript
enum Direction {
  Up,
  Down,
  Left,
  Right,
}

二、 类型系统

2.1 静态类型检查

  • JavaScript: 在运行时进行类型检查,类型错误只会在执行阶段被发现。
  • TypeScript: 使用静态类型检查,在编译时进行类型检查,能够提前发现并避免一些潜在的错误。
// TypeScript
let name: string = "Alice";
name = 123; // 编译时错误

2.2 类型推断

  • JavaScript: 变量的类型由值来推断。
  • TypeScript: 支持类型推断,当类型没有显式指定时,会根据上下文自动推断出变量的类型。
// TypeScript
let age = 25; // 推断为 number 类型
提供更丰富的类型
  • JavaScript: 基本数据类型和对象类型。
  • TypeScript: 支持基本数据类型、对象类型、元组、联合类型、交叉类型、字面量类型等更丰富的类型。
// TypeScript
type Status = "pending" | "in_progress" | "completed";

interface Fruit {
  name: string;
  color: string;
}

type Apple = Fruit & { type: "apple" };
type Banana = Fruit & { type: "banana" };

function getFruitColor(fruit: Apple | Banana): string {
  return fruit.color;
}

三、工具支持

3.1 编辑器支持

JavaScript: 可以在大多数代码编辑器中编辑 JavaScript 代码,但没有针对 JavaScript 的专用编辑器。
TypeScript: 得益于类型系统,TypeScript 在编辑器中提供了更强大的代码补全、类型检查和重构功能。同时,一些编辑器如 Visual Studio Code 提供了针对 TypeScript 的更完善支持。

3.2 调试支持

  • JavaScript: 可以通过浏览器的开发者工具进行调试。
  • TypeScript: 能够生成可调试的 JavaScript 代码,支持在编辑器或浏览器中进行调试。

3.3 文档和社区

JavaScript: 具有成熟的文档和庞大的社区资源,容易找到相关的教程、博客文章和解决方案。
TypeScript: TypeScript 基于 JavaScript,因此可以享受到 JavaScript 社区的一部分资源,此外还有针对 TypeScript 的官方文档、社区论坛和第三方库的支持。

四、生态系统

4.1 第三方库

JavaScript: 拥有世界上最大的开源生态系统,有众多的第三方库和框架可供选择。
TypeScript: TypeScript 与 JavaScript 兼容,可以直接使用 JavaScript 的第三方库。此外,TypeScript 还有自己的类型声明文件(.d.ts)生态系统,提供了大量的类型定义供开发者使用。

TypeScript编写一个API的案例

下面演示用TypeScript 开发一个简单的 Express.js 后端 API:

import express, { Request, Response } from "express";

interface User {
  name: string;
  age: number;
}

const app = express();

app.use(express.json());

app.post("/users", (req: Request, res: Response) => {
  const user: User = req.body;
  // 处理用户数据
  res.json(user);
});

app.listen(3000, () => {
  console.log("Server is running on port 3000");
});

在该案例中,使用 TypeScript 提供的静态类型检查,使你能够更早地发现和解决潜在的错误。此外 TypeScript 还提供了代码补全和类型推断,大大提高开发效率。

五、性能对比

5.1 js

// JavaScript 性能测试1 - 计算两点之间的距离
function calculateDistance(point1, point2) {
   const dx = point2.x - point1.x;
   const dy = point2.y - point1.y;
   return Math.sqrt(dx * dx + dy * dy);
 }
 
 const p1 = { x: 0, y: 0 };
 const p2 = { x: 3, y: 4 };
 console.log('Distance:', calculateDistance(p1, p2));


 // JavaScript 性能测试2 - 冒泡排序
function bubbleSort(arr) {
   const length = arr.length;
   for (let i = 0; i < length - 1; i++) {
     for (let j = 0; j < length - i - 1; j++) {
       if (arr[j] > arr[j + 1]) {
         const temp = arr[j];
         arr[j] = arr[j + 1];
         arr[j + 1] = temp;
       }
     }
   }
   return arr;
 }
 
 const array = [64, 34, 25, 12, 22, 11, 90];
 console.log('Sorted Array:', bubbleSort(array));

使用node直接执行

成绩(测5次):
[Done] exited with code=0 in 0.038 seconds
[Done] exited with code=0 in 0.036 seconds
[Done] exited with code=0 in 0.035 seconds
[Done] exited with code=0 in 0.036 seconds
[Done] exited with code=0 in 0.035 seconds

5.2 TS

// TypeScript 性能测试1 - 计算两点之间的距离
interface Point {
  x: number;
  y: number;
}

function calculateDistance(point1: Point, point2: Point): number {
  const dx = point2.x - point1.x;
  const dy = point2.y - point1.y;
  return Math.sqrt(dx * dx + dy * dy);
}

const p1: Point = { x: 0, y: 0 };
const p2: Point = { x: 3, y: 4 };
console.log('Distance:', calculateDistance(p1, p2));

// TypeScript 性能测试2 - 冒泡排序
function bubbleSort(arr: number[]): number[] {
  const length = arr.length;
  for (let i = 0; i < length - 1; i++) {
    for (let j = 0; j < length - i - 1; j++) {
      if (arr[j] > arr[j + 1]) {
        const temp = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = temp;
      }
    }
  }
  return arr;
}

const array: number[] = [64, 34, 25, 12, 22, 11, 90];
console.log('Sorted Array:', bubbleSort(array));

使用ts-node直接执行 (不编译)

成绩(测5次):
[Done] exited with code=0 in 0.691 seconds
[Done] exited with code=0 in 0.686 seconds
[Done] exited with code=0 in 0.686 seconds
[Done] exited with code=0 in 0.702 seconds
[Done] exited with code=0 in 0.684 seconds

使用tsc 编译后 执行

成绩(测5次):
[Done] exited with code=0 in 0.035 seconds
[Done] exited with code=0 in 0.037 seconds
[Done] exited with code=0 in 0.034 seconds
[Done] exited with code=0 in 0.035 seconds
[Done] exited with code=0 in 0.035 seconds

通过以上2个案例可以看出,将ts编译为js之后,和原生js的性能表现几乎是一致的

六、总结
TypeScript 是 JavaScript 的超集,通过引入静态类型检查和其他新功能,使开发更加稳定、可维护和高效。虽然 TypeScript 增加了一些复杂性,并需要进行额外编译,但它为大型项目和团队合作提供了巨大的好处。

JavaScript 仍然是 Web 开发中最重要的语言之一,特别适用于小型项目或需要快速原型开发的场景。

七、JavaScript 中let和var之间的区别

7.1 作用域

var

具有函数级作用域。这意味着使用var声明的变量在整个函数内部都是可见的,无论它是在函数的开头、中间还是结尾声明。例如:

function varScopeExample() {
    if (true) {
        var varVariable = 10;
    }
    console.log(varVariable); // 10,在if语句块外也可以访问varVariable
}
varScopeExample();

let

具有块级作用域。块是指由花括号{}包围的区域,例如if语句、for循环、while循环等。使用let声明的变量只能在声明它的块及其子块中访问。例如:

function letScopeExample() {
    if (true) {
        let letVariable = 20;
    }
    console.log(letVariable); // 报错,letVariable在if语句块外不可访问
}
letScopeExample();

7.2 变量提升 (Hoisting)

var: 当你声明一个变量时,JavaScript 会将 var声明提升到当前作用域的顶部,但不会提升变量的赋值(即使是类似于var a=10,也是会先进行声明再进行赋值)。这意味着你可以先使用变量再声明它,但这可能导致一些意外的行为。

console.log(x); // 输出 undefined,这里并不会报错,说明x声明的语句已经提升到当前作用域的最顶部
var x = 5;

let: 虽然 let 也存在提升现象,但是变量会被绑定到其声明的块级作用域,而且在声明之前访问这些变量会导致一个 ReferenceError。

console.log(y); // 抛出 ReferenceError
let y = 10;

 7.3 重复声明

var 允许在同一个作用域内重复声明同一个变量。后面的声明会覆盖前面的声明。例如:

function varReDeclarationExample() {
    var repeatedVar = 50;
    var repeatedVar = 60;
    console.log(repeatedVar); // 60
}
varReDeclarationExample();

let 不允许在同一个作用域内重复声明同一个变量。这样做会导致SyntaxError。例如:

function letReDeclarationExample() {
    let nonRepeatedLet = 70;
    let nonRepeatedLet = 80;// 会抛出 SyntaxError: Identifier 'b' has already been declared
}
letReDeclarationExample();

 7.4 暂存死区(TDZ - Temporal Dead Zone)

let 存在暂存死区。从块作用域开始到let变量声明语句之间的区域是暂存死区。在这个区域内,不能访问该变量,否则会报错。例如

{
    console.log(temporalDeadZoneVariable); // 报错,处于暂存死区
    let temporalDeadZoneVariable = 90;
}

var 不存在暂存死区的概念,因为变量提升使得变量在整个函数作用域内都可以在某种程度上被提前访问(虽然未初始化时是undefined

7.5 总结

  1. 使用 let 可以避免一些常见的编程陷阱,并且提供了更清晰的作用域规则。
  2. var 是 JavaScript 最初版本的一部分,而 let 则是在 ES6 中引入的新特性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/954836.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

初学stm32 --- CAN

目录 CAN介绍 CAN总线拓扑图 CAN总线特点 CAN应用场景 CAN物理层 CAN收发器芯片介绍 CAN协议层 数据帧介绍 CAN位时序介绍 数据同步过程 硬件同步 再同步 CAN总线仲裁 STM32 CAN控制器介绍 CAN控制器模式 CAN控制器模式 CAN控制器框图 发送处理 接收处理 接收过…

Mybatis-Plus:乐观锁与悲观锁

文章目录 一、场景二、乐观锁与悲观锁三、模拟修改冲突3.1 数据库中增加商品表3.2 添加数据3.3 添加实体3.4 添加mapper3.5 测试 四、乐观锁实现流程4.1 Mybatis-Plus实现乐观锁 一、场景 一件商品&#xff0c;成本价是80元&#xff0c;售价是100元。老板先是通知小李&#xf…

MySQL 8.0在windows环境安装及配置

文章目录 一、下载二、安装三、配置环境变量 一、下载 1、先彻底卸载之前的MySQL&#xff0c;并清理其 残留文件 。 2、登录网址https://www.mysql.com/ 3、点击网址左下角“中文”按钮&#xff0c;切换到中文界面 4、点击网页上方的“下载”按钮&#xff0c;然后点击网…

Python 实现 NLP 的完整流程

&#x1f496; 欢迎来到我的博客&#xff01; 非常高兴能在这里与您相遇。在这里&#xff0c;您不仅能获得有趣的技术分享&#xff0c;还能感受到轻松愉快的氛围。无论您是编程新手&#xff0c;还是资深开发者&#xff0c;都能在这里找到属于您的知识宝藏&#xff0c;学习和成长…

redux 结合 @reduxjs/toolkit 的使用

1&#xff0c;使用步骤 使用React Toolkit 创建 counterStore&#xff08;store目录下&#xff09; --> 为React注入store&#xff08;src下面的index&#xff09; --> React组件使用store中的数据&#xff08;组件&#xff09; 2&#xff0c;例如下面有一个简单加减的…

GDC杂感:怎么提高游戏销量?

1、2018年的一个独立游戏制作人在GDC分享了其教训总结&#xff0c;得奖但销量不佳&#xff0c; 大意是&#xff1a;画面&#xff0c;辨识度的重要性&#xff0c;平庸的游戏容易扑街&#xff1b; 直播对不同类型的作用不同&#xff0c;差别能达到几十倍。 游戏品质与销量并不…

【Kotlin】上手学习之类型篇

一、类型 1.1 基本类型 主要分为 数字及其无符号版布尔字符字符串数组 1.1.1 数字 整数类型 Kotlin 提供了一组表示数字的内置类型。 对于整数&#xff0c;有四种不同大小的类型&#xff0c;因此值的范围也不同&#xff1a; 类型大小&#xff08;比特数&#xff09;最小…

迅为RK3576开发板Android 多屏显示

迅为iTOP-3576开发板采用瑞芯微RK3576高性能、低功耗的应用处理芯片&#xff0c;集成了4个Cortex-A72和4个Cortex-A53核心&#xff0c;以及独立的NEON协处理器。它适用于ARM PC、边缘计算、个人移动互联网设备及其他多媒体产品。 1.1 Android 多屏同显 iTOP-RK3576 开发板支持…

解决关于Xcode16提交审核报错

# 问题描述 The following issues occurred while distributing your application. Asset validation failed Invalid Executable. The executable xxx.app/Frameworks/HappyDNS.framework/HappyDNS contains bitcode.(lD:ef5dd249-731f-4731-8173-8e4a12519352) Asset valida…

语义检索效果差?深度学习rerank VS 统计rerank选哪个

前段时间我开发了一个用白话文搜索语义相近的古诗词的应用&#xff08;详见&#xff1a;《朋友圈装腔指南&#xff1a;如何用向量数据库把大白话变成古诗词》&#xff09;&#xff0c;但是有时候搜索结果却不让人满意&#xff0c;排名靠前的结果和查询的语义没啥关系&#xff0…

Linux 常用命令 - chmod 【改变文件或目录权限】

简介 “chmod” 这个命令来自于 “change mode” 的缩写&#xff0c;用于更改文件或目录的访问权限。这个命令允许用户设定谁可以读取、写入或执行一个文件。在 Linux 和其他类 Unix 系统中&#xff0c;文件权限对系统安全和用户隐私至关重要。 Linux/Unix 的文件调用权限分为…

基于机器学习的电信用户流失预测与数据分析可视化

完整源码项目包获取→点击文章末尾名片&#xff01; 背景描述 根据IBM商业社区分享团队描述&#xff0c;该数据集为某电信公司在加利福尼亚为7000余位用户&#xff08;个人/家庭&#xff09;提供电话和互联网服务的相关记录。描述用户基本情况&#xff0c;包括每位用户已注册的…

【Sql递归查询】Mysql、Oracle、SQL Server、PostgreSQL 实现递归查询的区别与案例(详解)

文章目录 Mysql 5.7 递归查询Mysql 8 实现递归查询Oracle递归示例SQL Server 递归查询示例PostgreSQL 递归查询示例 更多相关内容可查看 Mysql 5.7 递归查询 MySQL 5.7 本身不直接支持标准 SQL 中的递归查询语法&#xff08;如 WITH RECURSIVE 这种常见的递归查询方式&#xf…

接上篇基于Alertmanager 配置钉钉告警

Alertmanager 是一个用于处理和管理 Prometheus 警报的开源工具。它负责接收来自 Prometheus 服务器的警报&#xff0c;进行去重、分组、静默、抑制等操作&#xff0c;并通过电子邮件、PagerDuty、Slack 等多种渠道发送通知。 主要功能 去重&#xff1a;合并相同或相似的警报&…

Qt应用之MDI(多文档设计)

qt creator 版本6.8.0 MinGW 64bit 由此模块可以扩展成设计一个qt文本编辑器。 界面如下 部分功能展示如下 新建文件 打开文件 mdi模式、级联模式和平铺模式 界面和程序构建过程。 1.如图所需.cpp和.h文件 2.mainwindow.ui和tformdoc.ui界面布局如下 不懂什么是Action如何…

软件授权管理中的软件激活向导示例

软件激活向导示例 在软件许可中&#xff0c;提供许可应该是简单和安全的。这适用于想要在中央许可证服务器上创建新许可证的软件开发人员&#xff0c;也适用于需要在其设备上获得许可证的最终用户。如果所讨论的系统有互联网连接&#xff0c;或是暂时的连接&#xff0c;就可以…

GB44495-2024 汽车整车信息安全技术要求 - V2X部分前置要求

背景 GB 44495-2024《汽车整车信息安全技术要求》中关于V2X&#xff08;车与外界通信&#xff09;的部分&#xff0c;主要关注于通信安全要求&#xff0c;旨在确保车辆在与外部设备进行数据交互时的信息安全。其测试大致可分为消息层&#xff08;数据无异常&#xff09;、应用…

phpstudy靶场搭建问题

前言&#xff1a; 靶场搭建遇到的问题&#xff0c;记录一下&#xff0c;可能是基础不牢吧&#xff0c;老是遇到奇奇怪怪的问题 思路&#xff1a; 跟着网上的搭建走一遍 内容&#xff1a; 目录 搭建pikachu遇到的问题 搭建pikachu遇到的问题 其实并不是第一次搭建&#x…

【Excel】【VBA】双列排序:坐标从Y从大到小排列之后相同Y坐标的行再对X从小到大排列

Excel VBA 双列排序 功能概述 这段VBA代码实现了Excel中的双列排序功能&#xff0c;具体是&#xff1a; 跳过前3行表头先按C列数据从大到小排序在C列值相同的情况下&#xff0c;按B列从大到小排序排序时保持整行数据的完整性 流程图 #mermaid-svg-XJERemQluZlM4K8l {font-fa…

Hive SQL必刷练习题:留存率问题

首次登录算作当天新增&#xff0c;第二天也登录了算作一日留存。可以理解为&#xff0c;在10月1号登陆了。在10月2号也登陆了&#xff0c;那这个人就可以算是在1号留存 今日留存率 &#xff08;今日登录且明天也登录的用户数&#xff09; / 今日登录的总用户数 * 100% 解决思…