ES6有何新特性?(下篇)

news2024/11/16 9:17:46

目录

函数参数的默认值设置

rest参数

扩展运算符

Symbol

迭代器

生成器

Promise

Class

数值扩展

对象方法扩展

模块化


大家好呀!今天这篇文章继续为大家介绍ES6的新特性,上上上篇文章介绍了一部分,这篇文章会将剩下的部分新增的特性都介绍到。希望对你有帮助!

函数参数的默认值设置

ES6允许给函数参数赋值初始值,可以给形参赋初始的值,并且可以给参数指定默认的值,若给参数没有传入相应的值,则会使用默认的值。

  function add(a,b,c){
            return a+b+c;
        }
  let result=add(1,2);
  console.log(result)//NaN

以上的这种情况,传入的数值与形参的数量不一样,则最后的一个形参则会传入underfine,因此1+2+underfine则会输出NaN。同时我们可以为第三个形参赋默认的值,具有默认值的参数一般都需要放在最后一个。具体代码如下:

 // 形参初始值
 function add(a,b,c=10){
     return a+b+c;
  }
let result=add(1,2);
console.log(result)//13

除此之外,它还可以与解构赋值进行结合。可以使得获取传入的值更加方便。比如我们为一个函数传入一个对象,在函数的内部输出对象中的属性,我们传统的方式可以如下:

function connect(option){
  console.log(option.name)
  console.log(option.age)
  console.log(option.sex)
        }
 connect({
     name:'N-A',
     age:5,
     sex:"男"
 })

以上的方式会让我们觉得比较地麻烦,需要反复地使用option来进行调用,若使用函数参数结合对象解构赋值的方式来实现,则会更加地方便,具体实现如下:(同时也可以与上述的功能一样,为参数赋初始的值)

 function connect({name,age,sex}){
    console.log(name)
    console.log(age)
    console.log(sex)
        }
   connect({
     name:'N-A',
     age:5,
     sex:"男"
     })

rest参数

rest参数主要是用来获取函数的实参。它可以用来替换arguments,与arguments的作用相似。在ES5中使用arguments来获取函数的实参的方法如下:

 function date(){
            console.log(arguments)
        }
 date("N-A","5","男")

输出的结果是一个对象,而使用ES6新增的rest参数输出的结果是一个数组,因此数组更加方便我们对其进行一定的操作。具体的写法如下:

      // rest参数
        function date(...args){
            console.log(args)
        }
        date("N-A","5","男")
        // 若有多个参数,则rest参数必须要放到参数的最后
        function fn(a,b,...args){
            console.log(a);//1
            console.log(b);//2
            console.log(args);//[3,4,5,6,7,8]
        }
        fn(1,2,3,4,5,6,7,8)

注意:若有多个参数,则rest参数必须放到参数的最后。

扩展运算符

扩展运算符能将数组转为逗号分隔的参数序列。他的使用方式也是使用...与rest参数优点相似,但是他们一个是在函数声明时的参数使用,一个是在函数调用时使用。具体用法如下:

        const data=[1,2,3,4]
        function result(){
            console.log(arguments);
        }
        result(...data);//相当于result(1,2,3,4)

扩展运算符还有以下的一些用途,数组的合并,在ES5中我们使用concat可以实现数组的合并,在ES6中使用拓展运算符同样可以实现数组的合并,且更加的方便。

 const data1=[1,2,3,4]
       const data2=[5,6,7,8]
    //    传统的方式
    const result=data1.concat(data2)//[1,2,3,4,5,6,7,8]
    // 扩展运算符
    const result2=[...data1,...data2]//[1,2,3,4,5,6,7,8]

除此之外,扩展运算符还可以实现数组的克隆,但是使用它进行克隆是浅拷贝的克隆。也可以让伪数组变成真正的数组。

    // 数组的克隆
    const data1=[1,2,3,4]
    const data2=[...data1]
    console.log(data2)//[1,2,3,4]
    // 将伪数组变成真数组
    // html部分代码省略
    const divs=document.querySelectorAll("div")
    const divArr=[...divs];
    console.log(divArr)

Symbol

ES6 引入了一种新的原始数据类型 Symbol,表示独一无二的值。它是JavaScript 语言的第七种数据类型,是一种类似于字符串的数据型。

1) Symbol 的值是唯一的,用来解决命名冲突的问题

2) Symbol 值不能与其他数据进行运算

