JavaScript-21

1.ES6数值

  • 新增属性
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6     </head>
 7     <body>
 8         <script type="text/javascript">
 9             //ES6数值的表示
10             //1.二进制写法:前缀0b或者0B
11             console.log(0b11 === 3);//true
12             console.log(0B11 === 3);//true
13             //2.八进制表示新写法:前缀0o或者0O
14             console.log(0o11 === 9);//true
15             console.log(0O11 === 9);//true
16             //3.常量
17             //该属性表示1与大于1的最小浮点数之间的插
18             console.log(Number.EPSILON);//2.220446049250313e-16
19             //4.最大最小安全整数
20             //安全整数表示在JS中能够精确表示的整数
21             //最大安全整数为2^53-1
22             Number.MAX_SAFE_INTEGER
23             //最小安全整数1-2^53
24             Number.MIN_SAFE_INTEGER
25         </script>
26     </body>
27 </html>
  • 方法更改
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6     </head>
 7     <body>
 8         <script type="text/javascript">
 9             //Number对象新方法
10             //1.Number.isFinite()检测一个数值是否为有限的
11             console.log(Number.isFinite(1));
12             console.log(Number.isFinite(Infinity));
13             //注意:此方法没有隐式转换所有非数值都返回false
14             //2.Number.isNaN()用于检测一个数值是否为NaN
15             //注意在全局的isNaN中存在隐式转换,会提前将非数值转化为数值
16             //Number.isNaN()不存在隐式转换,所有非NaN全部返回false
17             /* 
18                 3.从全局移植到Number对象的方法
19                     -Number.parseInt():不指定进制时,默认是10进制
20                     -Number.parseFloat()
21                     -Number.isInteger()
22                     -Number.isSafeInteger():用于判断数值是否在安全范围内
23              */
24         </script>
25     </body>
26 </html>

2.Math对象的扩展

  • ES6在Math对象上新增了17个数学相关的今天方法
方法 说明
Math.cbrt 用于计算一个数的立方根(会对非数值进行转换,非数值且无法转换为数值时返回NaN)
Math.imul 大多数情况,形同a*b,特殊情况下(大数相乘)用于返回大数乘法结果中的低位数值
Math.hypot 用于计算所有参数的平方和的平方根
Math.clz32 用于返回32位无符号整数形式的前导0的个数
Math.trunc 用于返回数字的整数部分(会对非数值进行转换,非数值且无法转换为数值时返回NaN)
Math.fround 用于获取数字的32位单精度浮点数形式(参数为NaN或Infinity时返回本身,会进行转换)
Math.sign 判断数值的符号(正、负、0)(会对非数值进行转换,非数值且无法转换为数值时返回NaN)
Math.expm1 用于计算e的x次方-1的结果(会对非数值进行转换,非数值且无法转换为数值时返回NaN)
Math.log1p 用于计算1+x的自然对数,即Math.log(1+x)
Math.log10 用于计算以10为底的对数
Math.log2 用于计算以2为底的对数
Math.sinh 用于计算双曲正弦
Math.cosh 用于计算双曲余弦
Math.tanh 用于计算双曲正切
Math.asinh 用于计算反双曲正弦
Math.acosh 用于计算反双曲余弦
Math.atanh 用于计算反双曲正切
  • 指数运算符** 
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6     </head>
 7     <body>
 8         <script type="text/javascript">
 9             //指数运算符
10             console.log(2**2);//4
11             console.log(2**2**2);//16
12         </script>
13     </body>
14 </html>

 3.ES6对象

  • 对象字面量
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6     </head>
 7     <body>
 8         <script type="text/javascript">
 9             //1.属性的简介表示方式
10             const age = 12;
11             let obj = {age};
12             console.log(obj);//{age: 12}
13             //2.方法名简写
14             obj = {
15                 sayHi(){
16                     console.log("Hi");
17                 }
18             }
19             obj.sayHi();
20             //注意如果是Generator函数,则要在前面加一个*号
21             //3.属性名表达式
22             //ES6允许用表达式作为属性名但必须将表达式放在方括号里
23             obj = {
24                 ["lo"+"ve"]:'BH'
25             }
26             //注意:属性的简洁表达式不可以与属性同时使用,否则会报错
27             console.log(obj);
28         </script>
29     </body>
30 </html>
  • 对象新方法
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6     </head>
 7     <body>
 8         <script type="text/javascript">
 9             //1.Object.assign(target,source_1...)浅拷贝
