第二章 JavaScript基本语法

本文详细介绍了JavaScript的基本语法,包括变量、数据类型、表达式、运算符和流程控制。讲解了变量的声明、赋值、常量定义及其命名规则。讨论了JavaScript的数据类型,如布尔型、数值型、字符型、空型、未定义型和对象型,并介绍了数据类型检测的方法。还深入探讨了运算符,如算术、字符串、赋值、比较、逻辑和位运算符,以及它们的优先级。最后,阐述了流程控制结构,包括选择结构(if...else)和循环结构(while、do...while、for)以及跳转语句(break、continue)的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、变量

1、标识符

1)概念:程序开发中,经常需要自定义一些符号来标记一些名称,并赋予其特定的用途,如变量名、函数名等,这些符号都被称为标识符。

2)定义规则

由大小写字母、数字、下划线和美元符号($)组成。

不能以数字开头。

严格区分大小写。

不能使用JavaScript中的关键字命名。

要尽量要做到“顾名思义”。

当标识符中需要多个单词进行表示时,常见的表示方式有下划线法(如user_name)、驼峰法(如userName)和帕斯卡法(如UserName)。读者可根据开发需求统一规范命名的方式,如下划线方式通常应用于变量的命名,驼峰法通常应用于函数名的命名等。

2、保留关键字

1)保留关键字:是指在JavaScript语言中被事先定义好并赋予特殊含义的单词。

break

case

catch

class

const

continue

debugger

default

delete

do

else

export

extends

false

finally

for

function

if

import

in

instanceof

new

null

return

super

switch

this

throw

try

true

typeof

var

void

while

with

yield

关键字不能作为变量名和函数名使用,否则会使JavaScript在载入过程中出现语法错误。

2)未来保留关键字:是指预留的,未来可能会成为保留关键字的单词。

abstract

arguments

await

byte

boolean

char

double

enum

eval

final

float

goto

implements

int

interface

let

long

native

package

private

protected

public

short

static

synchronized

throws

transient

volatile

标识符在定义时,建议不要用未来保留关键字,避免将来转换为关键字时出现错误。

3、变量的使用

概念:变量可以看作是存储数据的容器。

举例:盛水的杯子,杯子指变量,杯中的水指保存在变量中的数据。

语法:JavaScript中变量通常利用var关键字声明,并且变量名的命名规则与标识符相同。

举例:合法变量名(如number_it123)、非法变量名(如88shout&num)。

未赋初始值的变量,默认值会被设定为undefined。例子如下:

    var sales;

行末的分号表示语句结束,变量与变量之间的逗号(,)操作符,可实现一条语句同时完成多个变量的声明。例子如下:

    var nemu, room, hot;

4、变量的赋值

声明变量、为变量赋值

    var nemu, room;
    nemu = 3;
    room =7;

声明变量的同时为变量赋值

    var cat = "TOM", age = 82;

省略var关键字,直接为变量赋值

    a = 3, b = 7;

注意:JavaScript中变量虽然可以直接省略var关键字为变量赋值,但是为了提高代码的可阅读性,强烈建议不要省略var关键字,且要使用变量在前。

5、定义常量

常量:可以理解为在脚本运行过程中值始终不变的量。

特点:一旦被定义就不能被修改或重新定义。

举例:数学中的圆周率π就是一个常量,其值就是固定语法:ES6中新增了const关键字,用于实现常量的定义

常量命名规则:遵循标识符命名规则,习惯上常量名称总是使用大写字母表示。

常量的值:常量在赋值时可以是具体的数据,也可以是表达式的值或变量。且不能被改变的。

常量一旦被赋值就不能被改变。

常量在声明时必须为其指定某个值。

    var a = 3;
    const b = 7;
    const C = 3 * 7;
    // 输出结果:C = 21
    alert('C=' + C);

二、数据类型

1、数据类型分类

在使用或赋值时根据设置的具体内容再确其对应的类型。

但每一种计算机语言都有自己所支持的数据类型,JavaScript也不例外。

2、基本数据类型

1)布尔型

布尔型是JavaScript中较常用的数据类型之一,通常用于逻辑判断

true    false

