IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> js——基本语法 -> 正文阅读

[JavaScript知识库]js——基本语法

文章目录

1.js基础

1.1 初始JavaScript

1.1.1 JavaScript 是什么

在这里插入图片描述

1.1.2 JavaScript的作用

在这里插入图片描述

1.1.3 HTML/CSS/JS 的关系

在这里插入图片描述

1.1.4 浏览器执行 JS 简介

在这里插入图片描述

1.1.5 JS 的组成

在这里插入图片描述
在这里插入图片描述

1.1.6 JS 初体验

JS 有3种书写位置,分别为行内、内嵌和外部。

1.行内式

<input type="button" value="点我试试" onclick="alert('Hello World')" />
  • 可以将单行或少量 JS 代码写在HTML标签的事件属性中(以 on 开头的属性),如:onclick
  • 注意单双引号的使用:在HTML中我们推荐使用双引号, JS 中我们推荐使用单引号
  • 可读性差, 在html中编写JS大量代码时,不方便阅读;
  • 引号易错,引号多层嵌套匹配时,非常容易弄混;
  • 特殊情况下使用

2.内嵌式

<script>
    alert('Hello  World~!');
</script>
  • 可以将多行JS代码写到 script 标签中
  • 内嵌 JS 是学习时常用的方式

3.外部JS文件

<script src="my.js"></script>
  • 利于HTML页面代码结构化,把大段 JS代码独立到 HTML 页面之外,既美观,也方便文件级别的复用
  • 引用外部 JS文件的 script 标签中间不可以写代码
  • 适合于JS 代码量比较大的情况

1.1.7 JavaScript注释

单行注释

// 我是一行文字,不想被 JS引擎 执行,所以 注释起来	

多行注释

/*
  获取用户年龄和姓名
  并通过提示框显示出来
*/

1.1.8 JavaScript输入输出语句

为了方便信息的输入输出,JS中提供了一些输入输出语句,其常用的语句如下:

方法说明归属
alert(msg)浏览器弹出警示框浏览器
console.log(msg)浏览器控制台打印输出信息浏览器
prompt(info)浏览器弹出输入框,用户可以输入浏览器

注意:alert() 主要用来显示消息给用户,console.log() 用来给程序员自己看运行时的消息。

1.1.9 解释型语言和编译型语言

在这里插入图片描述

1.1.10 关键字和保留字

标识符
标识(zhi)符:就是指开发人员为变量、属性、函数、参数取的名字。
标识符不能是关键字或保留字。

关键字
关键字:是指 JS本身已经使用了的字,不能再用它们充当变量名、方法名。?
包括:break、case、catch、continue、default、delete、do、else、finally、for、function、if、in、instanceof、new、return、switch、this、throw、try、typeof、var、void、while、with 等。

保留字
保留字:实际上就是预留的“关键字”,意思是现在虽然还不是关键字,但是未来可能会成为关键字,同样不能使用它们当变量名或方法名。

包括:boolean、byte、char、class、const、debugger、double、enum、export、extends、fimal、float、goto、implements、import、int、interface、long、mative、package、private、protected、public、short、static、super、synchronized、throws、transient、volatile 等。

注意:如果将保留字用作变量名或函数名,那么除非将来的浏览器实现了该保留字,否则很可能收不到任何错误消息。当浏览器将其实现后,该单词将被看做关键字,如此将出现关键字错误。

1.2 变量

1.2.1 什么是变量在这里插入图片描述

1.2.2 变量在内存中的存储

本质:变量是程序在内存中申请的一块用来存放数据的空间。类似我们酒店的房间,一个房间就可以看做是一个变量。

1.2.3 变量的使用

1.声明变量

//  声明变量  
var age; //  声明一个 名称为age 的变量     
  • var 是一个 JS关键字,用来声明变量( variable 变量的意思 )。使用该关键字声明变量后,计算机会自动为变量分配内存空间,不需要程序员管

  • age 是程序员定义的变量名,我们要通过变量名来访问内存中分配的空间

2.赋值

age = 10; // 给 age  这个变量赋值为 10          
  • = 用来把右边的值赋给左边的变量空间中 此处代表赋值的意思
  • 变量值是程序员保存到变量空间里的值

3.变量的初始化

var age  = 18;  // 声明变量同时赋值为 18

4.变量语法扩展
更新变量:一个变量被重新复赋值后,它原有的值就会被覆盖,变量值将以最后一次赋的值为准。

var age = 18;

age = 81;   // 最后的结果就是81因为18 被覆盖掉了  

同时声明多个变量:同时声明多个变量时,只需要写一个 var, 多个变量名之间使用英文逗号隔开。

