JavaScript-6

1.预解析

复制代码
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6             <script>
 7                 /* 
 8                     1.我们js引擎运行js 分为两步:预解析 代码执行
 9                         -预解析 js引擎会把js里面所有的var还有function提升到当前作用域的最前面
10                         -代码执行 按照代码书写的顺序从上往下执行
11                     2.预解析分为 变量预解析(变量提升)和函数预解析(函数提升)
12                         -变量提升 就是把所有的变量声明提升到当前作用域的最前面 不提升赋值操作
13                         -函数提升 就是把所有的函数声明提升到当前作用域的最前面 不调用函数
14                  */
15                 //函数表达式 调用必须写在函数表达式的下面
16                 fun();
17                 function fun(){
18                     //var a = 9 ; c = 8 ; b = 9;
19                     //a作为局部变量,而b、c作为全局变量
20                     var a = b = c = 9;
21                     console.log(a);//9
22                     console.log(b);//9
23                     console.log(c);//9
24                 }
25                 console.log(b);//9
26                 console.log(c);//9
27                 console.log(a);//a is not defined
28             </script>
29     </head>
30     <body>
31     </body>
32 </html>
复制代码

 2.对象

  • 对象的含义

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

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

    • 属性:事务的特征,在对象中用属性来表示(常用名词)
    • 方法:事务的行为,在对象中用方法来表示(常用动词)
  • 变量属性函数方法的区别
复制代码
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6             <script>
 7                 //变量、属性、函数、方法的区别
 8                 //1.变量和属性的相同点 它们都是用来存储数据的
 9                 var num = 56;
10                 var obj = {
11                     age : 18,
12                     
13                 };
14                 //变量 单独声明并赋值 使用的时候直接写变量名 单独存在
15                 //属性 在对象里面不需要声明的 使用的时候必须是 对象.属性
16                 //2.函数和方法的相同点 都是实现某种功能 做某件事
17                 function fun(){
18                     alert("have fun~~");
19                 }
20                 var obj1 = {
21                     say:function(){
22                         alert("Hi");
23                     }
24                 }
25                 //函数是单独声明 并且调用的 函数名() 单独存在的
26                 //方法在对象里面 调用的时候 对象.方法()
27                 fun();
28                 obj1.say();
29             </script>
30     </head>
31     <body>
32     </body>
33 </html>
复制代码
  • 创建对象的方式
    • 利用字面量创建对象:就是{ }里面包含了表达这个具体事物(对象)的属性和方法
    • 利用new Object创建对象
    • 利用构造函数创建对象
复制代码
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6             <script>
 7                 //1.利用字面量创建对象{}
 8                 //var obj = {};    创建了一个空对象
 9                 var obj = {
10                     name:'张三丰',
11                     age:99,
12                     sayHi:function(){
13                         console.log("教你打太极");
14                     }
15                 };
16                 /* 
17                     ①{ }里面的属性或者方法我们采取键值对的形式    键 属性名 : 值 属性值 
18                     ②.多个属性或者方法中间用,隔开
19                     ③.方法冒号后面跟的是一个匿名函数
20                     ④.调用对象的属性 我们采取的是 对象名.属性名   .我们理解为"的"
21                     ⑤.调用属性海鸥一种方法对象名['属性名']
22                  */
23                 console.log(obj.name);
24                 console.log(obj['age']);
25                 //2.利用new Object创建对象
26                 var obj2 = new Object();//创建了一个空的对象
27                 obj2.name = '张无忌';
28                 obj2.age = 25;
29                 obj2.sex = "";
30                 /* 
31                     ①我们利用等号 = 赋值的方法 添加对象的属性和方法
32                     ②每个属性和方法之间用;分号结束
33                  */
34                 console.log(obj2);
35                 //3.利用构造函数创建对象。
36                 /* 
37                     使用构造函数的原因
38                         -因为我们前两种创建对象的方式一次只能创建一个对象,某些情况下我们创建的对象
39                         里面的很多属性和方法是大量相同的,我们只能赋值。因此我们可以利用函数的方法
40                         重复这些代码,我们把这个函数称为构造函数。因为这个函数里面封装的是对象。
41                  */
42                 //利用构造函数创建四大天王的对象
43                 /* 
44                     function 构造函数名(){
45                         this.属性 = 值;
46                         this.方法 = function(){
47                             
48                         }
49                     }
50                     new 构造函数名
51                  */
52                 function Star(uname,age,sex){
53                     this.name = uname;
54                     this.age = age;
55                     this.sex = sex;
56                     
57                 }
58                 var ldh = new Star('刘德华',18,'');//调用函数返回的是一个对象
59                 //1.构造函数名的首字母要大写
60                 //2.我们构造函数不需要return 就可以返回结果
61                 console.log(ldh);
62                 //3.我们调用构造函数必须使用new
63                 //4.我们只要new Star() 调用函数就创建了一个对象
64                 //5.我们的属性和方法前必须添加this
65             </script>
66     </head>
67     <body>
68     </body>
69 </html>
复制代码
  • 构造函数和对象的区别
    • 对象是一个具体的事物 
    • 构造函数泛指的某一大类 它类似于java语言里面的 类
    • 我们利用构造函数创建对象的过程也称为对象的实例化
  • new关键字的执行过程
