Spring系列文章1:Spring入门程序、集成Log4j2⽇志框架

news2024/11/29 11:51:51

一、什么是spring

一个java框架、java语言开发,轻量级、开源框架、在j2se、j2ee中都可以使用。它是一个管理对象的容器,Spring 容器不装文本,数字。装的是java对象。 

核心技术:ioc、aop

官网地址

https://spring.io

项目列表:https://spring.io/projects

二、核心模块

  1. Spring Core:Spring Core是Spring框架的核心模块,提供了IoC(Inversion of Control)容器的实现和支持。它负责创建、配置和管理应用程序中的对象,并通过依赖注入的方式解耦组件之间的依赖关系。
  2. Spring AOP:Spring AOP模块实现了面向切面编程(AOP)的支持。它允许开发者通过定义切点和切面,将横切关注点(如日志记录、性能监控等)与业务逻辑分离,从而提高代码的模块化和可维护性。
  3. Spring Web MVC:Spring Web MVC是Spring框架的Web应用程序开发模块。它提供了一种基于MVC(Model-View-Controller)的架构,用于构建灵活、可扩展的Web应用程序。开发者可以使用注解或配置文件定义控制器、视图和模型,并实现Web请求的处理和响应。
  4. Spring WebFlux:Spring WebFlux是Spring框架的响应式Web开发模块。它基于反应式编程模型,提供了一种异步、非阻塞的方式处理Web请求。开发者可以使用注解或函数式编程风格定义处理器函数,并利用响应式流处理请求和响应。
  5. Spring Web:Spring Web模块是Spring框架的Web应用程序支持模块,提供了与Servlet API和其他Web相关技术的集成。它包括与Web安全、文件上传、WebSockets等相关的功能和工具,帮助开发者构建全功能的Web应用程序。
  6. Spring DAO:Spring DAO模块提供了对数据访问对象(DAO)的支持。它简化了与数据库的交互,提供了一组抽象和实现,用于执行CRUD操作、批处理、存储过程调用等。开发者可以集成各种数据访问技术(如JDBC、Hibernate、JPA等)来实现灵活和可扩展的数据访问层。
  7. Spring ORM:Spring ORM模块用于集成和支持各种对象关系映射(ORM)框架,如Hibernate、JPA等。它提供了事务管理、异常转换和对象关系映射等功能,简化了与关系型数据库的交互。
  8. Spring Context:Spring Context是Spring框架的核心模块之一,实现了IoC容器的功能。它负责管理和组织应用程序中的各个组件,包括Bean管理、依赖注入、生命周期管理、事件机制等。Spring Context提供了一个上下文环境,使得开发者能够更方便地构建和管理应用程序。

        这些模块共同构成了Spring框架的基础架构,使得企业级Java应用程序的开发变得更加简单、灵活和可维护。开发者可以根据项目需求选择和集成相应的模块,以实现特定功能和业务逻辑。

三、spring下载

官⽹地址:https://spring.io/

官⽹地址(中⽂):http://spring.p2hp.com/

打开Spring官⽹后,可以看到Spring Framework,以及通过Spring Framework衍⽣的其它框架: 

 进⼊github

找到下图位置,点击超链接

 继续在springframework⽬录下找下图的spring,点开之后你会看到很多不同的版本

选择对应的版本

点击上图的url 

 点击spring-5.3.9-dist.zip下载spring框架。

将下载的zip包解压:

docs:spring框架的API帮助⽂档

libs:spring框架的jar⽂件(⽤spring框架就是⽤这些jar包)

schema:spring框架的XML配置⽂件相关的约束⽂件

四、spring jar文件

打开libs⽬录,会看到很多jar包:

spring-core-5.3.9.jar:字节码(这个是⽀撑程序运⾏的jar包)

spring-core-5.3.9-javadoc.jar:代码中的注释

spring-core-5.3.9-sources.jar:源码

所有jar文件如下

JAR⽂件

描述

spring-aop-5.3.9.jar

这个jar⽂件包含在应⽤中使⽤Spring的AOP特性时所需的类

spring-aspects-5.3.9.jar

提供对AspectJ的⽀持,以便可以⽅便的将⾯向切⾯的功能集成进IDE中

spring-beans-5.3.9.jar

这个jar⽂件是所有应⽤都要⽤到的,它包含访问配置⽂件、创建和管理bean以及进⾏InversionofControl / Dependency Injection(IoC/DI)操作相关的所有类。如果应⽤只需基本的IoC/DI

⽀持,引⼊spring-core.jar及spring-beans.jar

⽂件就可以了。

spring-context-5.3.9.jar

