ES6语法

目录

ES6

ECMAScript 6 是什么:

具体:

语法:

API:

历史版本:

命名方式:

ES 与 JavaScript的关系

ES6的兼容性

Let 和 Const

Let 和 Const 是什么?

let和const的基本用法

什么是变量,什么是常量

const

为什么需要const

const的注意事项

什么时候用const、什么时候用let

let、const与var的区别

1、重复声明

2、变量提升

3、暂时性死区

4、window对象的属性和方法(全局作用域中)

5、块级作用域

模板字符串

1、模板字符串是什么:

2、模板字符串的注意事项

3、模板字符串的应用

解构赋值

数组的解构赋值

数组解构赋值的默认值

常见类数组的解构赋值

对象字面量的增强

对象字面量是什么

对象字面量

方法的简洁表示法

方括号语法

方括号语法的用法

方括号中可以放什么

方括号语法和点语法的区别

函数参数的默认值

认识函数参数默认值

函数参数默认值的基本用法

函数默认值的注意事项

默认值的生效条件

函数参数的默认值的应用

剩余参数和展开运算符

剩余参数

展开运算符

Set 和 Map

Set

Map

Iterator遍历器与for...of循环

Iterator是什么

Iterator解惑

for...of的用法

原生可遍历与非原生可遍历

使用了Iterator的场合

ES的新增方法

字符串的新增方法

数组的新增方法

对象的新增方法


ES6

ECMAScript 6 是什么:

ECMScript 是语言的标准 ​ 6 是版本号 ​ ES6 = ECMAScript 这门语言的第6代标准

具体:

语法:

var a = "jack";
    function add(x,y){
    return x+y;
 }

基本数据类型:数字、字符串、布尔值、undefined、null ​ 引用数据类型:对象

API:

[1,2,3].push(4); ​ {}.toString(); ​ parseInt(3.14); ​ ECMAScript = 语法 + API

历史版本:

ES1~3、ES5~6……………… ​ ES4由于太激进则被抛弃 分解为现在的ES5、ES6等等 ​ ES3: ​ do while、switch、正则表达式等等 ​ ES5: ​ forEach、map、filter、Object.create、Object.defineProperty等 ​ ES6: ​ 本文讲述的就是关于ES6的语法

命名方式:

ES6 VS ES2015 ​ ES6->ES7->ES8->...=ES6+ ​ ES2015->ES2016->ES2017->...

ES 与 JavaScript的关系

javaScrip(浏览器端)= ECMAScript(语法+API)+ DOM + BOM

ES6的兼容性

主流的浏览器的最新版本几乎全部支持ES6

IE老版本等不支持的浏览器,可以用Babel转码

Let 和 Const

Let 和 Const 是什么?

声明变量或声明常量

以前var声明

let代替var 声明变量

const 声明常量 constant的缩写

let和const的基本用法

和var 一样

var name = "张三"
let age = 18
const sex = "男"
console.log(name,age,sex);

什么是变量,什么是常量

变量是可以重新赋值的

常量不可以赋值

var、let声明的就是变量,变量一旦初始化之后,还可以重新赋值

const声明的是常量,常量一旦初始化,就不能重新赋值了,否则就会报错

        const sex = "男" 
        sex = "女"

const

为什么需要const

const就是那些为了一旦初始化就不希望重新赋值的情况设计的

const的注意事项

使用const声明常量,一旦声明,就必须初始化,不能留到最后声明

