zoukankan      html  css  js  c++  java
  • js中运算小技巧

    1. 判断奇偶
      一般实现:num%2===0为偶数
    if(num & 1) {
      // num是奇数
    } else {
      // num是偶数
    }
    
    1. 优雅向下取整
      一般实现:Math.floor(num) (NaN和Infinity返回为本身)
    let res = num | 0 // 按或运算
    

    (NaN和Infinity返回为0)

    let res = ~~num  // 取反操作
    

    (NaN和Infinity返回为0)
    3. 整数的转换使用+
    一般实现:parseInt和parseFloat转换成number类型的整数型和浮点型

    const str = '321'
    console.log(typeof +str)  // number
    
    1. 两个非运算!!有时候用来将某个值转化为布尔类型
      其中 !标识布尔非运算
    let res1 = !!null // false
    let res2 = !!'123' // true
    
    1. 短路取值
    • ||遇真则真
    • &&遇假则假
      ** 说明: **
    • 运算从左到右计算,分别当第一个为真值/假值,计算就会停止
    • &&||优先级要高 a && b || c && d(a && b) || (c && d)
    • 巧用可减少不必要的if
    console.log(true || false) // true
    console.log(false || true) // true
    console.log(true || true) // true
    console.log(false || false) // false
    
    console.log(false && true) // false
    console.log(true && false) // false
    console.log(true && true) // true
    console.log(false && false) // false
    
    console.log(null || 2 || undefined) // 2
    
    1. 三目运算
    • 减少if使用
    let res = status ? 'a' : 'b'
    
    1. 可链式运算符?.
    • ES2020提案,可以访问对象内部属性的方式,尤其是深层嵌套的属性。
    // 静态属性
    const obj = {
      a: 1,
      b: true
    }
    let res = obj.b ? obj.b : null
    let res1 = obj?.b
    // 动态属性
    let expression = 'a'
    let res2 = obj?.[expression]
    // 方法
    let parent = {
      name: 'parent',
      getName: function() {
        console.log(this.name)
      }
    };
    parent.getName?.()   // parent
    parent.getTitle?.()  //不会执行
    
    • 与无效合并一起使用,方法处理未定义或为空值和表达提供默认值,可使用??表示默认值
    console.log(undefined ?? 'hello') // hello
    console.log(true ?? 'hello') // true
    
    1. JSON.stringify序列化
      JSON.stringify(value[, replacer [, space]])
    • 将要序列化成 一个 JSON 字符串的值
    • 如果是函数,则在序列化过程中处理每个属性;如果是数组,则包含在数组中的属性名才会被序列化;如果为null或者未提供,则所有属性都会被序列化。
    • 指定缩进用的空白字符串,如果是数字,则代表有多少空格,上限为10;如果小于1,则代表没有空格;如果为字符串,则取字母,上限10;如果为null或者未提供,则没空格。
      ** 使用 **
    • 可用于深度拷贝,JSON.stringify和 JSON.parse 来拷贝一个完全一样的对象,而对原对象没有任何影响。
    • 如果一个对象有 toJSON 属性,当它被序列化的时候,不会对该对象进行序列化,而是将它的toJSON 方法的返回值进行序列化
    var obj = {
      foo: 'foo',
      toJSON: function () {
        return 'bar';
      }
    };
    JSON.stringify(obj);      // '"bar"'
    JSON.stringify({x: obj}); // '{"x":"bar"}' 
    
    
    1. 整数变量交换
    • 一般会通过一个临时变量做辅助
    let temp = x
    x = y
    y = temp
    
    • 异或运算
    x = x ^ y
    y = x ^ y
    x = x ^ y
    
    [a,b] = [b,a]
    
    x = x + y
    y = x - y
    x = x - y
    
  • 相关阅读:
    Metadata Lock原理5
    Seconds_Behind_Master
    Metadata Lock原理4
    MySQL Troubleshoting:Waiting on query cache mutex 腾讯数据库工程师:幕南风
    Metadata Lock原理2
    Metadata Lock原理1
    Online DDL与pt-online-schema-change
    Solaris 安装JDK
    RAID 概述
    4K Block Size的Device和 Aligned IO
  • 原文地址:https://www.cnblogs.com/xiaolanschool/p/14777818.html
Copyright © 2011-2022 走看看