3) Symbol 定义 的 对象属 性 不能 使 用 for…in 循 环遍 历 ,但 是可 以 使 用Reflect.ownKeys 来获取对象的所有键名

        // 创建Symbol
        let s=Symbol();
        let s2=Symbol("N-A");
        let s3=Symbol("N-A");
        console.log(s2==s3);//false
        // 使用Symbol.for创=创建
        let s4=Symbol.for('N-A');
        let s5=Symbol.for('N-A');
        console.log(s4==s5);//true

它可以为对象添加属性和方法,让该属性或者方法是独一无二的,就算原本的对象中有一个同名的方法,它也能够进行添加成功。同时也能够保持其安全性,不会破坏对象原本的属性和方法。

 let plan={
            name:"N-A",
            study(){
                console.log("今天学习ES6");
            },
            sport(){
                console.log("今天去游泳");
            }
        };
        // 声明一个对象
        let methods={
            study:Symbol(),
            sport:Symbol()
        };

        plan[methods.study]=function(){
            console.log("今天学习Vue.js")
        };
        plan[methods.sport]=function(){
            console.log("今天去跑步")
        };
        console.log(plan);
        // 方法二
        let plan={
            name:"N-A",
            [Symbol('study')]:function(){
                console.log("今天学习ES6");
            },
            [Symbol('sport')]:function(){
                console.log("今天去游泳");
            }
        };

除了定义自己使用的 Symbol 值以外,ES6 还提供了 11 个内置的 Symbol 值,指向语言内部使用的方法。可以称这些方法为魔术方法,因为它们会在特定的场景下自动执行。

以第二个例子,其使用方式如下:

const arr=[1,2,3,4];
      const arr2=[5,6,7,8];
    //   不可展开
      arr2[Symbol.isConcatSpreadable]=false;
      console.log(arr.concat(arr2))//[1, 2, 3, 4, Array(4)]

迭代器

迭代器是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署 Iterator 接口,就可以完成遍历操作。

ES6 创造了一种新的遍历命令 for...of 循环,Iterator 接口主要供 for...of 消费。原生具备 iterator 接口的数据(可用 for of 遍历)有:Array、Arguments、Set、Map、String、TypedArray、NodeList。

其工作原理如下:首先创建一个指针对象,指向当前数据结构的起始位置。第一次调用对象的 next 方法,指针自动指向数据结构的第一个成员。接下来不断调用 next 方法,指针一直往后移动,直到指向最后一个成员。每调用 next 方法返回一个包含 value 和 done 属性的对象。

 const study=['ES6','Vue','Webpack','CSS'];
        // 使用for...of遍历数组
        for(let item of study){
            console.log(item)
        }
        // 原理
        let iterator=study[Symbol.iterator]();
        // 调用对象的next方法
        console.log(iterator.next());//{value: 'ES6', done: false}
        console.log(iterator.next());//{value: 'Vue', done: false}
        console.log(iterator.next());//{value: 'Webpack', done: false}
        console.log(iterator.next());//{value: 'CSS', done: false}
        console.log(iterator.next());//{value: undefined, done: true}

它可以用于自定义遍历数据,以一个实例来进行演示,假如有一个对象,对象中有一个两个属性,一个为name,一个为study。study为一个数组,现在需要使用for...of来进行遍历(不考虑其他方式),该如何实现。

  const plan={
            name:'N-A',
            study:[
                'ES6',
                'Webpack',
                'Vue',
                'CSS'
            ],
            [Symbol.iterator](){
                // 声明索引变量
                let index=0;
                return{
                    next:()=>{
                        if(index<this.study.length){
                            const result={value:this.study[index],done:false};
                            index++;
                            return result;
                        }else{
                            return {value:undefined,done:true}
                        }
                        
                    }
                }
            }
            
        }
        for(let item of plan){
            console.log(item)
        }

生成器

生成器函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同。

  function* gen() {
            yield '一只没有耳朵';
            yield '一只没有尾巴';
            yield '真奇怪';
        }
        let iterator = gen();
        console.log(iterator.next());//{value: '一只没有耳朵', done: false}
        console.log(iterator.next());//{value: '一只没有尾巴', done: false}
        console.log(iterator.next());//{value: '真奇怪', done: false}
        console.log(iterator.next());//{value: undefined, done: true}