复制代码
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6             <script>
 7                 /* 
 8                     1.new构造函数可以在内存中创建一个空的对象
 9                     2.this就会执行刚才创建的对象
10                     3.执行构造函数里面的代码 给这个空的对象那个添加属性和方法
11                     4.返回这个对象
12                  */
13             </script>
14     </head>
15     <body>
16     </body>
17 </html>
复制代码
  • 遍历对象
复制代码
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6             <script>
 7                 //遍历对象
 8                 var obj = {
 9                     name:'周芷若',
10                     age:18,
11                     sex:''
12                 };
13                 for(var k in obj){
14                     console.log(k);//k 变量输出 得到的是属性名
15                     console.log(obj[k]);//obj[k]得到的是属性值
16                 }
17                 //我们使用for...in...里面的变量我们喜欢写k或者key
18             </script>
19     </head>
20     <body>
21     </body>
22 </html>
复制代码

3.内置对象

    • JavaScript中的对象分为3中:自定义对象、内置对象、浏览器对象
    • 前两种是JS内容基础对象,属于ECMAScript;第三个属于我们JS独有的浏览器对象
    • 内置对象就是JS语言自带的一些对象,这些对象供开发者使用,并提供了一些常用的或是基本而必要的功能
    • JavaScript提供了Math、String、Date等内置对象
  • Math对象
复制代码
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6             <script>
 7                 //Math数学对象,不是一个构造函数,所以我们不需要new来调用而是直接使用里面的属性和方法
 8                 console.log(Math.PI);//Math的一个属性 圆周率
 9                 //1.绝对值方法
10                 console.log(Math.abs(1));
11                 console.log(Math.abs(-1));
12                 console.log(Math.abs('-1'));//隐式转换 会把字符型的'1'转换为数字型
13                 console.log(Math.abs('灭绝师太'));//NaN
14                 //2.取整方法
15                 console.log(Math.floor(1.9));//1  向下取整,小数点后面的数字全部舍去
16                 console.log(Math.ceil(1.000001));//2   向上取整,小数点后的数字全部收入
17                 console.log(Math.round(1.4));//1    四舍五入,就近取整 注意:其他数都是四舍五入 只有.5是往数字变大了的方向取
18                 console.log(Math.round(1.5));//2
19                 console.log(Math.round(-2.5));//-2
20                 console.log(Math.round(-2.6));//-3
21                 //3.随机数 random()
22                 /* 
23                     1.random()返回一个随机的小数[0,1)
24                     2.这个方法里面不跟参数
25                     3.得到两个数之间的随机整数,包括这两个整数
26                         function getRandom(){
27                             var rand = Math.floor(Math.random()*(max-min+1))+min
28                             return rand;
29                         }
30                  */
31             </script>
32     </head>
33     <body>
34     </body>
35 </html>
复制代码
  • 日期对象
    • 日期对象的基本方法
复制代码
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6             <script>
 7                 //Date()日期对象 是一个构造函数 必须使用new来调用创建我们的日期对象
 8                 var arr = new Array();//创建了一个数组对象
 9                 var obj = new Object();//创建了一个对象实例
10                 //1.使用Date 如果没有参数 返回当前时间
11                 var date = new Date();
12                 console.log(date);
13                 //2.参数常用的写法 数字型 2019,10,01 或者是 字符串型 '2019-10-1 00:00:00'
14                 var date1 = new Date("2023-3-5 00:00:00");
15                 console.log(date1);
16                 //3.日期格式化 年月日
17                 console.log(date.getFullYear());//返回当前日期的年2022
18                 console.log(date.getMonth()+1);//月份 返回的月份小1月 记得月份加1
19                 console.log(date.getDate());//返回的是几号
20                 console.log(date.getDay());//周一返回的是1 周六返回的是六 但是周日返回的是0
21                 console.log(date.getHours());//获取当前时间的小时
22                 console.log(date.getMinutes())//
23                 console.log(date.getSeconds());//
24             </script>
25     </head>
26     <body>
27     </body>
28 </html>
复制代码
    • 时间戳