这个jar ⽂件为Spring 核⼼提供了⼤量扩展。可以找到使⽤SpringApplicationContext特性时所需的全部类,JDNI所需的全部类,instrumentation组件以及校验Validation⽅⾯的相关类。

spring-context-indexer-5.3.9.jar

虽然类路径扫描⾮常快,但是Spring内部存在⼤量的类,添加此依赖,可以通过在编译时创建候选对象的静态列表来提⾼⼤型应⽤程序的启动性能。

spring-context-support-5.3.9.jar

⽤来提供Spring上下⽂的⼀些扩展模块,例如实现邮件服务、视图解析、缓存、定时任务调度等

spring-core-5.3.9.jar

Spring框架基本的核⼼⼯具类。Spring其它组件要都要使⽤到这个包⾥的类,是其它组件的基本核⼼,当然你也可以在⾃⼰的应⽤系统中使⽤这些⼯具类。

spring-expression-5.3.9.jar

Spring表达式语⾔。

spring-instrument-5.3.9.jar

Spring3.0对服务器的代理接⼝。

spring-jcl-5.3.9.jar

Spring的⽇志模块。JCL,全称为"JakartaCommonsLogging",也可称为"ApacheCommonsLogging"。

spring-jdbc-5.3.9.jar

Spring对JDBC的⽀持。

spring-jms-5.3.9.jar

这个jar包提供了对JMS1.0.2/1.1的⽀持类。JMS是Java消息服务。属于JavaEE规范之⼀。

spring-messaging-5.3.9.jar

为集成messagingapi和消息协议提供⽀持

spring-orm-5.3.9.jar

Spring集成ORM框架的⽀持,⽐如集成hibernate,mybatis等。

spring-oxm-5.3.9.jar

为主流O/XMapping组件提供了统⼀层抽象和封装,OXM是ObjectXmlMapping。对象和XML之间的相互转换。

spring-r2dbc-5.3.9.jar

ReactiveRelationalDatabaseConnectivity (关系型数据库的响应式连接) 的缩写。这个jar⽂件是Spring对r2dbc的⽀持。

spring-test-5.3.9.jar

对Junit等测试框架的简单封装。

spring-tx-5.3.9.jar

为JDBC、Hibernate、JDO、JPA、Beans等提供的⼀致的声明式和编程式事务管理⽀持。

spring-web-5.3.9.jar

Spring集成MVC框架的⽀持,⽐如集成Struts

等。

spring-webflux-5.3.9.jar

WebFlux是 Spring5添加的新模块,⽤于 web的开发,功能和 SpringMVC类似的,Webflux使⽤当前⼀种⽐较流程响应式编程出现的框架。

spring-webmvc-5.3.9.jar

SpringMVC框架的类库

spring-websocket-5.3.9.jar

Spring集成WebSocket框架时使⽤

注意:

如果你只是想⽤Spring的IoC功能,仅需要引⼊:spring-context即可。将这个jar包添加到classpath当中。

<!--Spring6的正式版发布之前,这个仓库地址是需要的-->
<repositories>
    <repository>
        <id>repository.spring.milestone</id>
        <name>Spring Milestone Repository</name>
        <url>https://repo.spring.io/milestone</url>
    </repository>
</repositories>

<dependencies>
<!--spring context依赖:使⽤的是6.0.0-M2⾥程碑版-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>6.0.0-M2</version>
    </dependency>
</dependencies>

如果采⽤maven只需要引⼊context的依赖即可。

五、第⼀个Spring程序

打开IDEA创建Empty Project:spring6

设置JDK版本17,编译器版本17

 设置IDEA的Maven:关联⾃⼰的maven

在空的⼯程spring6中创建第⼀个模块:spring6-001-first

添加spring context的依赖,pom.xml配置如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://mave
n.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.powernode</groupId>
    <artifactId>spring6-001-first</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <repositories>
        <repository>
            <id>repository.spring.milestone</id>
            <name>Spring Milestone Repository</name>
            <url>https://repo.spring.io/milestone</url>
        </repository>
    </repositories>
    <dependencies>
        <!--spring context依赖-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>6.0.0-M2</version>
        </dependency>
    </dependencies>
    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>
</project>

 注意:打包⽅式jar。

当加⼊spring context的依赖之后,会关联引⼊其他依赖:

spring aop:⾯向切⾯编程

spring beans:IoC核⼼

spring core:spring的核⼼⼯具包

spring jcl:spring的⽇志包

spring expression:spring表达式

添加junit依赖

<!--junit-->
 <dependency>
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
     <version>4.13.2</version>
     <scope>test</scope>
 </dependency>