以上的代码* 的位置没有限制,可以偏左偏右或者处于中间。生成器函数返回的结果是迭代器对象,调用迭代器对象的 next 方法可以得到yield 语句后的值。yield 相当于函数的暂停标记,也可以认为是函数的分隔符,每调用一次 next方法,执行一段代码。next 方法可以传递实参,作为 yield 语句的返回值。

 function * gen(arg){
            console.log(arg);//AAAA
            let one=yield 111;
            console.log(one);//BBB
            let two=yield 222;
            console.log(two);;//CCC
            let three=yield 333;
            console.log(three);//DDD
        }
        let iterator=gen('AAAA');
        console.log(iterator.next());
        // next方法传入实参
        console.log(iterator.next('BBB'));
        console.log(iterator.next('CCC'));
        console.log(iterator.next('DDD'));

同时还可以在next()中传入实参,传入的数据会作为上一次yield语句的返回结果。

应用实例如下:现在我们需要实现1s之后在控制台打印111,然后再过2s之后在控制台打印222,在过3s之后在打印333。可以使用传统的函数回调进行实现,但是代码的可读性以及维护性并不好,同时也会存在回调地狱的问题,因此使用生成器来实现具体如下:

 function one(){
        setTimeout(()=>{
            console.log(111);
            iterator.next();

        },1000)
      }
      function two(){
        setTimeout(()=>{
            console.log(222);
            iterator.next();
        },2000)
      }

      function three(){
        setTimeout(()=>{
            console.log(333);
            iterator.next();
        },3000)
      }
      function * gen(){
        yield one();
        yield two();
        yield three();
      }
    //   调用生成器函数
      let iterator=gen();
      iterator.next();

Promise

Promise 是 ES6 引入的异步编程的新解决方案。语法上 Promise 是一个构造函数,用来封装异步操作并可以获取其成功或失败的结果。

  // 实例化Promise对象
        const p=new Promise(function(resolve,reject){
            setTimeout(function(){
                let data='数据库中的数据';
                // 调用resolve,让其结果为成功,让p实例的状态为成功,会执行then方法中成功的回调。
                // resolve(data);
                // 让其状态为失败
                let err='请求失败';
                reject(err);
            })

        });
        // 调用promise对象的then()方法
        p.then(function(value){
            console.log(value);
        },function(reason){
            console.error(reason);
        })

首先需要实例化Promise对象,Promise()接受有个参数,该参数为一个函数,函数有两个参数:resolve以及reject。在后续调用resolve时,promise对象的状态就会变成成功,reject则会失败。当对象的状态发生改变时,就会调用then方法,该方法有两个函数,成功的回调函数以及失败的回调函数。若promise对象的状态为成功则执行成功的对调,否则执行失败的回调。

使用promise封装ajax请求具体实现如下:

        const p = new Promise((resolve, reject)=>{
            const xhr = new XMLHttpRequest();
            xhr.open("GET", "https://api.apiopen.top/getJoke");
            xhr.send();
            xhr.onreadystatechange = function () {
                if (xhr.readyState === 4) {
                    if (xhr.status >= 200 && xhr.status < 300) {
                        resolve(xhr.response);
                    } else {
                        reject(xhr.status);
                    }
                }
            }
        })
        p.then(function(value){
            console.log(value);
        },function(reason){
            console.error(reason);
        })

Promise中的then方法,返回的结果是一个Promise对象,对象的状态由回调函数的执行结果决定。如果回调函数中返回的结果是非promise类型的属性,状态为成功,返回的值为对象的成功的值。若没有return返回结果,则同样是成功的状态,只是对应的值为undefined。

 const p = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve("用户数据");
            }, 1000)
        });
        const result = p.then(value => {
            console.log(value);
            return 1234;
        }, reason => {
            console.error(reason);
        });
        console.log(result);//[[PromiseState]]: "fulfilled" (代表成功)  [[PromiseResult]]:1234

若返回的是一个promise对象,then返回的状态则为return中promise对象的状态,其值也是对应的内部return中promise的值。

 const p = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve("用户数据");
            }, 1000)
        });
        const result = p.then(value => {
            console.log(value);
            return new Promise((resolve,reject)=>{
                resolve('ok');
            });
        }, reason => {
            console.error(reason);
        });
        console.log(result);//[[PromiseState]]: "fulfilled" (代表成功)  [[PromiseResult]]:ok