复制代码
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6             <script>
 7                 //Date对象是基于1970年1月1日(世界标准时间)起的毫秒数
 8                 //1.通过 valueOf()、getTime()
 9                 var date = new Date();
10                 //就是我们现在的时间距离1970-1-1的总的毫秒数
11                 console.log(date.valueOf());
12                 console.log(date.getTime());
13                 //2.简单的写法
14                 var date1 = +new Date();
15                 console.log(date1);
16                 //3.H5 新增的 获得总的毫秒数
17                 console.log(Date.now());
18             </script>
19     </head>
20     <body>
21     </body>
22 </html>
复制代码
    • 倒计时
复制代码
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6             <script>
 7                 /* 
 8                     倒计时
 9                     1.核心算法:输入的时间减去现在的时间就是剩余的时间,即倒计时
10                     2.使用时间戳来做。用户输入时间总的毫秒数减去现在时间的总的毫秒数 得到的就是剩余时间的毫秒数
11                     3.把剩余时间总的毫秒数转换为天、时、分、秒(时间戳转换为时分秒)
12                     转换公式:
13                     day: d = parseInt(秒/60/60/24);    //计算天数
14                     hours: h = parseInt(秒/60/60%24);    //计算小时
15                     minute: m = parseInt(秒/60%60);    //计算分钟
16                     seconds: s = parseInt(秒%60);    //计算秒数
17                  */
18                 function countDown(time){
19                      var now = +new Date() / 1000;
20                      var inputTime = +new Date(time) / 1000;
21                      var times = now - inputTime;
22                      var d = parseInt(times/60/60/24);
23                      var h = parseInt(times/60/60%24);
24                      var m = parseInt(times/60%60);
25                      var s = parseInt(times%60);
26                      return d+''+h+""+m+''+s+'';
27                 }
28                 alert(countDown("2022-3-14 0:0:0"));
29             </script>
30     </head>
31     <body>
32     </body>
33 </html>
复制代码
  • 数组对象
    • 创建数组
复制代码
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6         <script>
 7             //创建数组的两种方式
 8             //1.利用数组字面量
 9             var arr = [1,2,3];
10             console.log(arr[2]);
11             //2.利用new Array()
12             var arr1 = new Array();//创建了一个空的数组
13             arr1 = new Array(2);//这个2表示数组的长度为2 里面有两个空的数组元素
14             console.log(arr1);
15             arr1 = new Array(1,2,3);//等价于[1,2,3] 这样写表示里面有3个数组元素 分别是1,2,3
16             console.log(arr1);
17         </script>
18     </head>
19     <body>
20     </body>
21 </html>
复制代码
    • 检测是否为数组
复制代码
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6         <script>
 7             //检测是否为数组
 8             //1.instanceof 运算符 它可以用来检验是否为数组
 9             var arr = [1,2,3];
10             var str = "1,2,3";
11             console.log(arr instanceof Array);
12             console.log(str instanceof Array);
13             //2.Array.isArray(参数)    h5支持的方法 ie9以上版本支持
14             console.log(Array.isArray(arr));
15             console.log(Array.isArray(str));
16             
17         </script>
18     </head>
19     <body>
20     </body>
21 </html>
复制代码
    • 添加删除数组元素