var age = 10,  name = 'zs', sex = 2;       

声明变量特殊情况

情况说明结果
var age ; console.log (age);只声明 不赋值undefined
console.log(age)不声明 不赋值 直接使用报错
age = 10; console.log (age);不声明 只赋值10

5.变量命名规范
规则:

  • 由字母(A-Za-z)、数字(0-9)、下划线(_)、美元符号( $ )组成,如:usrAge, num01, _name
  • 严格区分大小写。var app; 和 var App; 是两个变量
  • 不能 以数字开头。 18age 是错误的
  • 不能 是关键字、保留字。例如:var、for、while
  • 变量名必须有意义。 MMD BBD nl → age
  • 遵守驼峰命名法。首字母小写,后面单词的首字母需要大写。myFirstName

1.3 数据类型

1.3.1 数据类型简介

1.为什么需要数据类型

在计算机中,不同的数据所需占用的存储空间是不同的,
为了便于把数据分成所需内存大小不同的数据,充分利用存储空间,于是定义了不同的数据类型。
简单来说,数据类型就是数据的类别型号。比如姓名“张三”,年龄18,这些数据的类型是不一样的。

2.变量的数据类型

变量是用来存储值的所在处,它们有名字和数据类型。变量的数据类型决定了如何将代表这些值的位存储到计算机的内存中。JavaScript 是一种弱类型或者说动态语言。这意味着不用提前声明变量的类型,在程序运行过程中,类型会被自动确定:
var age = 10;        // 这是一个数字型
var areYouOk = '是的';   // 这是一个字符串   

在代码运行时,变量的数据类型是由 JS引擎 根据 = 右边变量值的数据类型来判断 的,运行完毕之后, 变量就确定了数据类型。JavaScript 拥有动态类型,同时也意味着相同的变量可用作不同的类型:

var x = 6;           // x 为数字
var x = "Bill";      // x 为字符串 

3.数据类型的分类

JS 把数据类型分为两类:

  • 简单数据类型 (Number,String,Boolean,Undefined,Null)

  • 复杂数据类型 (object)

1.3.2 简单数据类型

1.在这里插入图片描述

1.数字型 Number

JavaScript 数字类型既可以保存整数,也可以保存小数(浮点数)。

var age = 21;       // 整数
var Age = 21.3747;  // 小数  

1.数字型进制:最常见的进制有二进制、八进制、十进制、十六进制。

  // 1.八进制数字序列范围:0~7
 var num1 = 07;   // 对应十进制的7
 var num2 = 019;  // 对应十进制的19
 var num3 = 08;   // 对应十进制的8
  // 2.十六进制数字序列范围:0~9以及A~F
 var num = 0xA;   

2.数字型范围:JavaScript中数值的最大和最小值

- 最大值:Number.MAX_VALUE,这个值为: 1.7976931348623157e+308

- 最小值:Number.MIN_VALUE,这个值为:5e-32

3.数字型三个特殊值

  • Infinity ,代表无穷大,大于任何数值

  • -Infinity ,代表无穷小,小于任何数值

  • NaN ,Not a number,代表一个非数值

4.isNaN:用来判断一个变量是否为非数字的类型,返回 true 或者 false
在这里插入图片描述

   var usrAge = 21;
   var isOk = isNaN(userAge);
     console.log(isNum);          // false ,21 不是一个非数字
   var usrName = "andy";
     console.log(isNaN(userName));// true ,"andy"是一个非数字

2.字符串型 String
字符串型可以是引号中的任意文本,其语法为 双引号 “” 和 单引号’’

var strMsg = "我爱北京天安门~";  // 使用双引号表示字符串
var strMsg2 = '我爱吃猪蹄~';    // 使用单引号表示字符串
// 常见错误
var strMsg3 = 我爱大肘子;       // 报错,没使用引号,会被认为是js代码,但js没有这些语法

因为 HTML 标签里面的属性使用的是双引号,JS 这里我们更推荐使用单引号。

1.字符串引号嵌套

JS 可以用单引号嵌套双引号 ,或者用双引号嵌套单引号 (外双内单,外单内双)

var strMsg = '我是"高帅富"程序猿';   // 可以用''包含""
var strMsg2 = "我是'高帅富'程序猿";  // 也可以用"" 包含''
//  常见错误
var badQuotes = 'What on earth?"; // 报错,不能 单双引号搭配

2.字符串转义符

类似HTML里面的特殊字符,字符串中也有特殊字符,我们称之为转义符。
转义符都是 \ 开头的,常用的转义符及其说明如下:

