JavaScript基础二、变量

news2024/11/24 19:13:12

零、文章目录

文章地址

  • 个人博客-CSDN地址:https://blog.csdn.net/liyou123456789
  • 个人博客-GiteePages:https://bluecusliyou.gitee.io/techlearn

代码仓库地址

  • Gitee:https://gitee.com/bluecusliyou/TechLearn
  • Github:https://github.com/bluecusliyou/TechLearn

JavaScript基础二、变量

1、变量概念和作用

(1)字面量

  • 在计算机科学中,字面量(literal)是在计算机中描述 事/物,比如:
    • 我们工资是1000,1000是数字字面量
    • '前端学习’是字符串字面量
  • 还有接下来我们学的 [] 数组字面量 {} 对象字面量 等等

(2)变量

  • 白话:变量就是一个装东西的盒子。
  • 通俗:变量是计算机中用来存储数据的“容器”,它可以让计算机变得有记忆。
  • 注意:变量不是数据本身,它们仅仅是一个用于存储数值的容器。可以理解为是一个个用来装东西的纸箱子。

image-20230226151107621

2、变量基本使用

(1)声明变量

  • 要想使用变量,首先需要创建变量(也称为声明变量或者定义变量)
  • 语法:let 变量名
    • 声明变量有两部分构成:声明关键字、变量名(标识符)
    • let 即声明关键字,所谓关键字是在JavaScript中有特殊意义的词汇,比如let、var、function、if、else、switch、case、break等,还有一个是保留字,目前在JavaScript中没意义,但未来可能会具有特殊意义的词汇,比如int、short、long、char等。
  • 举例:let age
    • 我们声明了一个age变量
    • age 即变量的名称,也叫标识符

(2) 变量赋值

  • 定义了一个变量后,你就能够初始化它(赋值)。在变量名之后跟上一个“=”,然后是数值。

  • 注意:是通过变量名来获得变量里面的数据

  • 简单点,也可以声明变量的时候直接完成赋值操作,这种操作也称为变量初始化

image-20230226152131670

案例如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>变量的使用</title>
</head>

<body>
    <script>
        // 1. 声明一个年龄变量
        let age
        // 2. 赋值
        age = 18
        console.log(age)
        // 3. 声明的同时直接赋值  变量的初始化
        let age2 = 18

        // 小案例
        let num = 20
        let uname = 'pink老师'
        console.log(num)
        console.log(uname)
    </script>
</body>

</html>

(3)更新变量

  • 变量赋值后,还可以通过简单地给它一个不同的值来更新它。
  • 注意: let 不允许多次声明一个变量

image-20230226152356885

案例如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>变量的使用更新</title>
</head>

<body>
    <script>
        // 1 声明的同时直接赋值  变量的初始化
        // let age = 18
        // age = 19
        // // let age = 19
        // console.log(age)
        // 2. 声明多个变量    
        // let age = 18, uname = '迪丽热巴'
        // console.log(age, uname)
    </script>
</body>

</html>

(4)声明多个变量

  • **语法:**多个变量中间用逗号隔开。let age=18,uname='pink'

  • **说明:**看上去代码长度更短,但并不推荐这样。为了更好的可读性,请一行只声明一个变量。

image-20230226152640614

(5)输入用户名案例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>输入用户名案例</title>
</head>

<body>
    <script>
        // 输出用户名案例
        // 1. 用户输入
        // prompt('请输入姓名')
        // 2. 内部处理保存数据
        let uname = prompt('请输入姓名')
        // 3. 打印输出
        document.write(uname)
    </script>
</body>

</html>

image-20230226153352575

image-20230226153405184

(6)交换变量的值案例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>交换变量的值案例</title>
</head>

<body>
    <script>
        // let if = 10
        let num1 = 'pink老师'
        let num2 = '戚薇'
        let temp
            // 都是把右边给左边
        temp = num1
        num1 = num2
        num2 = temp
        console.log(num1, num2)
    </script>
</body>

</html>

3、变量的本质

  • **内存:**计算机中存储数据的地方,相当于一个空间
  • **变量本质:**是程序在内存中申请的一块用来存放数据的小空间

image-20230226153855331

4、变量命名规则与规范

  • **规则:**必须遵守,不遵守报错 (法律层面)

    • 不能用关键字
    • 关键字:有特殊含义的字符,JavaScript 内置的一些英语词汇。例如:let、var、if、for等
    • 只能用下划线、字母、数字、$组成,且数字不能开头
    • 字母严格区分大小写,如 Age 和 age 是不同的变量
  • **规范:**建议,不遵守不会报错,但不符合业内通识 (道德层面)

    • 起名要有意义

    • 遵守小驼峰命名法:第一个单词首字母小写,后面每个单词首字母大写。例:userName