const声明常量,允许在不重新赋值的情况的下修改他的值(引用数据类型可以编辑

基本数据类型:引用数据类型:

        const person = {
            userName : "zhangsan"
        }
        console.log(person.userName);
        person.userName = "lisi";
        console.log(person.userName)

什么时候用const、什么时候用let

经验:当不知道使用什么的时候,直接使用const,当报错的时候,改为let即可。

let、const与var的区别

1、重复声明

已经存在的变量或常量,又声明了一遍

var允许重复声明,let、const不允许声明:

2、变量提升

var会提升变量的声明到当前作用域的顶部

let和const不存在变量提升

var则会输出 undefined 但是 let和const则会报错

        {
            // console.log(a)
            // let a = 2;
            console.log(b)
            var b = 3;
            // console.log(c)
            // const c = 4;
        }

var:

let、const:

养成养好的编程习惯,对于所有的变量或者常量,先声明再使用

3、暂时性死区

只要作用于内存在let 和 const ,他们所声明的变量或常量,就自动“绑定”这个区域,不再受到外部作用域的影响

let 和 const 存在暂时性死区

        let a = 1;
        {
            let a = 2;
            console.log(`区间内的a:${a}`)
        }
        console.log(`区间外的a:${a}`)

let、const:

        var a = 1;
        {
            var a = 2;
            console.log(`区间内的a:${a}`)
        }
        console.log(`区间外的a:${a}`)

var :

4、window对象的属性和方法(全局作用域中)

var声明的变量,通过function声明的函数,会自动变成window对象的属性和方法

let 和 const 不会

        var age = 18;
        console.log(age === window.age)
        let name = "张三";
        console.log(name === window.name)

5、块级作用域

1、什么是块级作用域

var没有块级作用域

let、const 有块级作用域

2、作用域链

动手画一画:

作用域链:内层作用域->外层作用域->...->全局作用域

3、有哪些块级作用域:

{}

for(){}

while(){}

do{}while()

if(){}

switch(){}

function(){}

注意:对象(object)的花括号不构成作用域

模板字符串

1、模板字符串是什么:

1.1、认识模板字符串

``反引号 **Esc下面那个键

1.2、和原来的字符串的区别

原来拼接字符串用“++”

现在需要:`${变量}`即可

        var person={
            name :"张三",
        }
        console.log("我的名字叫做:"+person.name)
        console.log(`我的名字叫做${person.name}`)

2、模板字符串的注意事项

2.1、输入多行字符串

普通字符串 :\n

模板字符串:可以直接回车换行 也可以\n换行

模板字符串中,所有的空格,换行或缩进都会保留在输出之中

        var person={
            name :"张三",
        }
        console.log("我的名字叫做:\n"+person.name)
        console.log(`我的名字叫做
        ${person.name}`)

2.2、输入反引号和\等特殊字符

通过反斜杠 \ 可以转义 特殊字符

		console.log(`特殊字符反引号:\`,特殊字符反斜杠:\\`)

2.3、模板字符串的注入

${} 变量 对象 函数 计算 都可以放入

只要最终可以得到一个值得就可以通过模板字符串注入

        const add = (a,b)=>a+b;
        console.log(`${add(1,2)}`)

3、模板字符串的应用

1、箭头函数

1.1认识箭头函数

()=>{}

        (a,b)=>{
            return a+b
        }

2、箭头函数的注意事项

如果箭头函数返回单行对象,可以在{}外面加上(),让浏览器不在认为是函数的花括号

        const person = (name,age)=>({name,age})
        console.log(person("zhangsan","18"))

3、this指向!!!!!

1、全局作用域中的this指向

2、一般函数(非箭头函数)中的this指向

'use strict' 严格模式下fun

非严格模式下

只有在函数调用的时候this指向才确定,不调用的时候,不知道指向谁,this指向和函数在哪里调用没有关系,只和谁调用有关

构造函数的this 指向构造函数的这个对象

        function func(){
            return this;
        }
        console.log(func())

非严格模式下指向widow 严格模式下指向undefined

3、箭头函数中的this指向

箭头函数,没有自己的this

通过作用域链往外寻找this

一层一层的寻找this

4、不适用箭头函数的场景

1、作为构造函数

2、需要this指向调用对象的时候

3、需要使用arguments的时候

箭头函数中没有arguments存在

箭头函数中有剩余参数...

5、箭头函数的应用

不需要this指向的时候

解构赋值

数组的解构赋值

1、模式(结构)匹配

2、索引值相同的完成赋值

        [a,b] = [2,3];
        console.log(a,b)

数组解构赋值的默认值

当赋值的时候为严格等于(===)undefined的时候 则可以设置默认值 用等于号=赋值

        [a=1,b=2,c= 4] = [2,3];
        console.log(a,b,c)

如果默认值表达式,默认值表达式是惰性求值得,有默认值才会执行,无默认值不会执行

        [a=(a+b),b=2,c= (a+b)] = [2,3];
        console.log(a,b,c)

常见类数组的解构赋值

对象的解构赋值

结构 模式 匹配

{} = {}

		const person = {
            name :"zhangsan",
            age : 18
        }
        const {name,age} = person
        console.log(name,age)

属性名相同的完成赋值

取别名:

        const person = {
            name :"zhangsan",
            age : 18
        }
        const {name:uname,age:uage} = person
        console.log(uname,uage)

对象的解构赋值默认值:

无论是数组还是对象的默认值都是等号 =

        const person = {
            age : 18
        }
        const {name:uname = "李四",age:uage} = person
        console.log(uname,uage)

默认值如果是表达式的话,则表达式是惰性求值的

如果将一个已经声明的变量用于对象的解构赋值,要整个赋值需要在圆括号中进行

        let x= 2;
        ({x} = {x:1})
        console.log(x)

可以取到继承的属性

        const {toString} = {}
        console.log(toString)

其他数据类型的解构赋值

字符串的解构赋值

既可以数组形式来解构赋值 也可以 对象的形式来解构赋值

数值和布尔值得解构赋值

现将等号右边的值转为对象

        let name = "Hello Word";
        [a,b,c,d,e,f] = name;
        console.log(a,b,c,d,e,f);
        const {0:g,1:h,2:i} = name;
        console.log(g,h,i)

注意:字符串用对象解构赋值的时候,需要用下标当做key对应字符串中的下标

undefined 和 null 的解构赋值

无法转换为数组和对象 无法进行解构赋值

对象字面量的增强

属性和方法的简洁表示法

对象字面量是什么

实例化构造函数生成对象

        const person = new Object();
        person.name = "zhangsan";
        person.age = 18;
        person.speak = function(){}
        console.log(person)

对象字面量

        const person = {
            name : "zhangsan",
            age : 18,
            speak : function(){

            }
        }
        console.log(person)

属性的简洁表示法

键明和属性名一样的时候,可以写一个即可。

方法的简洁表示法

省略冒号: 和funtion关键字

        const person = {
            name : "zhangsan",
            age : 18,
            speak(){

            }
        }
        console.log(person)

方括号语法

方括号语法的用法

先求值,再赋值

        const A = "age";
        const person = {
            name : "zhangsan",
            [A] : 18,
            speak(){

            }
        }
        console.log(person)

方括号中可以放什么

${} {值或通过计划可以得到值得(表达式)}

方括号和模板字符串中一样可以放入一切可以得到值的值或者表达式

        const A = "age";
        const person = {
            name : "zhangsan",
            [`A+${A}`] : 18,
            speak(){

            }
        }
        console.log(person)

方括号语法和点语法的区别

点语法是方括号语法的特殊形式

当属性是合法标识符的时候,可以使用点语法

合法标识符可以用来作为变量或常量名

当你属性或方法名是合法标识符时,可以使用点语法,其他情况下请使用方括号语法

函数参数的默认值

认识函数参数默认值

调用函数的时候,如果参数没有值的话则使用默认值

函数参数默认值的基本用法

在参数直接写 等于默认值 例如:

        const add = (a,b=2) => a+b;
        console.log(add(3))

函数默认值的注意事项

默认值的生效条件

不传参数,或者明确的传递undefined作为参数的时候,只有这两种情况下默认值才会生效

默认值的表达式

如果默认值是表达,则默认值表达式是惰性求值的

设置默认值的小技巧

函数参数的默认值,最好从参数右边开始设置

        const add = (a,b=2) => a+b;
        console.log(add(3,undefined))

函数参数的默认值的应用

1、接受很多参数的时候

2、接受一个对象作为参数

剩余参数和展开运算符

剩余参数

剩余参数是什么

认识剩余参数

        const add = (a,b,...arg)=>{}

剩余参数的本质

剩余参数永远是个数组,即使没有值,也是空数组

        const add = (a,b,...arg)=>{
            console.log(a,b,arg)
        }
        add()

注意事项

1、箭头函数的剩余参数

箭头函数的参数部分即使只有一个剩余参数,也不能省略圆括号

2、使用剩余参数替代arguments获取实际参数

可以使用剩余参数替代arguments获取实际参数

剩余参数是数组 arguments是类数组

3、剩余参数的位置

只能放在最后一个参数 如果后面还有参数就会报错

应用

1、与方法参数来使用

2、与数组解构赋值结合使用(必须是最后一个

        [num,...arg] = [1,2,3,4];
        console.log(num,arg)

3、和对象的结构赋值结合使用(这个时候剩余参数为对象剩余元素必须是最后一个)这个时候叫做剩余元素

        const {x,y,...arg} = {x:1,y:2,z:3,a:6}
        console.log(x,y,arg)

展开运算符

数组的展开运算符

数组展开运算符 基本用法

        console.log(...[1,23,4])

区分剩余参数和展开运算符

数组展开运算符的应用

1、复制数组

        let a = [1,2,3];
        [b] = [...a];
        b[0] = 10;
        console.log(a)

2、合并数组

        let a = [1,2,3];
        let b = [4,5,6]
        console.log([...a,...b])

3、字符串转为数组

字符串可以按照数组的形式展开

4、常见的类数组转换为数组

arguments 和 NodeList

对象的展开运算符

基本用法

展开对象

对象不能够直接展开,必须在{}中展开

对象的展开:把属性罗列出来,用逗号分割,放到一个{}中,构成新对象

        const person = {
            name :"zhangsan",
            age : 18
        }
        const a = {...person};
        a.name = "lisi"
        console.log(a) 

合并对象

新对象拥有全部属性,相同属性后面的覆盖前面的,不同的属性保留

        const person1 = {
            name :"zhangsan",
            age : 18
        }
        const person2 = {
            name :"lisi",
            age : 18,
            color :"green"
        }
        console.log({...person1,...person2}) 

注意事项

1、空对象的展开

如果展开一个空对象,是没有任何效果的

2、非对象的展开

如果展开的不是对象,则会自动将其转换为对象,再讲其属性罗列出来

如果展开的是字符串,他会自动转换为类数组的对象,因此返回的不是空对象

数组可以在任何地方展开

3、对象中对象属性的展开

不会展开对象中的对象属性

        const person1 = {
            name :"zhangsan",
            age : 18,
            color:{
                uname:"123"
            }
        }
        console.log({...person1}) 

应用

1、复制对象

2、用户参数和默认参数

        const login = (param)=>{
            const MOREN = {
                username :"LISI",
                age :19
            }
            param = {...MOREN,...param}
            console.log(param.username,param.age)
        }
        login({username:"zhangsan",age:20})

Set 和 Map

Set

Set是什么

什么是set

set其实就是集合

set和数组很像

数组是一系列有序的数据集合

set是一系列无序、没有重复的数据集合

        var arr = [1,2,3,1,1,2];
        console.log(new Set(arr))

理解set

new Set();只能实例化构造set

set没有下标表示每一个值,所以set是无序的,也不能像数组那样通过下标去访问set的成员

Set实例的方法和属性

方法

add().add().add() 添加成员 可以连赘着写

        console.log(new Set(arr).add(2).add(5).add(6))

has()是否包含

        console.log(new Set(arr).add(2).add(5).add(6).has(3))

delete() 删除 使用delete删除不存的成员,什么都不会发生,也不会报错

clear() 全删

forEach() 遍历set

value和key是一样的

按照成员添加进集合的顺序遍历

        set.forEach((key,value)=>{
            return console.log(key,value)
        });

属性

.size获取个数

       console.log(set.size) //5

Set构造函数的参数

数组

字符串、arguments,NodeList,Set 等

Set的注意事项

判断重复的方式

set对重复值的判断基本遵循严格相等(===)

但是对于NaN的判断与===不同 Set中的NaN等于NaN

正常程序中 NaN === NaN false 但是 set中是全等

什么时候使用Set

1、数组或者字符串去重时

2、不需要通过下标访问,只需要遍历时

3、为了使用set提供的方法和属性时(add,delete,clear)

Set的应用

1、数组的去重

2、字符串的去重

        let str = "abcdaaaxc";
        let set = new Set(str);
        console.log([...set].join(""))

3、存放DOM元素

Map

Map是什么

认识Map

map是对象的映射

map和对象都是键值对的集合

对象:键->值 ,key->value

map:.set() 增加

        let map = new Map();
        map.set("name","zhangsan")
        console.log(map)

对象一般用字符串当作键

基本数据类型:数字、字符串、布尔值、undefined、null

引用数据类型:对象([]、{}、函数、Set、Map等)

        let map = new Map();
        map.set([123,4],"zhangsan")
        console.log(map)

以上都可以作为Map的键

Map实例的方法和属性

方法

.set().set().set() 添加成员 可以连缀

使用set添加的新成员,键如果已经存在,后添加的键值对覆盖已有的

.get(键) 获取指定成员 通过键获取成员

获取不存在的成员的时候,返回的是undefined

has() 判断是否存在

delete 删除

使用delete删除不存的成员,什么都不会发生,也不会

clear() 删除所有 清空

forEach()

        let a = new Map();
        a.set("name","zhangsan")
        a.forEach((value,key,map) => {
            console.log(a === map)
            console.log(value,key,map)
        });

属性

size 获取成员个数

        let a = new Map();
        a.set("name","zhangsan")
        console.log(a.size)

对象没有类似的属性

Map构造函数的参数

数组

只能传二维数组,而且必须体现出键和值

Set、Map中

        let map = new Map([
            ['name','zhangsan'],
            ['age',19]
        ])
        console.log(map)

Set增加的时候中也必须体现出键和值

Map的注意事项

判断键名是否相同的方式

基本遵循严格想等 (===)

例外就是NaN:Map中的NaN也是等于NaN

什么时候使用map什么时候使用对象

什么时候使用Map

如果只需要key->value的结构,或则需要字符串以外的值做键,使用map更合适

遍历:对象:for in,Map: forEach()

只有模拟现实世界中的实体时,才使用对象

例如:person

Map的应用

使用map操作元素的颜色

        let [p1,p2,p3] = document.querySelectorAll("p");
        let map = new Map([
            [
                p1,'green'
            ],[
                p2,'red'
            ],[
                p3,'blue'
            ]
        ])
        map.forEach((color,elem)=>{
            elem.style.color = color
        })

Iterator遍历器与for...of循环

Iterator是什么

Iterator的作用

Iterator:遍历器(迭代器)

for()、forEach()、

Iterator也是用来遍历的

寻找Iterator

数组的Iterator对象

        console.log([1,2,3][Symbol.iterator]())

使用Iterator

.next() 返回是个对象 value遍历的值 done是否遍历完成

        console.log([1,2,3][Symbol.iterator]().next())

可遍历对象(可迭代的对象)

symbol.Iterator:可遍历对象的生成方法

什么是Iterator

symbol.Iterator:可遍历对象的生成方法 -->it(可遍历对象)-->it.next() ->it.next() -> ....(直到done为true)

这个过程叫做Iterator

Iterator解惑

为什么需要Iterator遍历器

遍历数组:for循环 forEach方法

遍历对象:for in 循环

Iterator遍历器是一个统一的遍历方式

如何更方便的使用Iterator

symbol.Iterator:可遍历对象的生成方法 -->it(可遍历对象)-->it.next() ->it.next() -> ....(直到done为true)

我们一般不会直接使用Iterator区遍历

for...of 循环

for...of的用法

认识for...of

遍历流程:

直接使用for...of即可

        var arr = [1,2,3]
        for (const iterator of arr) {
            console.log(iterator)
        }

for...of 循环只会遍历出那些done为false时,对应的value的值

与break、continue一起使用

        var arr = [1,2,3]
        for (const iterator of arr) {
            if(iterator == 2){
                continue;
                //break;
            }
            console.log(iterator)
        }

在for...of中取得数组的索引

arr.keys() 可以获取索引 得到的是索引的可遍历对象,可以遍历出索引值

arr.values() 获取值的可遍历对象

entries() 得到的是索引+值组成的可遍历对象

        for (const iterator of arr.keys()) {
            console.log(iterator)
        }
        for (const iterator of arr.values()) {
            console.log(iterator)
        }
        for (const iterator of arr.entries()) {
            console.log(iterator)
        }

原生可遍历与非原生可遍历

什么是可遍历

只要有symbol.Iterator方法,并且这个方法可以生成可遍历对象,就是可遍历的 天生自带symbol.Iterator的即为天生可遍历

只要可遍历 就可以使用for...of循环来统一遍历

原生可遍历的有哪些

数组

字符串

Set

Map

arguments

NodeList

非原生可遍历的有哪些

一般的对象

手写Iterator方法

有length和索引属性的对象

或者:

使用了Iterator的场合

原生可遍历的数据:

数组

字符串

Set

Map

arguments

NodeList

数组的展开运算符

数组的结构赋值

只要原生可遍历的都可以进行数组的解构赋值

Set和Map的构造函数

Map必须是二维数组

ES的新增方法

字符串的新增方法

includes() 判断是否包含

判断字符串中是否包含某些字符

1、基本用法

        console.log("abc".includes("q"))

2、第二个参数

表示开始搜索的位置,默认是0

        console.log("abc".includes("a",1))

3、应用

padStart()padEnd()

补全字符串长度

1、基本用法

2、注意事项

原字符串的长度,等于或大于最大长度,不会消减原字符串,字符串补全不会生效,返回原字符串

用来补全的字符串与原来字符串长度之和超过了最大长度,截去超出位数的补全字符串,原字符串不动

如果省略第二个参数,默认使用空格补全长度

3、应用

trimStart()和trimEnd()

清除字符串的首或尾空格,中间的空格不会清除

1、基本用法:

别名:

trim() 去除空格,全部空格去除

2、应用

用于表单的提交

replaceAll

替换字符串的内容

语法:

searchValue:表示搜索模式,可以是一个字符串,也可以是一个全局的正则表达式(带有g修饰符)

eplacement:表示替换的文本,是一个字符串

注意事项:

如果第一个参数是一个不带有g修饰符的正则表达式,replaceAll()会报错。replace()不会报错。let str = 'aabbcc'; ​ str.replace(/b/,'') // 不报错 ​ str.replaceAll(/b/,'') // 报错

replaceAll()应用场景:

去除字符串中多余的文字。例如 下面的字符串 把“省”字去掉:const str1 = "广东省,福建省,湖南省..." ​ // 将省字替换为 空白 字符 ​ const str = str1.replaceAll("省","") ​ console.log(str1) ​ console.log(str)

数组的新增方法

includes() 判断是否包含

判断数组中是否包含某个成员

标准:

基本遵循严格想等(===),但是NaN的判断与 === 不同 includes认为NaN === NaN

​ 第二个参数表示搜索的起始位置,默认是0

应用

去重

Arry.from() 构造函数的方法

将其他数据类型转换为数组

1、基本用法:

2、哪些可以通过Arry.from()转换为数组

2.1所有可遍历的

数组、字符串、Set、Map、arguments、NodeList

2.2、拥有length属性的任意对象

length控制数组的长度,转换的只有以数字键的key和value值

3、第二个参数

作用类似于数组的map方法,用来对每个元素进行处理,将处理后的值放入返回的数组中

map:

4、第三个参数,修改this指向

find()和findIndex()

find():找到满足条件的一个立即返回

findIndex() :找到满足条件的一个,立即返回其索引

1、基本用法:

最后一个参数也是修改this指向问题

2、应用

在学生数组中筛选

对象的新增方法

Object.assign()

1、用来合并对象

返回一个对象,相同的数据起后面的替换前面的,保留不同的数据

返回的是新第一个参数的对象

合并到了第一个参数中,返回的就是合并后的参数

可以合并多个对象:

展开运算符合并的时候是个新对象

2、注意事项

2.1、基本数据类型作为原对象

与对象的展开类似,先转换成对象,再合并

2.2、同名属性的替换

后面的覆盖前面的

3、应用

合并默认参数和用户参数

Object.keys()、Object.values()、Object.entries()

Object.keys() 获取键

Object.values() 获取值

Object.entries() 获取键和值

1、基本用法

返回新的数组

2、与数组类似方法的区别

调用方式不同

数组的keys()、values()、entries() 等方法是实例方法,返回的都是Iterator

对象的Object.keys()、Object.values()、Object.entries()等方法是构造函数方法,返回的是数组

3、使用for...of循环遍历遍历

Object.keys()、Object.values()、Object.entries()并不能保证顺序一定是你看到的那样,这一点和for in是一样的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值