方法名 说明 返回值
push(参数1......) 末尾添加一个或多个元素,注意修改原数组 并返回新的长度
pop() 删除数组最后一个元素,把数组长度减1 无参数 修改原数组 返回它删除的元素的值
unshift(参数1......) 向数组的开头添加一个或更多元素,注意修改原数组 并返回新的长度
shift() 删除数组的第一个元素,数组长度减1无参数,修改原数组 并返回第一个元素的值
复制代码
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6             <script>
 7                 /*  
 8                     1.push()在我们数组的末尾添加一个或多个数组元素
 9                         -push是可以给数组追加新的元素
10                         -push()参数直接写数组元素就可以了
11                         -push完毕后,返回的结果是新的数组的长度
12                         -原数组也会发生变化
13                 */
14                 var arr = [1,2,3];
15                 arr.push(4,'张无忌',true);
16                 console.log(arr);
17                 console.log(arr.push(4,'张无忌',true));
18                 /* 
19                     2.unshift()在我们数组的开头添加一个或多个数组元素
20                         -unshift()是可以给数组前面追加新的元素
21                         -unshift()参数直接写数组元素就可以了
22                         -unshift()完毕之后返回的结果是新数组的长度
23                         -原数组也会发生变化
24                  */
25                 arr.unshift(0);
26                 console.log(arr);
27                 /* 
28                     3.pop()它可以删除数组最后的一个元素
29                         -pop()是可以删除数组最后一个元素 记住一次只能删除一个元素
30                         -pop()没有参数
31                         -pop()完毕后 返回的结果是删除的那个元素
32                         -原数组也会发生变化
33                  */
34                 arr.pop();
35                 var result = arr.pop();
36                 console.log(arr);
37                 console.log(result);
38                 /* 
39                     4.shift()它可以删除数组的第一个元素
40                         -shift()是可以删除数组的第一个元素 记住一次只能删除一个元素
41                         -shift()没有参数
42                         -shift完毕之后,返回的结果是删除的那个元素
43                         -原数组也会发生变化
44                  */
45             </script>
46     </head>
47     <body>
48     </body>
49 </html>
复制代码
    • 数组排序
方法名 说明 是否修改原数组
reserve() 点到数组中元素的顺序,无参数 该方法会改变原来的数组,并返回新的数组
sort() 对数组的元素进行排序 该反方会改变原来的数组,返回新的数组
复制代码
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6         <script>
 7             //1.数组反转
 8             var arr = [1,2,3,4];
 9             arr.reverse();
10             console.log(arr);
11             //2.数组排序(冒泡排序)
12             var arr1 = [56,7,94,61];
13             arr1.sort(function(a,b){
14                 // return a-b;//升序
15                 return b-a;//降序
16             });
17             console.log(arr1);
18         </script>
19     </head>
20     <body>
21     </body>
22 </html>
复制代码
    • 数组索引方法
方法名 说明 返回值
indexOf() 数组中查找给定元素的第一个索引 如果存在返回索引号,如果不存在,则返回-1
lastIndexOf() 在数组中的最后一个索引 如果存在返回索引号,如果不存在,则返回-1
    • 数组转换为字符串
方法名 说明 返回值
toString() 把数组转换成字符串,逗号分隔每一项 返回一个字符串
join('分隔符') 方法用于把数组中的所有元素转换为一个字符串 返回一个字符串
复制代码
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6         <script>
 7             //1.toString()把我们的数组转换为字符串
 8             var arr = [1,2,3];
 9             console.log(arr.toString());//1,2,3
10             //2.join(分隔符)
11             console.log(arr.join('ヾ(◍°∇°◍)ノ゙'));
12         </script>
13     </head>
14     <body>
15     </body>
16 </html>
复制代码
    • 补充方法
方法名 说明 返回值
concat() 连接两个或多个数组,不影响原数组 返回一个新的数组
slice() 数组截取(begin,end) 返回被截获的新数组
splice() 数组删除splice(第几个开始,要删除个数) 返回被删除项目的新数组,注意:这个会影响原数组
复制代码
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6         <script>
 7             var arr = [1,2,3,4,5,6];
 8             var arr1 = ["(*^▽^*)","٩(๑>◡<๑)۶","⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄"];
 9             //concat()不会对原数组产生影响,返回组合后的一个新数组
10             var result = arr.concat(arr1);
11             console.log(result);
12             //slice()不会对原数组产生影响,返回的是被截取的数组
13             //注意后面的索引号的数组元素不会被截取,类似于左闭右开
14             result= arr.slice(0,2);
15             console.log(result);
16             //splice()会对原数组产生影响,将原数组分割为剩下的数组和被截取的数组
17             //剩下的作为原数组,被截取的部分则作为返回值
18             result = arr.splice(0,3);
19             console.log(arr);
20             console.log(result);
21         </script>
22     </head>
23     <body>
24     </body>
25 </html>
复制代码
  • 字符串对象
    • 基本包装类型
复制代码
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6             <script>
 7                 //基本包装类型
 8                 var str = "amusementPark";
 9                 console.log(str.length);
10                 //对象和复杂数据类型才有属性和方法 
11                 /* 
12                     基本包装类型:
13                         就是把简单数据类型包装成为了复杂数据类型
14                     创建过程:
15                         1.把简单数据类型包装为复杂数据类型
16                         2.把临时变量的值给str
17                         3.销毁这个临时变量
18                  */
19             </script>
20     </head>
21     <body>
22     </body>
23 </html>
复制代码
    • 字符串不可变

