简单js

作者: drlsxs | 来源:发表于2021-07-26 19:20 被阅读0次
    1. 使用 连续 三元 ? 来代替 if else-if
    let message,
      login = "";
    
    message =
      login === "dsfds"
        ? "dsasdas"
        : login === "dssa"
        ? "fsdfdsfs"
        : login === ""
        ? "no login"
        : "";
    
    console.log(message); //--------no login---------
    

    2.使用 ? 三元 来代替 if else

    let a = 2,
      b = 1;
    let result = a + b < 4 ? "Blow" : "Over";
    console.log(result); //-----------Blow----------
    

    3.|| 或运算的, 有真及真,返回第一个真值,如果不存在真值,就返回该链的最后一个值。

    console.log(true || true); //----true----
    console.log(false || true); //----true----
    console.log(true || false); //----true----
    console.log(false || false); //----false----
    

    4.&& 与运算的, 有假及假,返回第一个虚值,如果不存在虚值,就返回该链的最后一个值。

    console.log(true && true); // ----true----
    console.log(false && true); // ----false----
    console.log(true && false); // ----false----
    console.log(false && false); // ----false----
    

    5.空值合并运算符 '??'

    function fn(a, b) {
      return a + b;
    }
    
    let aa = 0,
      bb = null;
    console.log(fn(aa ?? 10, bb ?? 22)); // --------22---------
    // 与 || 区别
    // || 返回第一个 真 值。
    // ?? 返回第一个 已定义的 值。
    let x = 0;
    let y = "";
    let z = undefined;
    let n = null;
    console.log(x || 20); //  -----20---------
    console.log(x ?? 20); //  -----0---------
    console.log(y || 30); //  -----30---------
    console.log(y ?? 30); //  -----“”---------
    console.log(z || 40); //  -----40---------
    console.log(z ?? 40); //  -----40---------
    console.log(n || 50); //  -----50---------
    console.log(n ?? 50); //  -----50---------
    // 可以看出 ?? 不认为 0 或 “”为假,||会认为为假
    

    6.内部循环变量和外部循环变量

    // 内联循环变量声明,外部拿不到值
    for (let i = 0; i < 3; i++) {
      console.log(i); // ------0,1,2-------
    }
    try {
      console.log(i);
    } catch (error) {
      console.log(error); //----ReferenceError: i is not defined-----
    }
    //外部循环变量,外面可以拿到值
    let k = 0;
    for (k = 0; k < 3; k++) {
      console.log(k); // ------0,1,2---------
    }
    console.log(k); //--------3-------
    

    7.if内部使用!和不使用!

    // 简单一句话flag为真值就执行下面的代码,带!flag为真,即flag为假
    let flag = false;
    if (flag) console.log("hhaha");
    if (!flag) console.log("wwawa"); //------wwawa -----
    

    8.case连写,相当于if判断中的 ||

    let browser = "Chrome";
    switch (browser) {
      case "Edge":
        console.log("You've got the Edge!");
        break;
      case "Chrome":
      case "Firefox":
      case "Safari":
      case "Opera":
        console.log("Okay we support these browser too"); //---Okay we support these browser too ---
        break;
      default:
        console.log("We hope that this page looks ok!");
    }
    // 用if,else if ,else改写的判断
    let browser2 = "Firefox";
    if (browser2 === "Edge") {
      console.log("You've got the Edge!");
    } else if (
      browser2 === "Chrome" ||
      browser2 === "Firefox" ||
      browser2 === "Safari" ||
      browser2 === "Opera"
    ) {
      console.log("Okay we support these browsers too"); //---Okay we support these browser too ---
    } else {
      console.log("We hope that this page looks ok!");
    }
    

    9.为什么要使用 === 判断是否相等;

    let a1 = 10;
    let a2 = "10";
    console.log(a1 == a2); //-----true----,我们期望得到false却得到了true
    

    10.外部变量和内部变量,外部和内部是两个完全不一样的变量,彼此修改不会影响对方的值。

    let username = "John"; //外部变量username,
    
    function showMessage() {
      let username = "drlsxs"; //内部变量username
      username = "Bob"; // 修改内部变量,外部变量任然为John
      let message = "Hello, " + username;
    
      console.log(message); // ---Hello, Bob ---
    }
    showMessage();
    console.log(username); //----John ----
    

    11.两种写入函数默认参数的方法

    //直接默认参数写入发,不会有0或“”问题
    function showMessage1(from, text = "no text given1") {
      console.log(from + ": " + text);
    }
    showMessage1("Ann"); // Ann: no text given1
    //后备默认参数写入法
    function showMessage2(from, text) {
      text = text || "no text given2"; //可以使用 ??代替 || 以防参数为“”或0
      console.log(from + ": " + text);
    }
    showMessage2("Ann"); // Ann: no text given2
    

    12.一个函数 —— 一个行为
    一个函数应该只包含函数名所指定的功能,而不是做更多与函数名无关的功能。
    两个独立的行为通常需要两个函数,即使它们通常被一起调用(在这种情况下,我们可以创建第三个函数来调用这两个函数)。
    有几个违反这一规则的例子:

    • getAge —— 如果它通过 alert 将 age 显示出来,那就有问题了(只应该是获取)。
    • createForm —— 如果它包含修改文档的操作,例如向文档添加一个表单,那就有问题了(只应该创建表单并返回)。
    • checkPermission —— 如果它显示 access granted/denied 消息,那就有问题了(只应执行检查并返回结果)。
      这些例子假设函数名前缀具有通用的含义。你和你的团队可以自定义这些函数名前缀的含义,但是通常都没有太大的不同。无论怎样,你都应该对函数名前缀的含义、带特定前缀的函数可以做什么以及不可以做什么有深刻的了解。所有相同前缀的函数都应该遵守相同的规则。并且,团队成员应该形成共识。

    如下:显示素数函数不应该去判断这个数是不是素数...

    function showPrime(n) {
      nextPrime:for (let i = 2; i < n; i++) {
        for (let j = 2; j < i; j++) {
          if (i%j===0) continue nextPrime;
        }
        console.log(i);
      }
    
    }
    
    showPrime(100);
    

    应该改为两个函数的形式,一个展示素数,一个去判断素数

    // 展示素数函数
    function showPrimes(n) {
      for (let i = 2; i < n; i++) {
        //不应该自己判断,交给函数isPrime判断
        if (isPrime(i)) continue;
        console.log(i);
      }
    
    }
    
    // 判断素数函数
    function isPrime(i) {
      for (let j = 2; j < i; j++) {
        if ( i % j === 0) return true;
      }
      return false;
    }
    
    showPrimes(100);
    

    13.简化函数内部的判断
    如下:
    基本判断

    function checkAge(age) {
      if (age > 18) {
        return true
      } else {
        return `Did parents allow you?`
      }
    }
    

    使用省略else来简化if else

    function checkAge(age) {
      if (age>18) return true
      return `Did parents allow you?`;
    }
    

    使用 ? 或者|| 近一步简化函数返回结果

    //使用问号运算符 '?':
    function checkAge(age) {
      return (age > 18) ? true : `Did parents allow you?`;
    }
    
    //使用或运算符 ||(最短的变体)
    function checkAge(age) {
      return (age > 18) || `Did parents allow you?`;
    }
    

    14.可以考虑传入对象作为函数参数, 避免对参数顺序的依赖

    function getInfo(name, id, age) {
      console.log(`姓名:${name},id:${id},年龄:${age}`);
    }
    
    getInfo(1, 20,"drlsxs");    //------姓名:1,id:20,年龄:drlsxs -------
    
    function getInfo2(userObj) {
      const {name,age,id} = userObj
      console.log(`姓名:${name},id:${id},年龄:${age}`);
    }
    
    getInfo2({age:20, id: 1, name: "drlsxs"})  //----------姓名:drlsxs,id:1,年龄:20-----------
    

    15.简单promise,以及执行顺序

    let promise = new Promise((resolve, reject) => {
      console.log(1)
      let a = 9;
      (a < 10) ? resolve(a) : reject("a is not number");
    });
    
    promise.then(res => {
      console.log(2)
    }, err => {
    });
    
    console.log(3)         
    
    //  输出顺序-----------------1,3,2--------------------//
    

    16.可选连访问对象中不存在的属性的问题
    假设我们有一个use对象存储用户信息,其中有个address属性存放地址信息,我们想要访问address里面的street,如果address是undefined我们就会得到一个错误


    image.png

    可选连是一种新特性,其规则如下:
    value?.prop

    • 如果 value 存在,则结果与 value.prop 相同,
    • 否则(当 value 为 undefined/null 时)则返回 undefined。
      所以上面访问对象不存在的属性我们可以用如下方法:


      image.png
    let user = {
    name: "dsada",
    }; // 一个没有 "address" 属性的 user 对象
    
    console.log(user.address?.street); // Error!
    

    也不用写三元表达式去判断

    console.log(user.address ? user.address.street : undefined);
    

    17.对象操作:
    对象缺少数组存在的许多方法,例如 map 和 filter 等。
    如果我们想应用它们,那么我们可以使用 Object.entries,然后使用 Object.fromEntries:
    1.使用 Object.entries(obj) 从 obj 获取由键/值对组成的数组。
    2.对该数组使用数组方法,例如 map。
    3.对结果数组使用 Object.fromEntries(array) 方法,将结果转回成对象。

    let prices = {
      banana: 1,
      orange: 2,
      meat: 4
    };
    
    
    /**
     * @param {{[p: string]: T}} price
     */
    function doublePrices (price) {
      return Object.fromEntries(
        Object.entries(price).map(([key, value]) => [key, value * 2])
      );
    }
    
    console.log(doublePrices(prices)); //{ banana: 2, orange: 4, meat: 8 }
    

    18.从数组创建键(值)对象

    let users = [
      {id: 'john', name: "John Smith", age: 20},
      {id: 'ann', name: "Ann Smith", age: 24},
      {id: 'pete', name: "Pete Peterson", age: 31},
    ];
    
    
    /**
     *
     * @description 收到数组对象,获取到该数组对象的以id作为键名的对象,方便读取数组对象中的实体
     * @param array{array}
     * @return {object}
     */
    function groupById(array) {
      let obj = {};
      return array.reduce((acc, curr) => {
        obj[curr.id] = curr;
        return obj;
      }, {});
    
    }
    
    let usersById = groupById(users);
    console.log(usersById);
    console.log(usersById.ann.age); // 24
    
    // {
    //   john: { id: 'john', name: 'John Smith', age: 20 },
    //   ann: { id: 'ann', name: 'Ann Smith', age: 24 },
    //   pete: { id: 'pete', name: 'Pete Peterson', age: 31 }
    // }
    

    相关文章

      网友评论

          本文标题:简单js

          本文链接:https://www.haomeiwen.com/subject/bxtvmltx.html