zoukankan      html  css  js  c++  java
  • 小知识随手记(十一):一行代码实现星级评分、同步阻塞实现sleep函数、一行代码生成随机字符串(唯一ID/Number.prototype.toString([radix])用法)、获取浏览器Cookie的值、颜色RGB转十六进制、使用数字分隔符、try...catch...finally 与 return 一起使用的问题、最快获取dom的方法(ID同名变量获取 dom 元素)

    一、一行代码实现星级评分

    const getRate = (rate = 0) => '★★★★★☆☆☆☆☆'.slice(5 - rate, 10 - rate);
    getRate(3);

      记下,这还是比较巧妙的。

    二、同步阻塞法实现sleep函数

    const sleep = delay => {
        const start = new Date().getTime();
        while (new Date().getTime() < start + delay) {
           continue;
        };
    };
    console.log(1);
    sleep(3000);
    console.log(2);

    三、一行代码生成随机字符串(唯一ID)

      也许你需要临时的唯一ID,这是一个技巧,你可以使用它生成随机字符串

    const randomString = () => Math.random().toString(36).slice(2);

      Math.random().toString(36) ,toString(36) 里面的36是做什么用的:

      Number.prototype.toString([radix])中的 radix 指定要用于数字到字符串的转换的基数(从2到36)。如果未指定 radix 参数,则默认值为 10。所有不在范围内的基数会报错:Uncaught RangeError: toString() radix argument must be between 2 and 36

    Math.random().toString(36)
    // '0.8p0w72uxgjr'

      先是 Math.random() 生成 [0, 1) 的数,也就是0.1233120.982931之类的,然后调用 number 的 toString方法将其转换成36进制的,按照MDN的说法,36进制的转换应该是包含了字母a~z 和 数字0~9的,因为这样生成的是 0.89kjna21sa 类似这样的,所以要截取一下小数部分,即从索引 2 开始截取10个字符就是我们想要的随机字符串了。很多开源库都使用此方式为DOM元素创建随机ID。

    四、获取浏览器Cookie的值 、 清除全部Cookie

    const cookie = name => `; ${document.cookie}`.split(`; ${name}=`).pop().split(';').shift();
    cookie('_ga');
    const clearCookies = document.cookie.split(';').forEach(
      cookie =>
      document.cookie = cookie.replace(/^ +/, '').replace(/=.*/, `=;expires=${new Date(0).toUTCString()};path=/`));

      通过使用document.cookie访问cookie并将其清除,可以轻松清除网页中存储的所有cookie。

    五、颜色RGB转十六进制、生成随机十六进制颜色

    const rgbToHex = (r, g, b) => "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
    rgbToHex(0, 51, 255); 
    // Result: #0033ff

      可以使用 Math.random 和 padEnd 属性生成随机的十六进制颜色。

    const randomHex = () => `#${Math.floor(Math.random() * 0xffffff).toString(16).padEnd(6, "0")}`;
    console.log(randomHex());
    // Result: #92b008

    六、数字分隔符

    // 有时你会在文件中定义一个数字常量
    const myMoney = 1000000000000

      这么多个 0 ,1、2 ... 6、7 ... 数晕了都,怎么办?——  数字分隔符整起来

    const myMoney = 1_000_000_000_000
    console.log(myMoney)  // 1000000000000

      这样写是没问题的,而且数字分割开后也更直观!!

    七、try...catch...finally 与 return 一起使用 - 谁厉害(finally 更厉害)

      普通函数调用中,return 一般会提前结束函数的执行,而在  try...catch...finally 中,return 就不会提前结束执行。先看一个问题:

    function demo () {
      try {
        return 1
      } catch (err) {
        console.log(err)
        return 2
      } finally {
        return 3
      }
    }
    
    console.log(demo())   // 返回什么??

      答案是:3。由此可见,还是 finally 比较厉害。那么我们可以搞一些骚操作

    function demo () {
      try {
        return 1
      } catch (err) {
        console.log(err)
        return 2
      } finally {
        try {
          return 3
        } finally {
          return 4
        }
      }
    }
    console.log(demo())  // 返回 4

    八、最快获取dom的方法

      HTML中带有 id 属性的元素,都会被全局的 ID 同名变量所引用

    <div id="zero2one"></div>
    // 原本获取 dom 是这样的
    const el = document.getElementById('zero2one')  
    console.log(el)   // <div id="zero2one"></div>
    
    // 现在可以这样
    console.log(zero2one)   // <div id="zero2one"></div>

      是不是很方便,我们直接来测试下:我这个页面有 id 为 ticket 的 html 元素,我直接在控制台输入 ticket 变量,就拿到了该 dom 元素。

  • 相关阅读:
    23种设计模式-桥接模式
    23种设计模式-单列模式
    23种设计模式-迭代器模式
    23种设计模式-组合模式
    23种设计模式-备忘录模式
    23种设计模式-适配器模式
    23种设计模式-状态模式
    SVN的安装和应用
    线程、线程池
    条形码
  • 原文地址:https://www.cnblogs.com/goloving/p/15358182.html
Copyright © 2011-2022 走看看