转义符解释说明
\n换行符,n 是 newline 的意思
\ \斜杠 \
’ 单引号
"”双引号
\ttab 缩进
\b空格 ,b 是 blank 的意思

3.字符串长度

字符串是由若干字符组成的,这些字符的数量就是字符串的长度。通过字符串的 length 属性可以获取整个字符串的长度。

var strMsg = "我是帅气多金的程序猿!";
alert(strMsg.length); // 显示 11

4.字符串拼接

  • 多个字符串之间可以使用 + 进行拼接,其拼接方式为 字符串 + 任何类型 = 拼接之后的新字符串

  • 拼接前会把与字符串相加的任何类型转成字符串,再拼接成一个新的字符串

//1.1 字符串 "相加"
alert('hello' + ' ' + 'world'); // hello world
//1.2 数值字符串 "相加"
alert('100' + '100'); // 100100
//1.3 数值字符串 + 数值
alert('11' + 12);     // 1112 

5.字符串拼接加强

console.log('pink老师' + 18);        // 只要有字符就会相连 
var age = 18;
console.log('pink老师age岁啦');      // 这样不行哦
console.log('pink老师' + age);         // pink老师18
console.log('pink老师' + age + '岁啦'); // pink老师18岁啦
  • 经常会将字符串和变量来拼接,变量可以很方便地修改里面的值
  • 变量是不能添加引号的,因为加引号的变量会变成字符串
  • 如果变量两侧都有字符串拼接,口诀“引引加加 ”,删掉数字,变量写加中间

3.布尔型Boolean
布尔类型有两个值:true 和 false ,其中 true 表示真(对),而 false 表示假(错)。
布尔型和数字型相加的时候, true 的值为 1 ,false 的值为 0。

console.log(true + 1);  // 2
console.log(false + 1); // 1

4.Undefined和 Null

一个声明后没有被赋值的变量会有一个默认值undefined ( 如果进行相连或者相加时,注意结果)

var variable;
console.log(variable);           // undefined
console.log('你好' + variable);  // 你好undefined
console.log(11 + variable);     // NaN
console.log(true + variable);   //  NaN

一个声明变量给 null 值,里面存的值为空

var vari = null;
console.log('你好' + vari);  // 你好null
console.log(11 + vari);     // 11
console.log(true + vari);   //  1

5.获取变量数据类型

获取检测变量的数据类型:typeof 可用来获取检测变量的数据类型

var num = 18;
console.log(typeof num) // 结果 number   

不同类型的返回值
在这里插入图片描述
6.数据类型转换
什么是数据类型转换?

? 使用表单、prompt 获取过来的数据默认是字符串类型的,此时就不能直接简单的进行加法运算,而需要转换变量的数据类型。通俗来说,就是把一种数据类型的变量转换成另一种数据类型,通常会实现3种方式的转换:

1.转换为字符串
在这里插入图片描述

2.转换为数字型

在这里插入图片描述
3.转换为布尔型
在这里插入图片描述

  • 代表空、否定的值会被转换为 false ,如 ‘’、0、NaN、null、undefined
  • 其余值都会被转换为 true
console.log(Boolean('')); // false
console.log(Boolean(0)); // false
console.log(Boolean(NaN)); // false
console.log(Boolean(null)); // false
console.log(Boolean(undefined)); // false
console.log(Boolean('小白')); // true
console.log(Boolean(12)); // true

1.4 运算符(操作符)

1.4.1 运算符的分类

运算符(operator)也被称为操作符,是用于实现赋值、比较和执行算数运算等功能的符号。
JavaScript中常用的运算符有:

  • 算数运算符
  • 递增和递减运算符
  • 比较运算符
  • 逻辑运算符
  • 赋值运算符

1.4.2 算数运算符

概念:算术运算使用的符号,用于执行两个变量或值的算术运算。
在这里插入图片描述
浮点数的精度问题
浮点数值的最高精度是 17 位小数,但在进行算术计算时其精确度远远不如整数。

var result = 0.1 + 0.2;    // 结果不是 0.3,而是:0.30000000000000004

所以:不要直接判断两个浮点数是否相等 !

表达式和返回值

表达式:是由数字、运算符、变量等以能求得数值的有意义排列方法所得的组合

简单理解:是由数字、运算符、变量等组成的式子

表达式最终都会有一个结果,返回给开发者,称为返回值

1.4.3 递增和递减运算符

在这里插入图片描述

1.4.4 比较运算符

在这里插入图片描述

1.4.5 逻辑运算符

在这里插入图片描述

1.4.6 赋值运算符

在这里插入图片描述

1.4.7 运算符优先级

在这里插入图片描述

1.5 流程控制

1.5.1 流程控制概念