若是抛出错误,则then返回的promise对象的状态为失败的状态,对应的值为抛出的值。

 const p = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve("用户数据");
            }, 1000)
        });
        const result = p.then(value => {
            console.log(value);
           throw new Error('出错啦!')
        }, reason => {
            console.error(reason);
        });
        console.log(result);//[[PromiseState]]: "rejected"  [[PromiseResult]]:Error: 出错啦!

promise中的catch方法,相当于是then方法中的第二个回调函数,promise实例的状态失败时执行的方法。

        const p = new Promise((resolve, reject) => {
            setTimeout(() => {
                reject("出错啦!");
            }, 1000)
        });
       p.catch(function(reason){
        console.log(reason);
       })

Class

ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板。通过 class 关键字,可以定义类。基本上,ES6 的 class 可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的 class 写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。

        class Phone{
            constructor(band,price){
                this.band=band;
                this.price=price;
            }
            call(){
                console.log("我可以电话!!")
            }
        }
        let type=new Phone("Huawei",5999);

class中的静态成员,使用static声明的属性以及方法属于类,并不属于实例对象。因此使用实例对象无法访问。具体代码如下:

      class Phone{
        // 声明静态属性
        static name='手机';
        static change(){
            console.log("我可以改变世界");
        }
      }
      let type=new Phone();
      console.log(type.name);//undefined
      console.log(Phone.name)//手机

同时还可以使用calss来实现继承,具体代码如下。子类可以对父类的方法进行重写,但是无法使用super来调用父类同名的方法。

      class Phone{
        constructor(brand,price){
            this.brand=brand;
            this.price=price;
        }
        call(){
            console.log("我可以打电话");
        }
      }

      class SmartPhone extends Phone{
        constructor(brand,price,color){
            super(brand,price);//相当于Phone.call(this,brand,price)
            this.color=color;
        }
        phone(){
            console.log("拍照")
        }
      }
      const type=new SmartPhone('小米',2987,'白色');

数值扩展

1.Number.EPSILON是js表示的最小进度。若两个数的差值小于它,就认为这两个数相等。

2.ES6 提供了二进制和八进制数值的新的写法,分别用前缀 0b 和 0o 表示。

3.Number.isFinite() 用来检查一个数值是否为有限的。Number.isNaN() 用来检查一个值是否为 NaN。

4.Number.parseInt() 与 Number.parseFloat() 。用于将字符串转为整数或者浮点数,若字符串中包含不能转化的字符,则不会在往后转换。

5.Math.trunc,用于去除一个数的小数部分,返回整数部分。

6.Number.isInteger() 用来判断一个数值是否为整数。

7.Math.sign,用于检测一个数为正数,负数或者为零。若为正数则会返回1,若为零则会返回0 ,若会负数则会返回-1。

对象方法扩展

1) Object.is 比较两个值是否严格相等,与===行为基本一致,主要区别在于Object.is判断两个NaN是返回的是true,而使用===返回的是false。

2) Object.assign 对象的合并,将源对象的所有可枚举属性,复制到目标对象。后面的对象会覆盖前面对象中具有同名的属性。若不同名则会合并。

3) Object.setPrototypeOf、 Object.getPrototypeOf 可以直接设置对象的原型,以及获取对象的原型。

模块化

模块化是指将一个大的程序文件,拆分成许多小的文件,然后将小文件组合起来。它可以防止命名冲, 代码复用以及使得代码的维护性更高。

ES6 之前的模块化规范有:1) CommonJS => NodeJS、Browserify 2) AMD => requireJS 3) CMD => seaJS

模块功能主要由两个命令构成:export 和 import。export 命令用于规定模块的对外接口。 import 命令用于输入其他模块提供的功能。暴露的方式如下

方法一:分别暴露,编写一个index.js文件,代码如下:

//分别暴露
export let name='N-A';
export function study(){
console.log("学习ES6新特性")
}

在主文件中使用通用的引入方式。

<script type="module">
    //引入index.js模块的内容,全部引入
    import * as m1 from "./src/js/index.js";
</script>

方法二:统一暴露,编写一个index.js文件,在主文件中进行引入,引入方法同上。代码如下:

//统一暴露
let name='N-A';
function study(){
console.log("学习ES6新特性")
}
export {name,study};

方式三:默认暴露,编写一个index.js文件,引入方法同上。代码如下:

//默认暴露
export default{
let name='N-A';
function study(){
console.log("学习ES6新特性")
}
}

如果使用该方法进行编写的话,在主文件中想要获取到相应的方法或者属性需要再增加一层default进行调用。

