js編程常用技巧合集

js編程常用技巧合集

最近看了一些JavaScript的編程技巧歼捏,個人覺得特別有用所以把我覺得好的分享給大家残拐。

1. stringNumber間的相互轉(zhuǎn)換

  • string轉(zhuǎn)化成int
    • 可以使用*1的方式和parseInt
    • *1轉(zhuǎn)化實際是調(diào)用.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值使用的時候會轉(zhuǎn)化成相應的數(shù)值
        ~~true         // 1
        ~~false        // 0
    
    • 在給帶小數(shù)點的數(shù)值使用時會向極端取整,在正數(shù)這很像Math.floor(),在負數(shù)上則與其不同娜睛。
        ~~4.5                   // 4
        Math.floor(4.5)         // 4
        ~~-4.5                  // -4
        Math.floor(-4.5)        // -5
    
    • 對于一個超過31位的大數(shù)兩次取反后會出現(xiàn)問題
        ~~2147483647            // 2147483647
        ~~2147483648            // -2147483648
    
        ~~4294967296            // 0
        ~~4294967295            // -1
        ~~4294967297            // 1
    
    所以對于有可能出現(xiàn)較大數(shù)值的情況推薦使用parseFloat(),反之可以使用~~提高代碼效率罗晕。

3.取整 | 0
取整可以使用num | 0(類似java中的float轉(zhuǎn)化成int的效果鸯旁,只保留整數(shù)位)

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

4.判斷奇偶數(shù) & 1
對一個數(shù)字num & 1可以判斷奇偶數(shù),負數(shù)也同樣適用

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

5.一次性函數(shù)
第一次做不一樣的事医清,后面都做相同的事情可以這樣寫

      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.精確到指定位數(shù)的小數(shù)
將數(shù)字四舍五入到指定的小數(shù)位數(shù)会烙。使用 Math.round() 和模板字面量將數(shù)字四舍五入為指定的小數(shù)位數(shù)负懦。 省略第二個參數(shù) decimals 筒捺,數(shù)字將被四舍五入到一個整數(shù)。

      // 先平方再開方纸厉,仔細看真的精妙
      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.數(shù)字補0的操作
在很多時候我們需要對時間進行補0操作系吭,這個小技巧也特別巧妙

      // 不超過2位的數(shù)只取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.統(tǒng)計數(shù)組中相同項的個數(shù)

      // 統(tǒng)計相同個數(shù)
      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 }

      // 常用數(shù)組項累加
      var nums = [1, 2, 31, 4]
      var sum = nums.reduce(function(sum, num){
          return sum + num
      }, 0)

10.解構(gòu)交換變量值
交換兩個變量值肯尺,經(jīng)常用到,用個臨時變量的方法膩了可以試試下面的躯枢,好玩的方式

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

11.判斷類型
類似我們可能經(jīng)常問到如何判斷一個變量是否是數(shù)組類型等問題则吟,我們可以使用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.緩存函數(shù)計算結(jié)果
眼前一亮。

      // 緩存函數(shù)
      function cached(fn) {
          const cache = Object.create(null)
          return function (str) {
              if (!cache[str]) {
                  cache[str] = fn(str)
              }
              return cache[str]
          }
      }
      // 需要執(zhí)行的耗時函數(shù)
      function computed() {
          // 中間計算過程
          console.log('computed')
          return 'result'
      }

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

上面的函數(shù)败匹,當傳入的str相同時寨昙,不再進行運算,直接從緩存里拿結(jié)果了掀亩,真是妙舔哪。

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市槽棍,隨后出現(xiàn)的幾起案子捉蚤,更是在濱河造成了極大的恐慌,老刑警劉巖炼七,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缆巧,死亡現(xiàn)場離奇詭異,居然都是意外死亡豌拙,警方通過查閱死者的電腦和手機陕悬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來按傅,“玉大人捉超,你說我怎么就攤上這事∥ㄉ埽” “怎么了拼岳?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長况芒。 經(jīng)常有香客問我惜纸,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任耐版,我火速辦了婚禮祠够,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘椭更。我一直安慰自己哪审,他們只是感情好,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布虑瀑。 她就那樣靜靜地躺著湿滓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪舌狗。 梳的紋絲不亂的頭發(fā)上叽奥,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機與錄音痛侍,去河邊找鬼朝氓。 笑死,一個胖子當著我的面吹牛主届,可吹牛的內(nèi)容都是我干的赵哲。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼君丁,長吁一口氣:“原來是場噩夢啊……” “哼枫夺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起绘闷,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤橡庞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后印蔗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扒最,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年华嘹,在試婚紗的時候發(fā)現(xiàn)自己被綠了吧趣。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡耙厚,死狀恐怖强挫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情颜曾,我是刑警寧澤纠拔,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布泛豪,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏臀叙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一劝萤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧慎璧,春花似錦床嫌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽岁疼。三九已至,卻和暖如春捷绒,著一層夾襖步出監(jiān)牢的瞬間瑰排,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工暖侨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留椭住,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓函荣,卻偏偏與公主長得像扳肛,于是被迫代替她去往敵國和親傻挂。 傳聞我的和親對象是個殘疾皇子挖息,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 一、快捷鍵 ctr+b 執(zhí)行ctr+/ 單行注釋ctr+c ...
    o_8319閱讀 5,793評論 2 16
  • Lua 5.1 參考手冊 by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,763評論 0 38
  • 我的房間里只有學習用品和書還有一些拼裝绪抛,我在我的房間里面最喜歡的是拼裝因為它對我有興趣。我的屋子里有沙發(fā)幢码,文...
    微笑眼睛_b18e閱讀 211評論 0 0
  • 文:閆曉雨 一個月之前尖飞,我收到一幅畫症副。 是我扎著兩根麻花辮、抱著黛玉(洛盞家的貓)的低頭照贞铣,素描,畫畫的人是我前男...
    閆曉雨閱讀 386評論 0 3
  • 現(xiàn)在是2018年倒數(shù)第二天窍奋,來年我會去哪些地方,在活動時去酱畅;還是出差去了意外的驚喜地方。 最近感冒了纺酸,體質(zhì)很差。自...
    lew開心快樂閱讀 169評論 0 1