10             //用于将源对象中所有可枚举的属性复制到目标对象中
11             let target = {a:1};
12             let source_1 = {b:2};
13             let source_2 = {c:3};
14             //如果目标对象和源对象有同名属性,或者多个源对象有同名属性,则后面的会覆盖前面的
15             //该函数如果只有一个参数,当参数为对象时,直接返回该对象,否则,就将其转换为对象后再返回
16             //注意:null和undefined不能转换为对象否则会报错
17             Object.assign(target,source_1,source_2);
18             console.log(target);
19             //2.Object.is用来比较两个值是否严格相等,与===基本类似
20             console.log(Object.is('p','p'));//true
21             console.log(Object.is([1],[1]));//false
22             //注意:与===的区别
23             console.log(+0===-0);//true
24             console.log(Object.is(+0,-0));//false
25             console.log(Object.is(NaN,NaN));//true
26             console.log(NaN === NaN);//false
27         </script>
28     </body>
29 </html>

4.ES6数组

  •  数组创建
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6     </head>
 7     <body>
 8         <script type="text/javascript">
 9             //数组创建
10             //1.Array.of()将参数中所有值作为元素形成数组
11             //    -参数值可以为不同的类型
12             //    -当参数为空时返回空数组
13             console.log(Array.of(1,true,NaN,undefined,'1'));
14             //2.Array.from(arrLike,fun,thisArg)将类数组对象或可迭代对象转换为数组
15             //    -arrayLike:想要转换的类数组或可迭代对象
16             //    -fun:可选,用于对每个元素进行处理,放入数组的都是处理后的元素
17             //    -thisArg:可选,用于指定map函数执行时的this对象
18         </script>
19     </body>
20 </html>
  • 扩展的方法
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6     </head>
 7     <body>
 8         <script type="text/javascript">
 9             //1.find()
10             //查找数组中符合条件的元素,有多个符合条件的元素则返回第一个
11             let arr = Array.of(1,2,3,4);
12             console.log(arr.find(item=>item>1));//2
13             //2.findIndex()
14             //查找数组中符合条件的元素索引,所有多个符合条件的,则返回第一个
15             console.log(arr.findIndex(item=>item>2));//2
16             //3.fill()
17             //参数一:用来填充的值,参数二:被填充的起始索引,参数三:被填充的结束索引,默认为数组尾
18             //将一定范围内索引的数组元素内容填充为单个指定的值
19             // console.log(arr.fill(1,1));//[1, 1, 1, 1]
20             //4.copyWithin()
21             //将一定范围索引的数组元素修改为此数组另一指定范围索引的元素
22             //参数一:被修改的起始索引,
23             //参数二:被用来覆盖的数据起始索引
24             //参数三:被用来覆盖的数据的结束索引,默认为数组末尾
25             // console.log(arr.copyWithin(0,2,4))//[3, 4, 3, 4]
26             /* 
27                 5.遍历:for…of…
28                     -entries():遍历键值对
29                     -keys():遍历键名
30                     -values():遍历键值
31              */
32             for(item of arr.entries()){
33                 console.log(item);
34             }
35             //6.包含includes
36             //数组是否包含指定的值
37             //参数一:包含的指定值 参数二:可选,搜索的起始索引
38             //注意:如果存在NaN的包含判断与其他值无异
39             console.log(arr.includes(1));//true
40             //7.flat()嵌套数组转换为一位数组默认转换层数是两层,注意:自动跳过空位
41             console.log([1,2,[3,[4,5]]].flat());//[1, 2, 3, Array(2)]
42             //不管嵌套多少层,可以指定转换的嵌套层数
43             console.log([1,2,[3,[4,5]]].flat(Infinity));// [1, 2, 3, 4, 5]
44             //7.flatMap()先对数组中的每个元素进行处理,再对数组执行flat方法
45             //参数一:遍历函数,该遍历函数可接受三个参数,当前元素,当前元素索引,原数组
46             //参数二:指定遍历函数中,this的指向
47             console.log([1,2,3].flatMap(item=>item*2));//[2, 4, 6]
48         </script>
49     </body>
50 </html>
  • 创建数组缓冲区
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6     </head>
 7     <body>
 8         <script type="text/javascript">
 9             //通过构造函数创建数组缓冲区