image-20230226154056192

案例如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>变量的命名规范</title>
</head>

<body>
    <script>
        // let if = 10
        let num1$_ = 11
            // let nav-bar = 11
            // let 1num = 10
        //严格区分大小写
        let pink = '老师'
        let Pink = '演员'
        console.log(pink, Pink)
    </script>
</body>

</html>

5、let和var的区别

  • var 在现代开发中一般不再使用它,只是我们可能在老版程序中看到它。
  • let 是为了解决 var 的一些问题而出现的,以后声明变量我们统一使用 let。
  • var 声明的一些问题
    • 可以先使用再声明 (不合理)
    • var 声明过的变量可以重复声明(不合理)

案例如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>let和var的区别</title>
</head>

<body>
    <script>
        // var可以重复声明,后面声明的覆盖前面的
        var num1
        var num1 = 10
        var num1= 20
        console.log(num1)
        
        // let不能重复声明,直接编译不通过
        // let num
        // let num = 20
        // let num = 10
        // console.log(num)
    </script>
</body>

</html>

6、strict模式

  • JavaScript在设计之初,并不强制要求申明变量,如果一个变量没有申明就被使用,那么该变量就自动被声明为全局变量
  • 在同一个页面的不同的JavaScript文件中,如果都不声明,将造成变量污染。
  • ECMA在后续规范中推出了strict模式,在strict模式下运行的JavaScript代码,强制要求申明变量,否则报错。启用strict模式的方法是在JavaScript代码的第一行写上:
'use strict';
  • 这是一个字符串,不支持strict模式的浏览器会把它当做一个字符串语句执行,支持strict模式的浏览器将开启strict模式运行JavaScript。如果浏览器不报错,说明你的浏览器太古老了,需要尽快升级。
'use strict';
// 如果浏览器支持strict模式,下面的代码将报ReferenceError错误:
abc = 'Hello, world';
console.log(abc);

7、常量

  • **概念:**使用 const 声明的变量称为“常量”。
  • **使用场景:**当某个变量永远不会改变的时候,就可以使用 const 来声明,而不是let。
  • **命名规范:**和变量一致
  • 注意: 常量不允许重新赋值,声明的时候必须赋值(初始化)

案例如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>常量</title>
</head>

<body>
    <script>
        // 1.声明常量,使用常量 
        const PI = 3.14
        console.log(PI)
        //不允许更改值
        //PI = 3.15
        // 2. 常量声明的时候必须赋值
        //const G
    </script>
</body>

</html>

8、运算符

(1)赋值运算符

  • 赋值运算符:对变量进行赋值的运算符
    • 变量=值 :将等号右边的值赋予给左边
    • 变量+=值:等价于 变量=变量+值
    • 变量-=值:等价于 变量=变量-值
    • 变量*=值:等价于 变量=变量*值
    • 变量/=值:等价于 变量=变量/值
    • 变量%=值:等价于 变量=变量%值

案例如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>赋值运算符</title>
</head>

<body>
    <script>
        let num = 1
        // 采取赋值运算符
        // num = num + 1
        num += 1
        console.log(num)
    </script>
</body>

</html>

(2)一元运算符

  • JavaScript 的运算符可以根据所需表达式的个数,分为一元运算符、二元运算符、三元运算符

    • 二元运算符:let num=10+20
    • 一元运算符:let num=+10
  • 自增自减

    • 自增:++,让变量的值 +1

    • 自减:-- ,让变量的值 -1

    • 使用场景:经常用于计数来使用。

  • 自增

    • 前置自增++num,每执行1次,当前变量数值加1,作用相当于 num += 1

    • **后置自增num++,**每执行1次,当前变量数值加1,作用相当于 num += 1

    • 前置自增和后置自增单独运算没有区别,一般开发中都是独立使用后置自增

  • 后置自增后置自增计算顺序:

    • 前置自增:先自加再使用(记忆口诀:++在前 先加)

    image-20230228160424315

    • 后置自增:先使用再自加(记忆口诀:++在后 后加)

image-20230228160440863

案例如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>一元运算符</title>
</head>