定义bean:User

public class User {
}

 编写spring的配置⽂件:beans.xml。该⽂件放在类的根路径下。

配置⽂件中进⾏bean的配置。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beans htt
p://www.springframework.org/schema/beans/spring-beans.xsd">
 
 <bean id="userBean" class="com.powernode.spring6.bean.User"/>
</beans>

 bean的id和class属性:

id属性:代表对象的唯⼀标识。可以看做⼀个⼈的身份证号。

class属性:⽤来指定要创建的java对象的类名,这个类名必须是全限定类名(带包名)。

测试

public class Spring6Test {
    @Test
    public void testFirst() {
        // 初始化Spring容器上下⽂(解析beans.xml⽂件,创建所有的bean对象)
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
        // 根据id获取bean对象
        Object userBean = applicationContext.getBean("userBean");
        System.out.println(userBean);
    }
}

第一个程序剖析

1、bean标签的id属性可以重复吗?

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="userBean" class="com.ssmtest.entity.User"/>
    <bean id="userBean" class="com.ssmtest.entity.Person"/>
</beans>

 

通过测试得出:在spring的配置⽂件中id是不能重名。 

2、底层是怎么创建对象的,是通过反射机制调⽤⽆参数构造⽅法吗?

public class User {
    public User(){
        System.out.println("无参构造被调用");
    }
}

通过测试得知:创建对象时确实调⽤了⽆参数构造⽅法。 如果提供⼀个有参数构造⽅法,不提供⽆参数构造⽅法会怎样呢?

 

通过测试得知:spring是通过调⽤类的⽆参数构造⽅法来创建对象的,所以要想让spring给你创建对 象,必须保证⽆参数构造⽅法是存在的。

Spring是如何创建对象的呢?原理是什么? 

// dom4j解析beans.xml⽂件,从中获取class的全限定类名
// 通过反射机制调⽤⽆参数构造⽅法创建对象
Class clazz = Class.forName("com.powernode.spring6.bean.User");
Object obj = clazz.newInstance();

3、把创建好的对象存储到⼀个什么样的数据结构当中了呢? 

4、spring配置⽂件的名字必须叫做beans.xml吗? 

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");

通过以上的java代码可以看出,这个spring配置⽂件名字是我们负责提供的,显然spring配置⽂件的名字 是随意的。

5、像这样的beans.xml⽂件可以有多个吗?

再创建⼀个spring配置⽂件,起名:spring.xm

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml","spring.xml");

通过测试得知,spring的配置⽂件可以有多个,在ClassPathXmlApplicationContext构造⽅法的参数上 传递⽂件路径即可。这是为什么呢?通过源码可以看到参数可以多个

    public ClassPathXmlApplicationContext(String... configLocations) throws BeansException {
        this(configLocations, true, (ApplicationContext)null);
    }

 6、在配置⽂件中配置的类必须是⾃定义的吗,可以使⽤JDK中的类吗,例如:java.util.Date?

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="myDate" class="java.util.Date"/>
</beans>

测试 

public class Spring6Test {
    @Test
    public void testFirst() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
        Object object = applicationContext.getBean("myDate");
        System.out.println(object);//Tue Sep 05 15:06:41 CST 2023
    }
}

 通过测试得知,在spring配置⽂件中配置的bean可以任意类,只要这个类不是抽象的,并且提供了⽆参 数构造⽅法。

7、getBean()⽅法调⽤时,如果指定的id不存在会怎样?

提示错误:org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'testBean' available

8、 getBean()⽅法返回的类型是Object,如果访问⼦类的特有属性和⽅法时,还需要向下转型,有其它 办法可以解决这个问题吗?

User user = applicationContext.getBean("userBean", User.class);

9、ClassPathXmlApplicationContext是从类路径中加载配置⽂件,如果没有在类路径当中,⼜应该如 何加载配置⽂件呢? 

public class Spring6Test {
    @Test
    public void testFirst() {
        ApplicationContext applicationContext2 = new FileSystemXmlApplicationContext("d:/spring6.xml");
        User vip = applicationContext2.getBean("userBean", User.class);
        System.out.println(vip);
    }
}

六、集成Log4j2⽇志框架

从Spring5之后,Spring框架⽀持集成的⽇志框架是Log4j2.如何启⽤⽇志框架: 第⼀步:引⼊Log4j2的依赖

<!--log4j2的依赖-->
<dependency>
 <groupId>org.apache.logging.log4j</groupId>
 <artifactId>log4j-core</artifactId>
 <version>2.19.0</version>