表示事物的“真”和“假”,严格遵循大小写,因此truefalse值只有全部为小写时才表示布尔型。

2)数值型

JavaScript中的数值型并不区分整数和浮点数,所有数字都是数值型。

添加“- ”符号表示负数。

添加“+ ”符号表示正数(通常情况下省略“+”)。

设置为NaN表示非数值。

    var oct = 032;      // 八进制数表示的26
    var dec = 26;       // 十进制数26
    var hex = 0x1a;     // 十六进制数表示的26
    var menu1 = 7.26;       // 标准格式
    var menu2 = -6.24;  // 标准格式
    var menu3 = 3.14E6; // 科学计数法格式3.14*106
    var menu4 = 8.96E-3;    // 科学计数法格式8.96*10-3

只要给定的值不超过JavaScript中允许数值指定的范围即可。

3NaN非数值

NaN 是一个全局对象的属性,它的初始值就是NaN

与数值型中的特殊值NaN一样,都表示非数字(Not a Number)。

可用于表示某个数据是否属于数值型。

NaN没有一个确切的值,仅表示非数值型的一个范围。

例如,NaNNaN进行比较时,结果不一定为真(true),这是由于被操作的数据可能是布尔型、字符型、空型、未定义型和对象型中的任意一种类型。

4)字符型

字符型(String)是由Unicode字符、数字等组成的字符序列,这个字符序列我们一般将其称为字符串。

作用:表示文本的数据类型。

语法:程序中的字符型数据包含在单引号(")或双引号("")。

    var slogan = 'Knowledge';       // 单引号,存放一个单词
    var str = "the sky is blue.";   // 双引号,存放一个句子
    var color = '"red"blue';        // 单引号中包含双引号
    var food = "'pizza'bread";      // 双引号中包含单引号
    var num = '', total = "";       // 定义空字符串

由单引号定界的字符串中可以包含双引号。

由双引号定界的字符串中也可以包含单引号。

问题:如何在在单引号中使用单引号,或在双引号中使用双引号?

答案:利用转义字符“\”进行转义。

    var say1 = 'I\'m is ...';    // 在控制台的输出结果:I'm is ...
    var say2 = "\"Tom\"";           // 在控制台的输出结果:"Tom"

在字符串中使用换行、Tab等特殊符号时,也需要利用转义符“\”的转义。

特殊字符

含义

特殊字符

含义

\'

单引号

\"

双引号

\n

回车换行

\v

跳格(Tab、水平)

\t

Tab符号

\r

换行

\f

换页

\\

反斜杠(\

\b

退格

\0

Null字节

\xhh

由两位16进制数字hh表示的ISO-8859-1字符。如“\x61”表示“a”

\uhhhh

由四位16进制数字hhhh表示的Unicode字符。如“\u597d”表示

5)空型

空型(Null)只有一个特殊的null值。

空型用于表示一个不存在的或无效的对象与地址。

JavaScript中大小写敏感,因此变量值只有是小写的null时才表示空型(Null)。

6)未定义型

未定义型(Undefined)也只有一个特殊的undefined值。

未定义型用于声明的变量还未被初始化时,变量的默认值为undefined

null不同的是,undefined表示没有为变量设置值,而null则表示变量(对象或地址)不存在或无效。

注意:nullundefined与空字符串('')和0都不相等。

3、数据类型检测

    var menu1 = 12, menu2 = '34', num = 0;  // 声明变量并赋值
    num = menu1 + menu2;        // 变量进行相加运算
    alert(num);     // 输出结果:1234

+”运算符的操作数只要有一个是字符串,就表示字符串拼接,上述代码中的 34有双引号包裹着,所以它是字符型,因此对话框弹出 1234

若对参与运算的数据类型有要求时,需要进行数据类型检测。

JavaScript中对于数据类型的检测提供了以下两种方式:

typeof操作符                 Object.prototype.toString.call()

    console.log(typeof menu1);          // 输出结果:number
    console.log(typeof menu2);          // 输出结果:string
    console.log(typeof num);        // 输出结果:string

在利用typeof检测null的类型时返回的是object而不是null

由于JavaScript中一切皆对象,因此可利用Object.prototype.toString.call()对象原型的扩展函数更精确的区分数据类型。