<body>
    <script>
        // 1. 前置自增
        let num1 = 1
        ++num1
        console.log(num1) //2

        // 2. 后置自增
        let num2 = 1
        num2++
        console.log(num2) //2

        //3. 自增参与计算
        let num3 = 1
        console.log(++num3 + 1) //3
        let num4 = 1
        console.log(num4++ + 1) //2

        //4. 自增复杂计算
        let i = 1
        console.log(i++ + ++i + i) //7
    </script>
</body>

</html>

(3)比较运算符

  • 使用场景:比较两个数据大小、是否相等

  • 比较运算符:

    • >: 左边是否大于右边

    • <: 左边是否小于右边

    • >=: 左边是否大于或等于右边

    • <=: 左边是否小于或等于右边

    • ==: 左右两边值是否相等

    • ===: 左右两边是否类型和值都相等

    • !==: 左右两边是否不全等

    • 比较结果为boolean类型,即只会得到 true 或 false

  • 等号说明:

    • = 单等是赋值

    • == 是判断

    • === 是全等

    • 开发中判断是否相等,强烈推荐使用 ===

  • 字符串比较:比较的字符对应的ASCII

    • 从左往右依次比较
    • 如果第一位一样再比较第二位,以此类推
  • 数字比较

    • NaN不等于任何值,包括它本身,涉及到NaN都是false
    • 尽量不要比较小数,因为小数有精度问题
  • 比较的隐式转换

    • 最终把数据隐式转换转成number类型再比较
    • 如果进行准确的比较我们更喜欢 \=== 或者 \!==

案例如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>比较运算符</title>
</head>

<body>
    <script>
        // 数字比较
        console.log(3 > 5) //false
        console.log(3 >= 3) //true
        console.log(2 == 2) //true
        // 比较运算符有隐式转换 
        // 把'2' 转换为 2 双等号只判断值
        console.log(2 == '2') // true  
        console.log(2 != '2') // false    
        // === 全等判断值和数据类型都一样才行
        // 以后判断是否相等 请用 ===  
        console.log(2 === '2') // false
        console.log(2 !== '2') // true  
        // NaN 不等于任何人,包括他自己
        console.log(NaN === NaN) // false
        
        //字符串比较
        console.log('a' < 'b') // true
        console.log('aa' < 'ab') // true
        console.log('aa' < 'aac') // true
    </script>
</body>

</html>

(4)逻辑运算符

  • **使用场景:**逻辑运算符用来解决多重条件判断。

  • 举例:想判断一个变量 num 是否大于5且小于10

    • 错误写法: 5 < num < 10
    • 正确写法: num > 5 && num < 10
  • 逻辑运算符:

image-20230228171412512

案例如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>逻辑运算符</title>
</head>

<body>
    <script>
        // 逻辑与 一假则假
        console.log(true && true) //true
        console.log(false && true) //false
        console.log(3 < 5 && 3 > 2) //true
        console.log(3 < 5 && 3 < 2) //false
        // 逻辑或 一真则真
        console.log(true || true)//true
        console.log(false || true)//true
        console.log(false || false)//false
        // 逻辑非  取反
        console.log(!true)//false
        console.log(!false)//true

        //数字比较逻辑判断
        let num = 6
        console.log(num > 5 && num < 10)//true
    </script>
</body>

</html>

(5)逻辑中断

  • 短路:只存在于 && 和 || 中,当满足一定条件会让右边代码不执行

image-20230301160118820

  • 原因:通过左边能得到整个式子的结果,因此没必要再判断右边
  • 运算结果:无论 && 还是 || ,运算结果都是最后被执行的表达式值,一般用在变量赋值
  • 隐式转换:逻辑运算时,‘’'、0、undefined、null、false、NaN 会隐士转换为false, 其余则为 true

案例如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>逻辑中断</title>
</head>

<body>
    <script>
        // 左边能得到结果,不需要计算右边
        let age = 18
        console.log(false && age++) // age++ 不执行一假则假
        console.log(age) //18

        // 左边无法得到结果,需要计算右边
        console.log(false || age++)
        console.log(age) //19

        // 输出最后计算的表达式
        // console.log(11 && 22)  // 22 输出最后一个表达式
        // console.log(11 || 22)  // 11 输出第一个表达式

        //'''、0、undefined、null、false、NaN 转换为布尔值后都是false, 其余则为 true
        console.log('' || 20) //20
        console.log(0 || 20) //20
        console.log(undefined || 20) //20
        console.log(null || 20) //20
        console.log(false || 20) //20
        console.log(NaN || 20) // 20
    </script>