导入文件的方式除了上面提到的通用方法之外,还可以使用如下的方法。

//解构赋值形式
import {name,study} from "./src/js/index.js";
//若名字重复现需要其别名
import {name as ming,sport} from "./src/js/index2.js";
import {default as def} from "./src/js/index.js";
//简便形式,只能用于默认暴露的方式
import m from './src/js/index.js'

若引入的文件较多,都写在script标签中会使代码编写不简洁,因此可以单独地创建一个js文件来编写文件的import引入,然后再在主文件中的script标签通过src属性进行引入,然后script标签还需要增加一个type等于“module”的属性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1231782.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【grafana | clickhouse】实现展示多折线图

说明&#xff1a; 采用的是 Visualizations 的 Time series&#xff0c;使用的 clickhouse 数据源 在工作中遇到了一个需求&#xff0c;写好了代码&#xff0c;需要在grafana上展示在一个项目中所有人的&#xff0c;随时间的代码提交量变化图 目前遇到的问题&#xff1a;展示…

异步爬取+多线程+redis构建一个运转丝滑且免费http-ip代理池 (三)

内容提要: 如果说,爬取网页数据的时候,我们使用了异步,那么将数据放入redis里面,其实也需要进行异步;当然,如果使用多线程或者redis线程池技术也是可以的,但那会造成冗余; 因此,在测试完多线程redis搭配异步爬虫的时候,我发现效率直接在redis这里被无限拉低下来! 因此: 最终的r…

ISP--Black Level Correction(黑电平矫正)

图像的每一个像素点都是由一个光电二极管控制的&#xff0c;由二极管将电信号&#xff0c;转换为数字信号。 那么&#xff0c;我们知道了&#xff0c;图像的像素值是与电信号强度相关的。但是&#xff0c;我们得知道&#xff0c;每一个光电二极管要想工作&#xff0c;都得有一定…

vue3 setup展示数据

效果图 1.创建数据 content.js import { reactive } from vueconst data reactive({color:red,title: 二十四节气,subTitle: 节气&#xff0c;是干支历中表示自然节律变化以及确立“十二月建”&#xff08;月令&#xff09;的特定节令。,list: [{name: "立春",con…

MATLAB | 官方举办的动图绘制大赛 | 第二周赛情回顾

今天带来一下MATHWORKS官方举办的迷你黑客大赛第三期(MATLAB Flipbook Mini Hack)的最新进展&#xff01;&#xff01;目前比赛已经进行了两周非常荣幸能够成为第一周的阶段性获奖者&#xff1a; 本来并不打算每周进行一次赛况讲解&#xff0c;但是由于字符限制改成了2000&…

竞赛 题目:基于深度学习的中文汉字识别 - 深度学习 卷积神经网络 机器视觉 OCR

文章目录 0 简介1 数据集合2 网络构建3 模型训练4 模型性能评估5 文字预测6 最后 0 简介 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的中文汉字识别 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &a…

原理Redis-Dict字典

Dict 1) Dict组成2) Dict的扩容3) Dict的收缩4) Dict的rehash5) 总结 1) Dict组成 Redis是一个键值型&#xff08;Key-Value Pair&#xff09;的数据库&#xff0c;可以根据键实现快速的增删改查。而键与值的映射关系正是通过Dict来实现的。 Dict由三部分组成&#xff0c;分别…

MobaXterm如何连接CentOS7的Linux虚拟机?Redis可视化客户端工具如何连接Linux版Redis?

一、打开Lunix虚拟机,进入虚拟机中,在终端中输入ifconfig,得到以下信息&#xff0c;红框中为ip地址 二、打开MobaXterm&#xff0c;点击session 选择SSH&#xff0c;在Remote host中输入linux得到的IP地址&#xff0c;Specify username中可起一个任意的连接名称。 输入密码 四、…

YOLO改进系列之注意力机制(GAM Attention模型介绍)

模型结构 为了提高计算机视觉任务的性能&#xff0c;人们研究了各种注意力机制。然而以往的方法忽略了保留通道和空间方面的信息以增强跨维度交互的重要性。因此&#xff0c;liu提出了一种通过减少信息弥散和放大全局交互表示来提高深度神经网络性能的全局注意力机制。作者的目…

一起Talk Android吧(第五百五十五回:Retrofit中的注解)