10             let buffer = new ArrayBuffer(10);
11             console.log(buffer.byteLength);//10
12             //分割已有的数组缓冲区
13             let buffer1 = buffer.slice(2,6);
14             console.log(buffer1.byteLength);//4
15         </script>
16     </body>
17 </html>
  • 视图
    • 视图是用来操作内存的接口
    • 视图可以操作数组缓冲区或缓冲区字节的子集,并按照其中一种数值数据类型来读取和写入数据
    • DataView类型是一种通用的数组缓冲区视图,其支持8中数值型数据类型
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6     </head>
 7     <body>
 8         <script type="text/javascript">
 9             //默认DataView可操作数组缓冲区全部内容
10             let buffer = new ArrayBuffer(10);
11             dataView = new DataView(buffer);
12             dataView.setInt8(0,1);
13             console.log(dataView.getInt8(0));//1
14             //通过设定偏移量(参数1)与长度(参数2)指定DataView可操作的字节范围
15             let buffer1 = new ArrayBuffer(10);
16             dataView1 = new DataView(buffer1,0,3);
17             dataView1.setInt8(5,1);//Offset is outside the bounds of the DataView
18         </script>
19     </body>
20 </html>
  • 定型数组
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6     </head>
 7     <body>
 8         <script type="text/javascript">
 9             /* 
10              定型数组
11                 -数组缓冲区的特定类型的视图
12                 -可以强制使用特定的数据诶新,而不是通用的DataView对象来操作数组缓冲区
13              */
14             //创建
15             //1.通过数组缓冲区产生
16             // let buffer = new ArrayBuffer(10);
17             // view = new Int8Array(buffer);
18             // console.log(view.byteLength);
19             //2.通过构造函数
20             let view = new Int32Array(10);
21             console.log(view.byteLength);//40
22             console.log(view.length);//10
23             //不传参时默认长度为0
24             //在这种情况下数组缓冲区分配不到空间,创建的定型数组不能用来保存数据
25             //可接受的参数包括定型数组,可迭代对象,数组,类数组对象
26             let view2 = new Int16Array([1,2]);
27             //注意:length属性不可写,如果尝试更改这个值,在非严格模式会直接忽略该操作
28             //在严格模式会直接抛出错误
29             //定型数组可使用entries()、keys()、values()进行迭代
30             let view1 = new Int16Array([1,2,3]);
31             for(var [key,item] of view1.entries()){
32                 console.log(key+": "+item);
33             }
34         </script>
35     </body>
36 </html>

 

  • 注意
    • find()等方法可用于定型数组,但是定型数组的方法会额外检查数值类型是否安全,也会通过Symbo.species确认方法的返回值是定型数组而非普通的数组
    • concat()方法由于两个定型数组合并结果不确定,故不能用于定型数组
    • 另外,由于定型数组的尺寸不可更改,可以改变数组的尺寸的方法,例如:splice(),不适用于定型数组
    • 所有定型数组都含有of()和from()犯法,区别是普通数组返回普通数组,定型数组返回定型数组
  • set()和subarray()
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6     </head>
 7     <body>
 8         <script type="text/javascript">
 9             //set方法
10             //参数一:一个定型数组或普通数组
11             //参数二:可选,偏移量,开始插入数组的位置,默认为0
12             let view = new Int16Array(4);
13             view.set([1,2]);
14             view.set([3,4],2);
15             console.log(view);//[1,2,3,4];
16             //2.subarray
17             //参数一:可选,开始位置,默认为0
18             //参数二:可选,结束位置(不包含结束位置),默认为数组长度
19             let view1 = new Int16Array([1,2,3,4,5,6]);
20             subview1 = view1.subarray();
21             subview2 = view1.subarray(1);
22             subview3 = view1.subarray(1,4);
23             console.log(subview1);//[1,2,3,4,5,6]
24             console.log(subview2);//[2,3,4,5,6]
25             console.log(subview3);//[2,3,4]
26         </script>
27     </body>
28 </html>

 5.ES6 Class 类

  •  在ES6中,class(类)作为对象的模板被引入,可以通过class关键字定义类,其本质是function
  • 类定义
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6     </head>
 7     <body>
 8         <script type="text/javascript">
 9             //1.匿名类