在利用typeof检测null的类型时返回的是object而不是null

由于JavaScript中一切皆对象,因此可利用Object.prototype.toString.call()对象原型的扩展函数更精确的区分数据类型。

    var data = num; // 待判断的数据
    var type = 'Null';  // 数据类型,开始字母要大写,如Boolean等
    // 检测数据类型的表达式,若是指定的type型,则返回true,否则返回false
    Object.prototype.toString.call(data) == '[object ' + type + ']';

Object.prototype.toString.call(data)的返回值是一个形如“[object 数据类型]”的字符型结果。(可通过console.log()观察返回值。)

4、数据类型转换(转布尔型、转数值型、转字符型)

1)转布尔型

应用场景:经常用于表达式和流程控制语句中,如数据的比较、条件的判断。

实现语法:Boolean()函数。

注意事项:Boolean()函数会将任何非空字符串和非零的数值转换为true,将空字符串、0NaNundefinednull转换为false

演示示例:判断用户是否有内容输入。

    var con = prompt(); 
    if (Boolean(con)) {
        document.write('已输入内容   true');
    } else {
        document.write('无输入内容   false');
    }

当用户单击“取消”按钮,或者用户未输入,单点击“确定”按钮,结果都是为false

当用户输入“你好”或者其他内容,单点击“确定”按钮,结果都是为true

2)转数值型

开发中在接收用户传递的数据进行运算时,为了保证参与运算的都是数值型,经常需要对其进行转换。

实现语法:Number()函数、parseInt()函数或parseFloat()函数。

    // 获取用户的输入,完成自动求和
    var num1 = prompt('请输入求和的第1个数据: ');         // 输入 123qwq
    var num2 = prompt('请输入求和的第2个数据: ');     // 输入 456
    console.log(num1 + num2);       // 控制台输出字符拼接结果 123qwq456
    console.log(parseInt(num1) + parseInt(num2));     // 控制台输出求和结果 579

转数值型的函数在使用时有一定的区别。

待转数据

Number()

parseInt()

parseFloat()

纯数字字符串

转成对应的数字

转成对应的数字

转成对应的数字

空字符串

0

NaN

NaN

数字开头的字符串

NaN

转成开头的数字

转成开头的数字

非数字开头字符串

NaN

NaN

NaN

null

0

NaN

NaN

undefined

NaN

NaN

NaN

false

0

NaN

NaN

true

1

NaN

NaN

所有函数在转换纯数字时会忽略前导零,如“0123”字符串会被转换为123

parseFloat()函数会将数据转换为浮点数(可以理解为小数)。

parseInt()函数会直接省略小数部分,返回数据的整数部分,并可通过第2个参数设置转换的进制数。

注意:在实际开发中还需要对转换后的结果是否是NaN进行判断,只有不是NaN时,才能够进行运算。此时可使用isNaN()函数来确定,当给定值为undefinedNaN{}(对象)时返回true,否则返回false

3)转字符型

String()函数和toString()方法。

区别: String()函数可以将任意类型转换为字符型;除了nullundefined没有toString()方法外,其他数据类型都可以完成字符的转换。

    var num1 = num2 = num3 = 4, num4 = 26;
    console.log(String(12));    // 控制台输出 12
    console.log(num1 + num2 + num3.toString());     // 控制台输出 84,代码说明:第1步:计算num1+ num2的结果为8。 第2步:num3转成‘4’。  第3步:拼接两次计算的结果为84。
    console.log(num4.toString(2));  // 当toString()括号里的数值为2时,num4就会被转换为二进制值表示的字符串

注意:toString()方法在进行数据类型转换时,可通过参数设置,将数值转换为指定进制的字符串,例如num4.toString(2),表示首先将十进制26转为二进制11010,然后再转为字符型数据。

三、表达式

1 表达式可以是各种类型的数据、变量和运算符的集合。最简单的表达式可以是一个变量。

    var a, b, c;              // 声明变量
    a = 1;        // 将表达式“1”的值赋给变量a
    b = 2 + 3;    // 将表达式“2 + 3”的值赋给变量b
    c = b = a;    // 将“a”的值赋给变量b,然后把“b”的值赋给变量c,所以程序运行到这一步时,a、b、c的值都是1
    console.log(c);   // 将表达式“c”的值作为参数传给console.log()方法,在控制台输出
    console.log(a + b); // 将表达式“a + b”的值作为参数传给console.log()方法,在控制台输出