</dependency>
<dependency>
 <groupId>org.apache.logging.log4j</groupId>
 <artifactId>log4j-slf4j2-impl</artifactId>
 <version>2.19.0</version>
</dependency>

第⼆步:在类的根路径下提供log4j2.xml配置⽂件(⽂件名固定为:log4j2.xml,⽂件必须放到类根路径 下。)

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
 <loggers>
 <!--
 level指定⽇志级别,从低到⾼的优先级:
 ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
 -->
 <root level="DEBUG">
 <appender-ref ref="spring6log"/>
 </root>
 </loggers>
 <appenders>
 <!--输出⽇志信息到控制台-->
 <console name="spring6log" target="SYSTEM_OUT">
 <!--控制⽇志输出的格式-->
 <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss SSS} [%t] %-3le
vel %logger{1024} - %msg%n"/>
 </console>
 </appenders>
</configuration>

第三步:使⽤⽇志框架

Logger logger = LoggerFactory.getLogger(FirstSpringTest.class);
logger.info("我是⼀条⽇志消息");

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

山东理工,青岛理工傻傻分不清楚?进来对比考情

山东理工大学 考研难度&#xff08;☆☆&#xff09; 内容&#xff1a;23考情概况&#xff08;拟录取和复试分析&#xff09;、院校概况、23专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文991字&#xff0c;预计阅读&#xff1a;3分钟 2023考情概况 山东理工…

【代码实现】DETR原文解读及代码实现细节

1 模型总览 宏观上来说&#xff0c;DETR主要包含三部分&#xff1a;以卷积神经网络为主的骨干网&#xff08;CNN Backbone&#xff09;、以TRM(Transformer)为主的特征抽取及交互器以及以FFN为主的分类和回归头&#xff0c;如DETR中build()函数所示。DETR最出彩的地方在于&…

看了字节跳动月薪25K+测试岗面试题,让我这个工作2年的测试工程师,直冒冷汗....

朋友入职字节已经两周了&#xff0c;整体工作环境还是非常满意的&#xff01;所以这次特意抽空给我整理了这份面试宝典&#xff0c;而我把它分享给伙伴们&#xff0c;面试&入职的经验&#xff01; 大概是在8月中的时候他告诉我投递了字节跳动并且简历已通过&#xff0c;8月…

JavaScript - 一个好玩的打字动画

效果预览&#xff1a; <!DOCTYPE html> <html> <head><title>打字动画示例</title><style>.typewriter {color: #000;overflow: hidden; /* 隐藏溢出的文本 */white-space: nowrap; /* 不换行 */border-right: .15em solid #000; /* 添加…

IDEA中debug调试模拟时显示不全(不显示null)的解决

IDEA中debug调试模拟时显示不全&#xff08;不显示null&#xff09;的解决 1、在IDEA中找到File&#xff08;文件&#xff09;->Settings&#xff08;设置&#xff09; 2、依次找到以下内容进行设置&#xff08;原版、汉化版&#xff09;&#xff1a; 打开Build, Executio…

STL常用容器 (C++核心基础教程之STL容器详解)String的API

在C的标准模板库&#xff08;STL&#xff09;中&#xff0c;有多种容器可供使用。以下是一些常见的容器类型&#xff1a; 序列容器&#xff08;Sequential Containers&#xff09;&#xff1a; std::vector&#xff1a;动态数组&#xff0c;支持快速随机访问。 std::list&…

LLM大模型推理加速 vLLM;Qwen vLLM使用案例

参考&#xff1a; https://github.com/vllm-project/vllm https://zhuanlan.zhihu.com/p/645732302 https://vllm.readthedocs.io/en/latest/getting_started/quickstart.html ##文档 1、vLLM 这里使用的cuda版本是11.4&#xff0c;tesla T4卡 加速原理&#xff1a; Paged…

项目招标投标公众号小程序开源版开发

项目招标投标公众号小程序开源版开发 以下是一个招标投标公众号小程序的功能列表&#xff1a; 用户注册与登录&#xff1a;用户可以注册账号并登录公众号小程序。项目发布&#xff1a;用户可以发布招标项目的详细信息&#xff0c;包括项目名称、招标单位、项目描述、招标要求…

巨人互动|游戏出海H5游戏出海规模如何?

H5游戏出海是指将H5游戏推广和运营扩展到国外市场的行为&#xff0c;它的规模受到多个因素的影响。本文小编讲一些关于H5游戏出海规模的详细介绍。 1、市场规模 H5游戏出海的规模首先取决于目标市场的规模。不同国家和地区的游戏市场规模差异很大&#xff0c;有些市场庞大而成…