文章目录 1. 概念介绍2. 注解的分类与功能2.1 方法类注解2.2 参数类注解3. 内容总结各位看官们大家好,上一回中分享了一个Retrofit使用错误的案例,本章回中将 介绍Retrofit请求中的注解。闲话休提,言归正转,让我们一起Talk Android吧! 1. 概念介绍 我们在前面章回中介绍R…

这些来自各领域的全新机器人技术,你了解吗?

原创 | 文 BFT机器人 01 人机交互的新工具 在人机交互领域&#xff0c;来自欧洲各地的研究人员开发了一种名为HEUROBOX的新工具&#xff0c;用于评估交互。HEUROBOX提供了84个基本启发式和228个高级启发式&#xff0c;用于评估人机交互的各个方面&#xff0c;如安全性、人体工…

在使用tomcat运行项目时,遇到端口80被占用的情况问题解决

问题描述&#xff1a;Failed to initialize end point associated with ProtocolHandler ["http-bio-80"] java.net.BindException: Address already in use: NET_Bind <null>:80 在学习springmvc的时候&#xff0c;跟着黑马视频进行学习&#xff0c;结果&…

vue.js 短连接 动态连接

有这么一种场景&#xff0c;我们实现了某个业务&#xff0c;现在需要将这个业务连接对外推广以期实现我们的运营、推广、佣金目的&#xff0c;那么我们如何实现呢&#xff1f; 比如这个页面连接为&#xff1a; https://mp.domain.com/user/creation/editor?spm1&userno12…

车辆限迁查询API——查询您的车辆是否限制迁入迁出

随着城市的快速发展和人们生活水平的提高&#xff0c;车辆的使用量也不断增加。而随之而来的问题也愈发突出&#xff0c;其中之一就是车辆的限迁问题。 比如&#xff0c;在一些大城市&#xff0c;为了减少交通拥堵和空气污染&#xff0c;政府采取了限制车辆迁入迁出的措施&…

值得学习的演示文稿制作范例

1,在第一张幻灯片前插入1张新幻灯片,设置幻灯片大小为“全屏显示(16:9) ”;为整个演示文稿应用“离子会议室”主题,放映方式为“观众自行浏览”;除了标1题幻灯片外其它每张幻灯片中的页脚插入“晶泰来水晶吊坠”七个字。 2,第一张幻灯片的版式设置为“标题幻灯片”,主标题为“…

考情实况系列:把控考场节奏,从容拿下Datacom HCIE认证

大家好&#xff0c;我是誉天的数通学员&#xff0c;前段时间刚刚通过了HCIE认证考试&#xff0c;这里给大家分享一下我的考试经验与心得&#xff0c;希望对大家有所帮助。 我预约的是11月3日的杭州考场&#xff0c;考试前一天我就到了杭州&#xff0c;在中医药大学地铁站边上的…

接口测试知识点问答

一.什么是接口&#xff1f; 接口测试主要用于外部系统与系统之间以及内部各个子系统之间的交互点&#xff0c;定义特定的交互点&#xff0c;然后通过这些交互点来&#xff0c;通过一些特殊的规则也就是协议&#xff0c;来进行数据之间的交互。 二.接口都有哪些类型&#xff1f…

难转型、难增长、难赚钱,智能家居下半场,渠道商的出路在哪里?

脱下皇帝的新衣&#xff0c;大部分代理商不赚钱 “我去年入局智能家居&#xff0c;到现在为止&#xff0c;还处于投入阶段。”一位新入局智能家居不到一年的集成商深夜给智哪儿打来了电话。说得好听一点&#xff0c;是还处于投入阶段&#xff0c;用大白话翻译一下&#xff0c;就…

【HarmonyOS】鸿蒙应用开发基础认证题目

系列文章目录 【HarmonyOS】鸿蒙应用开发基础认证题目&#xff1b; 文章目录 系列文章目录前言一、判断题二、单选题三、多选题总结 前言 随着鸿蒙系统的不断发展&#xff0c;前不久&#xff0c;华为宣布了重磅消息&#xff0c;HarmonyOS next 开发者版本会在明年&#xff08;…

预约按摩小程序功能及使用指南;

小程序预约按摩功能及使用指南&#xff1a; 1. 注册登录&#xff1a;用户可选择通过账号密码或微信一键登录&#xff0c;便捷注册&#xff0c;轻松管理预约服务。 2. 查找店铺&#xff1a;展示附近的按摩店铺信息&#xff0c;用户可根据需求选择合适的店铺进行预约。 3. 选择服…