四、运算符(专门用于告诉程序执行特定运算或逻辑操作的符号。)

1、算术运算符

运算符

运算

范例

结果

+

5+5

10

-

6-4

2

*

3*4

12

/

3/2

1.5

%

求余

5%7

5

**

幂运算

3**4

81

++

自增(前置)

a=2, b=++a;

a=3;b=3;

++

自增(后置)

a=2, b=a++;

a=3;b=2;

--

自减(前置)

a=2, b=--a;

a=1;b=1;

--

自减(后置)

a=2, b=a--;

a=1;b=2;

四则混合运算,遵循先乘除后加减的原则。

取模运算结果的正负取决于被模数(%左边的数)的符号。

尽量避免利用小数进行运算,有时可能因JavaScript的精度导致结果的偏差。

+”“-”在算术运算时还可以表示正数或负数。

运算符(++--)放在操作数前面,先进行自增或自减运算,再进行其他运算。若运算符放在操作数后面,则先进行其他运算,再进行自增或自减运算。

递增和递减运算符仅对数值型和布尔型数据操作,会将布尔值true当做1false当做0

2、字符串运算符

JavaScript中,“+”操作的两个数据中只要有一个是字符型,则“+”就表示字符串运算符,用于返回两个数据拼接后的字符串。

    var color = 'blue';
    var str = 'The sky is ' + color;
    var tel = 110 + '120';
    console.log(str);                       // 输出结果为:The sky is blue
    console.log(tel);                       // 输出结果为:110120
    console.log(typeof str, typeof tel);    // 输出结果:string string   输出的是字符串类型

利用字符串运算符“+”的特性,可以将布尔型、整型、浮点型或为null的数据,与空字符串进行拼接,就会完成字符型的自动转换。

3、赋值运算符

它是一个二元运算符,即它有两个操作数,将运算符右边的值赋给左边的变量。

运算符

运算

范例

结果

=

赋值

a=3, b=2;

a=3;b=2;

+=

加并赋值

a=3, b=2; a+=b;

a=5;b=2;

-=

减并赋值

a=3, b=2;a-=b;

a=1;b=2;

*=

乘并赋值

a=3, b=2;a*=b;

a=6;b=2;

/=

除并赋值

a=3, b=2;a/=b;

a=1.5;b=2;

%=

模并赋值

a=3, b=2;a%=b;

a=1;b=2;

+=

连接并赋值

a='abc';a+='def';

a='abcdef';

**=

幂运算并赋值

a=2; a**= 5;

a=32;

<<=

左移位赋值

a=9,b=2;a <<= b;

a=36;b=2;

>>=

右移位赋值

a=-9,b=2;a >>= b;

a=-3;b=2;

>>>=

无符号右移位赋值

a=-9,b=2;a >>>= b;

a= 1073741821;b=2;

&=

按位与赋值

a=3,b=9;a &= b;

a=1;b=9;

^=

按位异或赋值

a=3,b=9;a ^= b;

a=10;b=9;

|=

按位或赋值

a=3,b=9;a |= b;

a=11;b=9;

=”是赋值运算符,而非数学意义上的相等的关系。

一条赋值语句可以对多个变量进行赋值。

赋值运算符的结合性为“从右向左”。

    var a = b = c = 7;

7赋值给变量c,再把变量c的值赋值给变量b,把变量b的值赋值变量a,表达式赋值完成。

4、比较运算符

用来对两个数值或变量进行比较,其结果是布尔类型的truefalse

运算符

运算

范例

结果

==

等于

x == 4

false

!=

不等于

x != 4

true

===

全等

x === 5

true

!==

不全等

x !== '5'

true

大于

x > 5

false

>=

大于或等于

x >= 5

true

小于

x < 5

false

<=

小于或等于

x <= 5

true

注意:不相同类型的数据进行比较时,首先会自动将其转换成相同类型的数据后再进行比较。

运算符“==”“!=”运算符在比较时,只比较值是否相等。