</body>

</html>

(6)运算符优先级

  • 逻辑非>逻辑与>逻辑或

image-20230228180953305

9、常见错误

(1)常量必须要赋值

image-20230228145740129

(2)常量被重新赋值

image-20230228150233919

image-20230228150257371

(3)变量未定义

image-20230228145842359

image-20230228150114330

分析:

  • 提示 age变量没有定义过。
  • 很可能 age 变量没有声明和赋值。
  • 或者我们输出变量名和声明的变量不一致引起的(简单说写错变量名了)。

(4)重复声明变量

image-20230228150028153

image-20230228150042861

分析:

  • 提示 “age”已经声明。
  • 很大概率是因为重复声明了一个变量。
  • 注意let 或者const 不允许多次声明同一个变量。

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

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

相关文章

UE4 材质学习 (焚烧材质)

效果步骤随便从网上下载一张图片&#xff08;地址&#xff1a;链接/链接&#xff09;&#xff0c;导入UE中新建一个材质函数这里命名为“E_Function”双击打开该材质函数&#xff0c;由于需要输出变发光和变透明两种效果&#xff0c;因此这里需要两个输出节点&#xff1a;分别命…

MIPI协议

MIPI调试指南Rev.0.1 June 18, 2019 © 2018 Horizon Robotics. All rights reserved.Revision HistoryThissection tracks the significant documentation changes that occur fromrelease-to-release. The following table lists the technical content changes foreach …

RK3568平台开发系列讲解(显示篇)framebuffer屏幕显示

🚀返回专栏总目录 文章目录 一、FrameBuffer介绍二、FrameBuffer应用程序沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍如何通过framebuffer进行显示。 一、FrameBuffer介绍 FrameBuffer中文译名为帧缓冲驱动,它是出现在2.2.xx内核中的一种驱动程序接口…

飞沃科技上市,张友君还缺颗“螺丝”

文丨熔财经作者|余一去年7月&#xff0c;湖南飞沃新能源科技股份有限公司(下称&#xff1a;飞沃科技)首发过会&#xff0c;至今7个多过去了&#xff0c;若是按照2022年以来整体IPO排队时长来计算&#xff0c;飞沃科技已经来到了临近上市的关键节点。资料显示&#xff0c;近年来…

测开:前端基础-css页面布局-定位

一 、传统网页布局的三种方式 网页布局的本质–用CSS来摆放盒子&#xff0c;把盒子摆放到相应的位置&#xff0c;css提供了三种传统布局方式&#xff0c;分别是标准流&#xff0c;浮动和定位三种。 二、 定位 2.1 啥是定位 我的理解&#xff0c;就是要把这个元素&#xff0c…

一文掌握组织项目等级划分维度,标准和实例

当你遇到多项目怎么管&#xff1f;遇到项目之间的冲突怎么解决&#xff1f;很多公司没有项目优先级的划分&#xff0c;会对企业造成很多严重的问题。首先&#xff0c;会造成不合理的资源分配&#xff1a;缺少项目优先级的情况下&#xff0c;很难确定哪些项目是最重要的&#xf…

DAGA项目 代码阅读笔记1——LSTM-LM部分代码

DAGA 代码阅读笔记1——LSTM-LM部分代码 文章目录DAGA 代码阅读笔记1——LSTM-LM部分代码概述main函数逻辑分析设置训练参数fields初始化训练数据读入模型建立优化器概述 ​ 学习人工智能的必经之路——读代码。目前阅读的代码来自于github数据增强项目DAGA&#xff0c;这个项…

socket 编程实战(编写客户端程序 )

编写客户端程序 接着上一篇&#xff1a;实战服务端程序 接下来我们再编写一个简单地客户端应用程序&#xff0c;客户端的功能是连接上小节所实现的服务器&#xff0c;连接成功之后向服务器发送数据&#xff0c;发送的数据由用户输入。示例代码如下所示&#xff1a; #include…

大数据开发治理平台 DataWorks

序言学习下阿里DataWorks的设计理念以及要做的事情cuiyaonan2000163.com参考文档:https://www.aliyun.com/product/bigdata/idehttps://help.aliyun.com/document_detail/73015.htmlhttps://help.aliyun.com/document_detail/324149.html ----数据治理LaunchDataWorks基于阿里云…

ECCV 2022|面向精确的主动相机定位算法