10             let Example = class{
11                 constructor(a) {
12                     this.a = a;
13                 }
14             }
15             //2.命名类
16             let Stu = class Stu{
17                 constructor(name) {
18                     this.name = name;
19                 }
20             }
21             //注意:
22             //(一)类不可以重复声明
23             //(二)类定义不会被提升,所以必须要在访问前对类进行定义,否则会报错
24             //(三)类中方法不需要加function
25         </script>
26     </body>
27 </html>
  •  类的属性
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6     </head>
 7     <body>
 8         <script type="text/javascript">
 9             ///1.prototype
10             let Exam = class Example{
11                 constructor(a) {
12                     this.a = a;
13                 }
14             };
15             //覆盖方法
16             // Example.prototype = {
17             //     sing(){
18             //         console.log("sing a song");
19             //     }
20             // }
21             // console.log(Example.prototype);
22             //添加方法
23             // Object.assign(Example.prototype,{
24                 
25             // });
26             //2.静态属性
27             //class本身的属性,即直接定义在类内部,不需要实例化
28             //ES6规定 ,Class内部只有静态方法,没有静态属性
29             // Example.b = 'ex';
30             // console.log(Example.b);//'ex'
31             //3.公共属性
32             // Example.prototype.a = 2;
33             //4.实例属性
34             //定义在实例对象(this)上的属性
35             //5.name属性返回跟在class后的类名
36             console.log(Exam.name);//Example
37         </script>
38     </body>
39 </html>

 

  •  类的方法
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6     </head>
 7     <body>
 8         <script type="text/javascript">
 9             class Exam{
10                 //1.costructor方法
11                 //该方法是类的默认方法,创建累的实例化对象时被调用
12                 constructor() {
13                     //默认返回实例对象this
14                     console.log('我是constructor')
15                     //4.实例方法
16                     this.add = (a,b)=>a+b;
17                 }
18                 //2.静态方法
19                 static sum(a,b){
20                     console.log(a+b);
21                 }
22                 //3.原型方法
23                 mult(a,b){
24                     console.log(a*b)
25                 }
26             };
27             new Exam();//我是constructor
28             Exam.sum(1,2);//3
29             let exam = new Exam();
30             exam.mult(1,2);//2
31             console.log(exam.add(1,55));//56
32         </script>
33     </body>
34 </html>

 

  •  decorator
    • decorator是一个函数,用来修改类的行为,在代码编译时起作用
    • 类修饰
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6     </head>
 7     <body>
 8         <script type="text/javascript">
 9             //类修饰
10             //一个参数
11             // function testable(target){//第一个参数target指向类本身
12             //     target.isTestable = 'true';
13             // }
14             // @testable
15             // class Example{}
16             // console.log(Example.isTestable);//true
17             //多个参数--嵌套实现
18             function testable(isTestable){
19                 return function(target){
20                     target.isTestable = isTestable;
21                 }
22             };
23             @testable(true)
24             class Example{}
25             console.log(Example.isTestable);
26         </script>
27     </body>
28 </html>

 

  •  方法修饰
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6     </head>
 7     <body>
 8         <script type="text/javascript">
 9             //方法修饰
10             //3个参数:target(类的原型对象)
11             //name(修饰的属性名)
12             //descriptor(该属性的描述对象)
13             class Exam{
14                 @writable
15                 sum(a,b){
16                     return a+b;
17                 }
18             }
19             function writable(target,name,descriptor){
20                 descriptor.writable = false;
21                 return descriptor;
22             }
23             //修饰器执行顺序,由外向内进入,由内向外执行
24         </script>
25     </body>
26 </html>

 

  •  封装与继承
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6     </head>
 7     <body>
 8         <script type="text/javascript">
 9             //getter不可单独出现,getter和setter必须同级出现
10             class Example{
11                 constructor(a,b) {
12                     this.a = a;
13                     this.b = b;
14                 }
15                 get a(){
16                     console.log('getter');
17                     // return this.a;
18                     return this._a;
19                 }
20                 set a(a){
21                     console.log('setter');
22                     // this.a = a;//自身递归调用
23                     this._a = a;
24                 }
25             }
26             //不断输出setter
27             // let exam = new Example(1,2);//RangeError
28             let exam1 = new Example(1,2);
29             //不会调用getter方法,只输出setter
30             console.log(exam1._a);//1
31         </script>
32     </body>
33 </html>
posted @ 2022-04-24 11:05  Miraitowa56  阅读(66)  评论(0)    收藏  举报