运算符“===”“!==”要比较数值和其数据类型是否相等。

5、逻辑运算符

是在程序开发中用于逻辑判断的符号,其返回值类型是布尔类型。

运算符

运算

范例

结果

&&

a && b

ab都为true,结果为true,否则为false

||

a || b

ab中至少有一个为true,则结果为true,否则为false

!

! a

afalse,结果为true,否则相反

逻辑运算符的结合性是从左到右。

当使用“&&”连接两个表达式时,如果左边表达式的值为false,则右边的表达式不会执行,逻辑运算结果为false。(短路)

当使用“||”连接两个表达式时,如果左边表达式的值为true,则右边的表达式不会执行,逻辑运算结果为true。(短路)

逻辑运算符可针对结果为布尔值的表达式进行运算。

6、三元运算符

三元运算符是一种需要三个操作数的运算符,运算的结果根据给定条件决定。

    条件表达式 ? 表达式1 : 表达式2

先求条件表达式的值。

如果为true,则返回表达式1的执行结果。

如果条件表达式的值为false,则返回表达式2的执行结果。

    1 > 2 ? console.log("是") : console.log("否");

7、位运算符

是针对二进制数的每一位进行运算的符号,它专门针对数字01进行操作。

运算符

运算

范例

结果

&

按位与

a & b

ab每一位进行“与”操作后的结果

|

按位或

a | b

ab每一位进行“或”操作后的结果

~

按位非

~ a

a的每一位进行“非”操作后的结果

^

按位异或

a ^ b

ab每一位进行“异或”操作后的结果

<< 

左移

a << b

a左移b位,右边用0填充

>> 

右移

a >> b

a右移b位,丢弃被移出位,左边最高位用01填充

>>> 

无符号右移

a >>>b

a右移b位,丢弃被移出位,左边最高位用0填充

注意:JavaScript中位运算符仅能对数值型的数据进行运算。在对数字进行位运算之前,程序会将所有的操作数转换成二进制数,然后再逐位运算。

8、运算符优先级

指的是在表达式中各个运算符参与运算的先后顺序。例如:先乘除,后加减。

表中运算符的优先级由上至下递减。

结合方向

运算符

()

.   []   new(有参数,无结合性)

new(无参数)

++(后置)   --(后置)

!   ~   -(负数)   +(正数)   ++(前置)   --(前置)   typeof   void   delete

**

*    /   %

+   -

<<    >>    >>>

<   <=   >    >=    in   instanceof

==   !=    ===    !==

&

^

|

&&

||

?:

=   +=   =   *=   /=   %=    <<=   >>=    >>>=    &=    ^=   |=

,

同一单元格的运算符具有相同的优先级。

左结合方向表示同级运算符的执行顺序为从左到右。

右结合方向则表示执行顺序为从右到左。

补充:圆括号( )优先级别最高。例如, 4 + 3 * 2 输出结果为10(4 + 3) * 2的输出结果为14

四、流程控制

1、选择结构

选择结构语句需要根据给出的条件进行判断来决定执行对应的代码。

if单分支语句            if…else双分支语句

if…else if…else多分支语句          switch多分支语句

(1)if单分支语句

概念:if条件判断语句也被称为单分支语句,当满足某种条件时,就进行某种处理。

    if( age >=18){
        alert("成年人")
    }

(2)if…else双分支语句

概念:if…else语句也称为双分支语句,当满足某种条件时,就进行某种处理,否则进行另一种处理。

举例:判断一个学生的年龄,大于等于18岁则是成年人,否则是未成年人。

 

    if( age >=18){
        alert("成年人")
    }else{
        alert("未成年人")
    }

(3)if…else if…else多分支语句

if…else if…else语句也称为多分支语句,可针对不同情况进行不同的处理。

举例:对一个学生的考试成绩进行等级的划分,分数在90~100分为优秀,分数在80~90分为优秀为良好,分数在70~80分为中等,分数在60~70分为及格,分数小于60则为不及格。

    if ( score >=90  && score <=100 ) {
        alert("优秀")
    } else if( score >=80  && score <90 ){
        alert("良好")
    }else if ( score >=70  && score <80 ) {
        alert("中等")
    }else if ( score >=60  && score <70 ) {
        alert("及格")
    } else if ( score >0  && score <60 ) {
        alert("不及格")
    } else {
        alert("分数不合法")
    }

