最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • PHP 学习之路:第九天—— 模板字面量与访问器属性

    正文概述 掘金(清云之上zcy)   2021-04-17   365

    一、值传递与引用传递

    1.值传递

    // 1. 赋值
    let a = 1;
    let b = a;
    // 值传递,只在基本类型之间存在,数值,字符串。。。
    console.log("a = %d, b = %d", a, b);
    // 更新 a
    a = 2;
    console.log("a = %d, b = %d", a, b);
    

    2.引用传递

    // 2. 引用传递, 适用于引用类型,对象,数组
    let obj1 = {
        a: 1,
        b: 2,
    };
    console.log("obj1 = %o", obj1);
    let obj2 = obj1;
    console.log("obj2 = %o", obj2);
    console.log(obj1 === obj2);
    // 更新obj1
    // 对象使用点语法来访问内部的成员
    obj1.a = 10;
    console.log("obj1 = %o", obj1);
    console.log("obj2 = %o", obj2);
    

    3.传参

    // 3. 传参: 永远是值传递
    const f1 = (x) => (x = 10);
    let m = 5;
    // m: 入参
    // 当前传入的是一个基本类型,原始类型,整数
    f1(m);
    console.log("m = %d", m);
    
    // const f2 = (x) => (x.a = 10);
    const f2 = (x) => (x = {});
    let o = { a: 1, b: 2 };
    f2(o);
    console.log("o.a = ", o.a);
    

    二、模板字面量和标签函数

    1.模板字面量

    // let name = "朱老师";
    // let str = "Hello " + name;
    // let str = `Hello ${name}`;
    // 字面量: Hello
    // 插值: ${name}
    // console.log(str);
    
    // 1. 模板字面量: 将表达式/插值嵌入到字符串
    //  0     1      2
    let menus = ["首页", "视频", "文章"];
    let htmlStr = `
    <nav>
      <a href="">${menus[0]}</a>
      <a href="">${menus[1]}</a>
      <a href="">${menus[2]}</a>
    </nav>
    `;
    
    // 模板字面量内部有二部分组成: 字符串字面量, 变量插值
    // <nav>
    //     <a href=""> </a>
    // </nav>
    // ${....}
    console.log(htmlStr);
    document.body.insertAdjacentHTML("beforeEnd", htmlStr);
    

    2.标签函数

    // 2. 标签函数,自定义模板字面量的一些行为
    let hello = name => alert(name);
    //   hello("天蓬老师");
    // hello`天蓬老师`;
    // 参数约定
    // 1. 第一个参数: 所有字符串字面量组成的数组
    // 2. 第二个参数: 插值组成的数组
    
    let sum = (strs, a, b) => {
      console.log(strs);
      console.log(a, b);
    };
    
    let a = 45;
    b = 28;
    sum`${a} + ${b} = `;
    
    // rest: 归并参数
    sum = (strs, ...args) => {
      console.log(strs);
      console.log(args);
    };
    let c = 38;
    sum`${a} + ${b} + ${c} = `;
    

    三、解构赋值

    1. 数组解构

    // 变量声明并赋值时的解构
    let foo = ['one', 'two', 'three'];
    let [one, two, three] = foo;
    console.log(one, two, three);
    
    // 变量先声明后赋值时的解构,通过解构分离变量的声明,可以为一个变量赋值。
    let a, b;
    [a, b] = [1, 2, 3];
    console.log(a, b);
    
    // 为了防止从数组中取出一个值为undefined的对象,可以在表达式左边的数组中为任意对象预设默认值。
    [a, b, c = 'js'] = [1, 2];
    console.log(a, b, c);
    
    // 当解构一个数组时,可以使用剩余模式,将数组剩余部分赋值给一个变量。
    [a, b, ...c] = [1, 2, 3, 4, 5, 6];
    console.log(a, b, ...c);
    
    // 使用"," ,忽略某些返回值
    [, , , a, ,] = [1, 2, 3, 4, 5, 6];
    console.log(a);
    

    2. 对象解构

    // 基本赋值
    let item = { id: 10, name: '手机' };
    let { id, name } = item;
    
    // 无声明赋值
    // 注意:赋值语句周围的圆括号 ( ... ) 在使用对象字面量无声明解构赋值时是必须的。
    var a, b;
    ({ a, b } = { a: 1, b: 2 });
    

    3. 参数解构

    // 数组传参
    let sum = ([a, b]) => a + b;
    console.log(sum([30, 50]));
    // 对象传参
    let getUser = ({ name, email }) => [name, email];
    console.log(getUser({ name: '朱老师', email: 'admin@php.cn' }));
    

    四、对象字面量的简化

    let user = {
      userName: "天蓬老师",
      userEmail: "tp@qq.com",
      getInfo: function () {
        return `${this.userName} : ${this.userEmail} `;
      },
    };
    console.log(user);
    // 对象解构
    let { userName, userEmail } = user;
    console.log(userName, userEmail);
    
    //   进行简化
    user = {
      userName: userName,
      userEmail: userEmail,
      getInfo: function () {
        return `${this.userName} : ${this.userEmail} `;
      },
    };
    console.log(userName, userEmail);
    
    // 再次简化
    // 对象字面量中的属性值引用的变量,如果与对象在同一个作用域中,则可以省去属性值
    // 并且这个变量与对象的属性同名,则可以省去不写了
    
    //   简化的前提:
    //   1. 同一个作用域
    //   2. 变量与属性同名
    user = {
      userName,
      userEmail,
      getInfo: function () {
        return `${this.userName} : ${this.userEmail} `;
      },
    };
    console.log(userName, userEmail);
    

    五、bind(),call(),apply()

    function hello(name, name2) {
      // this: 执行上下文,程序的运行环境
      // this当前是window,全局
      this.name = name;
      // window.name = name;
      console.log(this);
    }
    
    // hello("朱老师");
    // bind()可以改变函数中的this指向
    const obj = {
      name: "天蓬老师",
    };
    
    // bind()只绑定不执行
    // let f = hello.bind(obj, "admin");
    // console.log(f());
    
    // 如果函数中的this被重新绑定之后,要求立即执行
    // 用call,applay
    // hello.call(obj, "灭绝老师");
    // hello.apply(obj, ["西门老师", "欧阳老师"]);
    
    // bind()案例
    document.querySelector("button").addEventListener(
      "click",
      function () {
        // this原来是绑定到按钮上的,bind()改变this的指向
        console.log(this.name);
        console.log(this);
      }.bind({
        name: "朱老师",
      })
    );
    
    //   bind,call,apply: 相同点, 都可以改变this的指向
    //   不同的点:
    //   1. bind()只绑定,不执行
    //   2. call,apply,绑定后立即执行,但参数并不一样
    //   3. call,参数是离散的一个一个传入
    //   4. apply, 参数以数组的形式统一传入
    

    六、访问器属性

    - 访问属性:将一个方法伪装/包装成一个属性
    - get: 是读取,也叫读操作
    - set: 访问器属性的写操作
    
    ```javascript
    // 对象成员: 属性, 方法
    // 属性: 类似于变量
    // 方法: 类似于函数
    const product = {
      //   属性
      data: [
        { id: 1, name: '电脑', price: 5000, num: 5 },
        { id: 2, name: '手机', price: 4000, num: 15 },
        { id: 3, name: '相机', price: 1400, num: 10 },
      ],
    
      // 计算总金额
      // 方法: es6的方法的简化,将冒号和function可以删除
      getAmounts() {
        return this.data.reduce((t, c) => (t += c.price * c.num), 0);
      },
    
      // 访问器属性: 将一个方法伪装/包装成一个属性
      // get: 是读取,也叫读操作
      get total() {
        return this.data.reduce((t, c) => (t += c.price * c.num), 0);
      },
    
      // set: 访问器属性的写操作
      set setPrice(price) {
        this.data[1].price = price;
      },
    };
    
    console.log('总金额 = %d 元 ', product.getAmounts());
    
    // 不想用方法,想以属性的方式来获取总金额
    console.log('总金额 = %d 元 ', product.total);
    console.log(product.data[1].price);
    product.setPrice = 8000;
    console.log(product.data[1].price);
    
    # 七、访问器属性的优先级
    
    ```js
    let user = {
      data: { name },
      get name() {
        return this.data.name;
      },
      set name(v) {
        this.data.name = v;
      },
    };
    
    user.name = "天蓬老师";
    console.log(user.name);
    // 访问器属性的优先级高于同名的普通属性
    

    八、流程控制-分支

    1. if 语句

    let score = 54;
    // 单分支
    if (score >= 60) console.log("及格");
    
    // 双分支
    // else: 默认分支
    if (score >= 60) console.log("及格");
    else console.log("补考");
    
    // 多分支
    score = 8;
    if (score >= 60 && score < 80) {
    console.log("合格");
    } else if (score >= 80 && score <= 100) {
    console.log("学霸");
    } else if (score > 100 || score < 0) {
    console.log("非法数据");
    } else {
    console.log("补考");
    }
    

    2. switch 语句

    // 多分支的简化 switch
    score = 38;
    switch (true) {
    case score >= 60 && score < 80:
      console.log("合格");
      break;
    case score >= 80 && score <= 100:
      console.log("学霸");
      break;
    
    case score > 100 || score < 0:
      console.log("非法数据");
      break;
    default:
      console.log("补考");
    }
    
    let status = "SucCess";
    switch (status.toLowerCase()) {
    case "success":
      console.log("成功");
      break;
    case "error":
      console.log("失败");
    }
    
    score = 89;
    if (score >= 60) console.log("及格");
    else console.log("补考");
    
    //   console.log(score >= 60 ? true : false );
    //   三元运算符: 专用于简单化双分支结构
    console.log(score >= 60 ? "及格" : "补考");
    

    起源地下载网 » PHP 学习之路:第九天—— 模板字面量与访问器属性

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元