由于在定义字符串并赋值时,内存开辟了一定的空间存放这个值,当重新给字符串赋值时,系统又会开辟出新的空间对新值进行存放。所以如果频繁的更改字符串的值,就会导致系统内存空间被浪费,严重可导致系统迟缓。

    • 根据字符串返回位置

字符串的所有方法,都不会修改字符串本身(字符串是不可变的),操作完成会返回一个新的字符

复制代码
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6             <script>
 7                 //根据字符返回位置
 8                 //str.indexOf('要查找的字符',[起始的位置])
 9                 var str = "改革春风吹满地";
10                 console.log(str.indexOf(""));
11             </script>
12     </head>
13     <body>
14     </body>
15 </html>
复制代码
    • 根据位置返回字符
方法名 说明 使用
charAt(index) 返回指定位置的字符(index 字符串的索引号) str.charAt(0)
charCodeAt(index) 返回指定位置的字符的ASCII码(index 字符串的索引号) str.charCodeAt(0)
str[index] 获取指定位置字符 HTML、IE8+支持和charAt()等效

 

复制代码
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6             <script>
 7                 //1.charAt(index)根据位置返回字符
 8                 var str = "tomato";
 9                 console.log(str.charAt(2));//m
10                 //2.charCodeAt(index)返回相应位置的字符ASCII码
11                 //判断用户按下了哪个键
12                 console.log(str.charCodeAt(2));//109
13                 //3.str[index] H5新增的
14                 console.log(str[0]);
15             </script>
16     </head>
17     <body>
18     </body>
19 </html>
复制代码
    • 字符串操作方法
方法名 说明
concat(str1,str2......) 用于连接两个或多个字符串,拼接字符串,等效于+,+更实用
substr(start,length) 从start位置开始(索引号),length取的个数,重点记这个
slice(start,end) 从start位置开始,截取到end位置,end取不到(它们都是索引号)
substring(start,end) 从start位置开始,截取到end位置,end取不到,基本和slice相同,但是不接受负值
复制代码
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6             <script>
 7                 //1.charAt(index)根据位置返回字符
 8                 var str = "tomato";
 9                 console.log(str.charAt(2));//m
10                 //2.charCodeAt(index)返回相应位置的字符ASCII码
11                 //判断用户按下了哪个键
12                 console.log(str.charCodeAt(2));//109
13                 //3.str[index] H5新增的
14                 console.log(str[0]);
15             </script>
16     </head>
17     <body>
18     </body>
19 </html>
复制代码
    • 其他方法
复制代码
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6             <script>
 7                 //1.替换字符串 replace('被替换的字符','替换为的字符')
 8                 //它只会替换第一个字符
 9                 var str = 'andy';
10                 console.log(str.replace('a','b'));
11                 //2.字符转换为数组 split('分隔符')
12                 var str2 = 'blue,purple,pink,gray';
13                 console.log(str2.split(','));
14                 //转换为大写
15                 console.log(str.toUpperCase());
16                 var str3 = 'LOVE';
17                 //转换为小写
18                 console.log(str3.toLowerCase());
19             </script>
20     </head>
21     <body>
22     </body>
23 </html>
复制代码
    • 练习题
复制代码
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6         <script>
 7             var str = "abaasdffggghhjjkkgfddsssss3444343";
 8             console.log("字符串的长度为:"+str.length);
 9             console.log(str.charAt(0)+","+str.charAt(3)+","+str.charAt(5)+","+str.charAt(9));
10             console.log(str.indexOf('i')+","+str.indexOf('c')+","+str.indexOf('b'));
11             console.log(str.replace('g',22))
12             console.log(str.replace('ss','b'))
13             var result = str.slice(1,6);
14             console.log(result);
15             str = "abaasdffggghhjjkkgfddsssss3444343";
16             var obj = {};
17             for(var i = 0 ; i < str.length ; i++){
18                 var charts = str.charAt(i);
19                 if(obj[charts]){
20                     obj[charts]++;
21                 }else{
22                     obj[charts] = 1;
23                 }
24             }
25             var key = str[0];
26             for (var k in obj){
27                 if(obj[key] < obj[k]){
28                     key = k;
29                 }
30             }
31             console.log("出现次数最多的字符为:"+key+"出现的次数为"+obj[key]);
32         </script>
33     </head>
34     <body>
35     </body>
36 </html>
复制代码

 

posted @   Miraitowa56  阅读(43)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示