在一个程序执行的过程中,各条代码的执行顺序对程序的结果是有直接影响的。很多时候我们要通过控制代码的执行顺序来实现我们要完成的功能。

简单理解:流程控制就是来控制代码按照一定结构顺序来执行

流程控制主要有三种结构,分别是顺序结构分支结构循环结构,代表三种代码执行的顺序。
在这里插入图片描述

1.5.2 顺序流程控制

在这里插入图片描述

1.5.3 分支流程控制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.5.4 三元表达式

在这里插入图片描述

1.5.5 switch分支流程控制

在这里插入图片描述

1.6 循环

1.6.1 for循环

**### 1.6.1在这里插入图片描述

1.6.2 双重for循环

在这里插入图片描述

1.6.3 while循环

在这里插入图片描述

1.6.4 do-while循环

在这里插入图片描述

1.6.5 continue、break

continue 关键字用于立即跳出本次循环,继续下一次循环
break 关键字用于立即跳出整个循环(循环结束)。

1.7 数组

1.7.1 数组的概念

  • 数组可以把一组相关的数据一起存放,并提供方便的访问(获取)方式。
  • 数组是指一组数据的集合,其中的每个数据被称作元素,在数组中可以存放任意类型的元素。数组是一种将一组数据存储在单个变量名下的优雅方式。

1.7.2 创建数组

JS 中创建数组有两种方式:

利用 new 创建数组

var 数组名 = new Array() ;
var arr = new Array();   // 创建一个新的空数组

注意 Array () ,A 要大写

利用数组字面量创建数组

//1. 使用数组字面量方式创建空的数组
var  数组名 = [];
//2. 使用数组字面量方式创建带初始值的数组
var  数组名 = ['小白','小黑','大黄','瑞奇'];
  • 数组的字面量是方括号 [ ]
  • 声明数组并赋值称为数组的初始化
  • 这种字面量方式也是我们以后最多使用的方式

数组元素的类型
数组中可以存放任意类型的数据,例如字符串,数字,布尔值等。

var arrStus = ['小白',12,true,28.9];

1.7.3 获取数组中的元素

? 索引 (下标) :用来访问数组元素的序号(数组下标从 0 开始)。

在这里插入图片描述
数组可以通过索引来访问、设置、修改对应的数组元素,可以通过“数组名[索引]”的形式来获取数组中的元素。

// 定义数组
var arrStus = [1,2,3];
// 获取数组中的第2个元素
alert(arrStus[1]);    

注意:如果访问时数组没有和索引值对应的元素,则得到的值是undefined

1.7.4 遍历数组

在这里插入图片描述

1.7.5 数组中新增元素

数组中可以通过以下方式在数组的末尾插入新元素:

数组[ 数组.length ] = 新数据;

1.8 函数

1.8.1 函数的概念

在 JS 里面,可能会定义非常多的相同代码或者功能相似的代码,这些代码可能需要大量重复使用。虽然 for循环语句也能实现一些简单的重复操作,但是比较具有局限性,此时我们就可以使用 JS 中的函数。

? 函数:就是封装了一段可被重复调用执行的代码块。通过此代码块可以实现大量代码的重复使用

1.8.2 函数的使用

1.声明函数

// 三种方式
function 函数名() {
    //函数体代码
}

var test2 = function(){   //函数字面量

  alert("2222");

}
var test3 = new Function("alert(3333);");  //运行时,初始化函数体
  • function 是声明函数的关键字,必须小写

  • 由于函数一般是为了实现某个功能才定义的, 所以通常我们将函数名命名为动词,比如 getSum

2.调用函数

// 调用函数
函数名();  // 通过调用函数名来执行函数体代码
  • 调用的时候千万不要忘记添加小括号

  • 口诀:函数不调用,自己不执行

    注意:声明函数本身并不会执行代码,只有调用函数时才会执行函数体代码。

3.函数的封装

  • 函数的封装是把一个或者多个功能通过函数的方式封装起来,对外只提供一个简单的函数接口

  • 简单理解:封装类似于将电脑配件整合组装到机箱中 ( 类似快递打包)

1.8.3 函数的参数

函数参数语法
在这里插入图片描述
函数形参和实参数量不匹配时
在这里插入图片描述

1.8.4 函数的返回值

在这里插入图片描述

1.8.5 arguments的使用

在这里插入图片描述

1.9 作用域

1.9.1 作用域概述

在这里插入图片描述

1.9.2 全局作用域

作用于所有代码执行的环境(整个 script 标签内部)或者一个独立的 js 文件。

1.9.3 局部作用域

作用于函数内的代码环境,就是局部作用域。 因为跟函数有关系,所以也称为函数作用域。