标题&#xff1a;ECCV 2022,山东大学、北大、腾讯AILab、斯坦福和三维家联合提出&#xff0c;面向精确的主动相机定位算法项目地址&#xff1a;https://github.com/qhFang/AccurateACL.文章&#xff1a;Towards Accurate Active Camera Localization&#xff08;ECCV 2022&…

oneblog_justauth_三方登录配置【Gitee】

文章目录oneblog添加第三方平台gitee中创建三方应用完善信息oneblog添加第三方平台 1.oneblog管理端&#xff0c;点击左侧菜单 网站管理——>社会化登录配置管理 ,添加一个社会化登录 2.编辑信息如下&#xff0c;选择gitee平台后复制redirectUri,然后去gitee获取clientId和…

vulnhub five86-2

总结&#xff1a;sudo -l&#xff0c;抓流量包&#xff0c;搜索引擎。。 目录 下载地址 漏洞分析 信息收集 网站渗透 ​编辑 反弹shell提权 下载地址 Five86-2.zip (Size: 1.7 GB)Download (Mirror): https://download.vulnhub.com/five86/Five86-2.zip使用&#xff1a;下…

电子台账:模板制作之一——列过滤(水平过滤)

1 简介列过滤即水平过滤。一般情况下&#xff0c;企业数据源文件中有很多数据列&#xff0c;其中大部分数据列中的数据对电子台账来说是没有用的。列过滤就是确定企业数据文件的哪几列有用&#xff0c;以及有用的列分别对应到台账&#xff08;模板&#xff09;的哪一列。列过滤…

FreeSql使用

目的: 1.方库分表 2.主从分离 3.分布式事务 过程&#xff1a; 官网&#xff1a;指南 | FreeSql 官方文档 1.Startup.cs 添加配置&#xff08;本地数据库MySql&#xff09; ConfigureServices&#xff1a; Func<IServiceProvider, IFreeSql> fsql r >{IFreeSql …

吉利银河L7、长城哈弗B07、比亚迪宋Plus DM-i,自主品牌决战混动

2月23日&#xff0c;吉利推出全新的中高端新能源产品序列——吉利银河。当日&#xff0c;吉利推出了首款智能电混SUV「银河L7」&#xff0c;新车将在二季度交付。本月10日&#xff0c;长城汽车也计划举办智能新能源干货大会&#xff0c;其「颠覆技术」等宣传直面新一代的新能源…

SUDO(CVE-2021-3156复现)提权rsync未授权访问提权

一、SUDO(CVE-2021-3156复现 判断漏洞存在&#xff1a; 1.版本 sudo: 1.8.2 - 1.8.31p2 sudo: 1.9.0 - 1.9.5p1 2.报错存在次漏洞 sudoedit -s / 不是报错信息&#xff1a; 复现&#xff1a; 环境&#xff1a;docker的centos7 需要新建一个用户 docker pull chenaot…

k8s学习之路 | Day20 k8s 工作负载 Deployment(下)

文章目录3. HPA 动态扩缩容3.1 HPA3.2 安装 metrics-server3.3 验证指标收集3.4 扩缩容的实现3.5 增加负载3.6 降低负载3.7 更多的度量指标4. 金丝雀部署4.1 蓝绿部署4.2 金丝雀部署4.3 金丝雀部署的实现5. Deployment 状态与排查5.1 进行中的 Deployment5.2 完成的 Deployment…

wordpress更新文章后总是向文章内连接发送GET请求

通过观察wordpress请求发现&#xff0c;wordpress在更新文章后会向文章发送GET请求。在发送请求之前会执行一个调用定时的一个请求POST /wp-cron.php?doing_wp_cron1678081385.6844499111175537109375 HTTP/1.1执行这个定时后&#xff0c;这篇文章的所有链接都会发送HEAD和GET…

源码阅读笔记 InputFormat、FileInputFormat、CombineTextInputFormat

1. InputFormat InputFormat是MapReduce框架提供的用来处理job输入的基类 它主要定义了三个功能&#xff1a; 1.验证job输入是否合法 2.对输入文件进行逻辑切片(InputSplit)&#xff0c;然后将每个切片分发给单独的MapTask 3.提供切片读取器(Re…

Java的注解(Annotation)

Java 注解&#xff08;Annotation&#xff09;又称 Java 标注&#xff0c;是 JDK5.0 引入的一种注释机制。Java 中的类、构造器、方法、成员变量、参数等都可以被注解进行标注。例如JUnit单元测试中的Test方法&#xff0c;可以使得方法直接运行。JUnit单元测试Test单元测试是针…