注意:if…else if…else”语句在使用时,“else if”中间要有空格,否则程序会报语法错误。

(4)switch多分支语句

switch语句也是多分支语句,功能与if系列条件语句相同,不同的是它只能针对某个表达式的值作出判断,从而决定执行哪一段代码。

特点:代码更加清晰简洁、便于阅读。

举例:根据学生成绩score进行评比(满分为100分)。

    switch (parseInt(score/10)) {
        case 10 && 9 : alert("优秀"); break;
        case 8 : alert("良好"); break;
        case 7 : alert("中等"); break;
        case 6 : alert("及格"); break;

        default: alert("不及格"); break;
    }

2、循环结构

所谓循环语句就是可以实现一段代码的重复执行。

举例:连续输出1~100之间的数字。

While                   do…while                   for

1while循环语句

while循环语句是根据循环条件来判断是否重复执行一段代码。

 

    while(num <=100){
        console.log(num);
        num++;
    }

需要注意的是,若循环条件永远为true时,则会出现死循环,因此在开发中应根据实际需要,在循环体中设置循环出口,即循环结束的条件。

2for循环语

for循环语句是最常用的循环语句,它适合循环次数已知的情况。

    for( var qwq =0; qwq <5; ++qwq){
        console.log("循环成功");
    }

 

for关键字后面小括号“()”中包括了三部分内容:

初始化表达式。

循环条件。

操作表达式。

它们之间用“;”分隔,{}中的执行语句为 ③循环体。

注意:for循环语句小括号“()”内的每个表达式都可以为空,但是必须保留分号分割符。当每个表达式都为空时,表示该for循环语句的循环条件永远满足,会进入无限循环的状态,此时如果要结束无限循环,可在for语句循环体中用跳转语句进行控制。

let关键字

ES6中,可以通过let关键字声明一个块级作用域(可以理解为{}之间的代码)的本地变量。

它与var关键字的区别是,let关键字在块级作用域内不能重复定义同名的变量,且该变量仅在块级作用范围内有效。

    for( let qwq =0; qwq <5; ++qwq){
        console.log("循环成功");
    }

通过let定义的变量相比var来说,有一个更加清晰的作用范围,方便了变量的维护与控制。

3、跳转语句

跳转语句用于实现程序执行过程中的流程跳转。

常用的跳转语句:有breakcontinue语句。

breakcontinue的区别:break语句可应用在switch和循环语句中,其作用是终止当前语句的执行,跳出switch选择结构或循环语句,执行后面的代码。而continue语句用于结束本次循环的执行,开始下一轮循环的执行操作。

其他功能:breakcontinue语句还可跳转到指定的标签语句处,实现嵌套语句的多层次跳转。

// 定义标签
label : statement
// 使用标签
break/continue  label;

label表示标签的名称,如startend等任意合法的标识符。

statement表示具体执行的语句,如ifwhile、变量的声明等。

标签语句必须在使用之前定义,否则会出现找不到标签的情况。

4、【案例】打印金字塔

代码实现思路:

1 分析金字塔组成:由空格和星星“*”组成的三角形。

2)分析“*”和空格的分布规律(假设最上面的一个星星作为金字塔的第一层)。

3)每层中星星的数量 = 当前层数*2 -1。例如当前为第4层,则星星数= 4*2-1=7

4)每层星星前的空格 = 金字塔层数当前层数。例如当前行数为第3层,则空格数=5-3=2

 

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

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>星号金字塔</title>
    <script>
        var m;
        do {
            var n = prompt("请输入金字塔的层数n:");
            if (parseInt(n) != NaN) {
                m = parseInt(n);
                break;
            }
            else alert("输入内容必须为数字n,请重试!");
        } while (true);
        for (var i = 1; i <= m; i++) {
            for (var j = 1; j <= m - i; j++) {
                document.write("&nbsp;");
            }
            for (var j = 1; j <= 2 * i - 1; j++) {
                document.write("*");
            }
            document.write("<br>");
        }
    </script>
</head>

<body>

</body>

</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值