error:03000086:digital envelope routines::initialization error

项目背景 前端vue项目启动突然报错error:03000086:digital envelope routines::initialization error 我用的开发工具是vscode&#xff0c;node版本是v18.17.0 前端项目版本如下↓ 具体报错如下↓ 报错原因 node版本过高 解决方法 1输入命令 $env:NODE_OPTIONS"--op…

cron介绍

cron表达式在线生成 在使用定时调度任务的时候&#xff0c;我们最常用的&#xff0c;就是cron表达式了。通过cron表达式来指定任务在某个时间点或者周期性的执行。 cron表达式的组成 cron表达式是一个字符串&#xff0c;由6到7个字段组成&#xff0c;用空格分隔。其中前6个字…

融云观察:国内外社交应用差异分析,如何更快补齐功能和切换交互?

9 月 21 日&#xff0c;融云直播课 社交泛娱乐出海最短变现路径如何快速实现一款 1V1 视频社交应用&#xff1f; 欢迎点击上方小程序报名~ 本文中&#xff0c;我们将通过对 WhatsApp、微信、Telegram、Discord 几大社交软件的主要功能和交互体验对比&#xff0c;解析社交软件…

【AIGC专题】Stable Diffusion 从入门到企业级应用0414

一、前言 本文是《Stable Diffusion 从入门到企业级应用实战》系列的第四部分能力进阶篇《Stable Diffusion ControlNet v1.1 图像精准控制》的第0414篇 利用Stable Diffusion ControlNet 法线贴图模型精准控制图像生成。本部分内容&#xff0c;位于整个Stable Diffusion生态体…

融云出海:社交泛娱乐出海,「从 0 到 1」最全攻略

9 月 21 日&#xff0c;融云直播课社交泛娱乐出海最短变现路径如何快速实现一款 1V1 视频社交应用&#xff1f; 欢迎点击上方小程序报名~ 本期我们翻到《地图》的实践篇&#xff0c;从赛道/品类选择、目标地区适配、用户增长、变现模式、本地化运营、跨国团队管理等方面完整描绘…

大健云仓:股价正在艰难反弹,被严重低估了

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 业务和基本面 大健云仓&#xff08;GCT)是一家从事大型家居、家用电器、健身器材和园艺等国际大件商品出口的B2B交易平台&#xff0c;是全球领先的国际贸易数字化服务商。依靠国际化商业架构&#xff0c;自有全球化物流仓储…

Ubuntu20.04同时安装ROS1和ROS2

Ubuntu20.04同时安装ROS1和ROS2 Excerpt 每版的Ubuntu系统版本都有与之对应ROS版本的&#xff0c;每一版ROS都有其对应版本的Ubuntu版本&#xff0c;不可随便装&#xff0c;ubuntu20.04对应ROS1 noetic和ROS2 foxy版本。_ros1和ros2共存 Ubuntu20.04同时安装ROS1和ROS2共存 文…

MES管理系统对电子企业来说有什么优点

引言&#xff1a;在电子制造企业中&#xff0c;MES管理系统已经成为提高生产效率、降低成本、提高订单履行速度和准确性的重要工具。电子企业MES管理系统是一套集成的信息系统&#xff0c;用于监控和控制电子企业的生产过程。本文将探讨MES管理系统对于电子企业来说有哪些优点。…

多线程场景下谨慎使用@Transactional注解,你不信我也没办法

最近遇到一个很诡异的bug&#xff0c;觉得很有趣也很值得分享&#xff0c;于是想写篇文章记录下来&#xff0c;希望有缘人看到以后少踩坑~ 先简单说下场景&#xff1a;有个任务平台&#xff0c;功能很多但我们只关注 提交任务和取消任务 两个功能&#xff0c;并且取消任务后会有…

全民拼购模式:美妆行业的新机遇和挑战

美妆是一个充满创意和变化的行业&#xff0c;每个人都想拥有自己独特的美丽风格。但是&#xff0c;美妆产品的价格和品质却不尽相同&#xff0c;很多消费者在购买时会遇到困惑和不满。有没有一种方法&#xff0c;可以让消费者以更低的价格买到更好的美妆产品&#xff0c;同时还…

八个针对高级职位的高级 JavaScript 面试题

JavaScript 是一种功能强大的语言&#xff0c;是网络的主要构建块之一。这种强大的语言也有一些怪癖。例如&#xff0c;您是否知道 0 -0 的计算结果为 true&#xff0c;或者 Number("") 的结果为 0&#xff1f; 问题是&#xff0c;有时这些怪癖会让你摸不着头脑&…