1.9.4 JS没有块级作用域

在这里插入图片描述

1.9.5 变量的作用域

在这里插入图片描述

1.9.6 作用域链

只要是代码都一个作用域中,写在函数内部的局部作用域,未写在任何函数内部即在全局作用域中;如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域;根据在**[内部函数可以访问外部函数变量]**的这种机制,用链式查找决定哪些数据能被内部函数访问,就称作作用域链

在这里插入图片描述

1.9.7 预解析

JavaScript 代码是由浏览器中的 JavaScript 解析器来执行的。
JavaScript 解析器在运行 JavaScript 代码的时候分为两步:预解析和代码执行。

  • 预解析:在当前作用域下, JS 代码执行之前,浏览器会默认把带有 var 和 function 声明的变量在内存中进行提前声明或者定义。

  • 代码执行: 从上到下执行JS语句。

    预解析会把变量和函数的声明在代码执行之前执行完成。

在这里插入图片描述

2.0 对象

2.0.1 对象的相关概念

什么是对象?
在 JavaScript 中,对象是一组无序的相关属性和方法的集合,所有的事物都是对象,例如字符串、数值、数组、函数等。

对象是由属性和方法组成的。

  • 属性:事物的特征,在对象中用属性来表示(常用名词)
  • 方法:事物的行为,在对象中用方法来表示(常用动词)

为什么需要对象?

保存一个值时,可以使用变量,保存多个值(一组值)时,可以使用数组。
如果要保存一个人的完整信息呢?
例如,将“张三疯”的个人的信息保存在数组中的方式为:

var obj = {
    "name":"张三疯",
    "sex":"男",
    "age":128,
    "height":154
}

2.0.2 创建对象的三种方式

1.利用字面量创建对象

就是花括号 { } 里面包含了表达这个具体事物(对象)的属性和方法;{ } 里面采取键值对的形式表示

键:相当于属性名
值:相当于属性值,可以是任意类型的值(数字类型、字符串类型、布尔类型,函数类型等)

var star = {
    name : 'pink',
    age : 18,
    sex : '男',
    sayHi : function(){
        alert('大家好啊~');
    }
};

2.利用 new Object 创建对象
创建空对象:

var andy = new Obect();

给空对象添加属性和方法:

andy.name = 'pink';
andy.age = 18;
andy.sex = '男';
andy.sayHi = function(){
    alert('大家好啊~');
}

注意:

  • Object() :第一个字母大写
  • new Object() :需要 new 关键字
  • 使用的格式:对象.属性 = 值;

3. 利用构造函数创建对象

在这里插入图片描述

4.对象的使用
访问对象的属性:

console.log(star.name)     // 调用名字属性
console.log(star['name'])  // 调用名字属性

调用对象的方法

star.sayHi();              // 调用 sayHi 方法,注意,一定不要忘记带后面的括号

5.遍历对象
在这里插入图片描述

2.1 内置对象

2.1.1 Math对象

属性、方法名功能
Math.PI圆周率
Math.floor()向下取整
Math.ceil()向上取整
Math.round()四舍五入版 就近取整 注意 -3.5 结果是 -3
Math.abs()绝对值
Math.max()/Math.min()求最大和最小值
Math.random()获取范围在[0,1)内的随机值

注意:上面的方法使用时必须带括号

function getRandom(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min; 
}

2.1.2 日期对象

使用Date实例化日期对象

获取当前时间必须实例化:
var now = new Date();

获取指定时间的日期对象:
var future = new Date('2019/5/1');

注意:如果创建实例时并未传入参数,则得到的日期对象是当前时间对应的日期对象

使用Date实例的方法和属性
在这里插入图片描述
通过Date实例获取总毫米数

// 实例化Date对象
var now = new Date();
// 1. 用于获取对象的原始值
console.log(date.valueOf())	
console.log(date.getTime())	
// 2. 简单写可以这么做
var now = + new Date();			
// 3. HTML5中提供的方法,有兼容性问题
var now = Date.now();

2.1.3 数组对象

检测是否为数组
在这里插入图片描述
添加删除数组元素的方法
在这里插入图片描述
数组排序
在这里插入图片描述
数组索引方法
在这里插入图片描述
数组转换为字符串
在这里插入图片描述
其他方法
在这里插入图片描述

2.1.4 字符串对象

基本包装类型
在这里插入图片描述
字符串的不可变
在这里插入图片描述
根据字符返回位置
在这里插入图片描述
根据位置返回字符
在这里插入图片描述
字符串操作方法
在这里插入图片描述

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-17 15:18:45  更:2021-08-17 15:18:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/26 16:22:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计