js编程常用技巧合集

js编程常用技巧合集

最近看了一些JavaScript的编程技巧,个人觉得特别有用所以把我觉得好的分享给大家。

1. stringNumber间的相互转换

  • string转化成int
    • 可以使用*1的方式和parseInt
    • *1转化实际是调用.valueOf()方法
    '123' * 1                        // 123
    'ab' * 1                         // NaN
    null * 1                         // 0
    undefined * 1                    // NaN
    1  * { valueOf: ()=>'2' }        // 2  

    parseInt('123')                       // 123
    parseInt('ab')                        // NaN
    parseInt(null)                        // NaN
    parseInt(undefined)                   // NaN
    parseInt({ valueOf: ()=>'2' })        // NaN  

2.双位运算符~~

  • ~在js中表示取反操作,两次取反表示维持原值不变。
    • 在给Boolean值使用的时候会转化成相应的数值
        ~~true         // 1
        ~~false        // 0
    
    • 在给带小数点的数值使用时会向极端取整,在正数这很像Math.floor(),在负数上则与其不同。
        ~~4.5                   // 4
        Math.floor(4.5)         // 4
        ~~-4.5                  // -4
        Math.floor(-4.5)        // -5
    
    • 对于一个超过31位的大数两次取反后会出现问题
        ~~2147483647            // 2147483647
        ~~2147483648            // -2147483648
    
        ~~4294967296            // 0
        ~~4294967295            // -1
        ~~4294967297            // 1
    
    所以对于有可能出现较大数值的情况推荐使用parseFloat(),反之可以使用~~提高代码效率。

3.取整 | 0
取整可以使用num | 0(类似java中的float转化成int的效果,只保留整数位)

      1.26 | 0         // 1
      -1.56 | 0        // -1

4.判断奇偶数 & 1
对一个数字num & 1可以判断奇偶数,负数也同样适用

        const num=3
        Boolean(num & 1)                 // true
        Boolean(num % 2)                 // true

5.一次性函数
第一次做不一样的事,后面都做相同的事情可以这样写

      var sca = function() {
          console.log('one')
          sca = function() {
              console.log('two')
          }
      }
      sca()        // one
      sca()        // two
      sca()        // two

6.不同进制表示
ES6中新增了不同进制的书写格式,需要注意这一点。

      29            // 10进制
      035            // 8进制29      原来的方式
      0o35            // 8进制29      ES6的方式
      0x1d            // 16进制29
      0b11101            // 2进制29

7.精确到指定位数的小数
将数字四舍五入到指定的小数位数。使用 Math.round() 和模板字面量将数字四舍五入为指定的小数位数。 省略第二个参数 decimals ,数字将被四舍五入到一个整数。

      // 先平方再开方,仔细看真的精妙
      const round = (n, decimals = 0) => Number(`${Math.round(`${n}e${decimals}`)}e-${decimals}`)
      round(1.345, 2)                 // 1.35
      // 计算理解如下
      // Math.round(1.345E2)E-2
      // Math.round(1.345x10^2)E-2
      // 135E-2
      // 135x10^-2
      // 1.35
      round(1.345, 1)                 // 1.3

8.数字补0的操作
在很多时候我们需要对时间进行补0操作,这个小技巧也特别巧妙

      // 不超过2位的数只取2位,超过两位,不补0
      const addZero1 = (num, len = 2) => (`0${num}`).slice(-len)
      const addZero2 = (num, len = 2) => (`${num}`).padStart(len , '0')
      addZero1(3) // 03
      addZero2(32,4)  // 0032

9.统计数组中相同项的个数

      // 统计相同个数
      var cars = ['BMW','Benz', 'Benz', 'Tesla', 'BMW', 'Toyota'];
      var carsObj = cars.reduce(function (obj, name) {
        obj[name] = obj[name] ? ++obj[name] : 1;
        return obj;
      }, {});
      carsObj; // => { BMW: 2, Benz: 2, Tesla: 1, Toyota: 1 }

      // 常用数组项累加
      var nums = [1, 2, 31, 4]
      var sum = nums.reduce(function(sum, num){
          return sum + num
      }, 0)

10.解构交换变量值
交换两个变量值,经常用到,用个临时变量的方法腻了可以试试下面的,好玩的方式

      // 第一种
      let param1 = 1;
      let param2 = 2;
      [param1, param2] = [param2, param1];
      param1 // => 2
      param2 // => 1
      // 第二种
      param1 = [param1, param1 = param2][0]   

11.判断类型
类似我们可能经常问到如何判断一个变量是否是数组类型等问题,我们可以使用Object.prototype.toString.call(arg)来进行判断(源自vue源码)。

      function showType (value) {
        return Object.prototype.toString.call(value).slice(8, -1)
      }
      showType([]) // => "Array"
      showType({}) // => "Object"
      showType(null) // => "Null"
      showType(Undefined) // => "Undefined"
      showType(parseInt) // => "Function"
      showType(/\w/) // => "RegExp"

实在巧妙,高人果不其然。

12.缓存函数计算结果
眼前一亮。

      // 缓存函数
      function cached(fn) {
          const cache = Object.create(null)
          return function (str) {
              if (!cache[str]) {
                  cache[str] = fn(str)
              }
              return cache[str]
          }
      }
      // 需要执行的耗时函数
      function computed() {
          // 中间计算过程
          console.log('computed')
          return 'result'
      }

      var cachedComputed = cached(computed)
      cachedComputed('ss') 
      // computed
      // => result
      cachedComputed('ss')
      // => result

上面的函数,当传入的str相同时,不再进行运算,直接从缓存里拿结果了,真是妙。

借鉴于 https://juejin.im/post/5b51e5d3f265da0f4861143c

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,884评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,212评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,351评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,412评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,438评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,127评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,714评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,636评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,173评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,264评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,402评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,073评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,763评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,253评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,382评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,749评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,403评论 2 358

推荐阅读更多精彩内容

  • 一、快捷键 ctr+b 执行ctr+/ 单行注释ctr+c ...
    o_8319阅读 5,826评论 2 16
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,831评论 0 38
  • 我的房间里只有学习用品和书还有一些拼装,我在我的房间里面最喜欢的是拼装因为它对我有兴趣。我的屋子里有沙发,文...
    微笑眼睛_b18e阅读 217评论 0 0
  • 文:闫晓雨 一个月之前,我收到一幅画。 是我扎着两根麻花辫、抱着黛玉(洛盏家的猫)的低头照,素描,画画的人是我前男...
    闫晓雨阅读 391评论 0 3
  • 现在是2018年倒数第二天,来年我会去哪些地方,在活动时去;还是出差去了意外的惊喜地方。 最近感冒了,体质很差。自...
    lew开心快乐阅读 177评论 0 1