<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          分享一些對你有幫助的JavaScript技巧

          共 9794字,需瀏覽 20分鐘

           ·

          2021-04-19 17:56



             戳藍字關(guān)注我們哦!

          前言

          大多數(shù)的編程語言都是足夠開放的,允許程序員用多種方式來做類似的結(jié)果。

          JavaScript也不例外。對于JavaScript,我們經(jīng)常會發(fā)現(xiàn),為了一個相似的結(jié)果,我們可以用多種方式來做事情,這有時會讓人感到困惑。 有些用法比其他替代方法更好。

          你如何改變你的JS代碼,讓它更簡單更容易閱讀

          如果你在一個團隊中工作,寫出簡單的代碼是很重要的。因為你不是在真空中工作,所以你的程序必須容易被你的團隊成員所遵循。每個人都喜歡干凈的代碼! 學(xué)習(xí)如何讓JavaScript盡可能的不痛苦,是一項寶貴的技能,肯定會讓你成為辦公室的寵兒。

          JS-Tips

          控制臺提示

          代碼執(zhí)行時間??

          使用 console.time 和 console.timeEnd 來確定你的代碼有多快(或多慢)?

          這是一個例子:

          console.time('TEST')

          //some random code to be tested

          console.timeEnd('TEST')

          風(fēng)格的Loggin

          要獲得自定義輸出,我們將像下面那樣添加%c,然后將實際的CSS作為第二個參數(shù)。

          console.log('%c AWESOME''color: indigo; font-size:100px')

          Tables

          當(dāng)你想記錄一個對象數(shù)組時,console.table將派上用場。

          // x,y,z are objects
          console.table([x, y, z])

          堆棧跟蹤日志

          如果你想獲得函數(shù)被調(diào)用的堆棧跟蹤,你可以使用 console.trace。

          function foo(){
            function bar(){
              console.trace('test')
            }
            bar();
          }

          foo();

          動態(tài)鍵名

          超級有用的提示!

          const key = 'dynamic'

          const obj = {
            dynamic'hey',
            [key]: 'howdy'
          }

          obj.dynamic // hey
          obj[key] // howdy
          obj['dynamic'//hey
          obj.key // howdy

          基于回調(diào)的API->promise

          為了讓事情變得更干凈、更高效,你可以將回調(diào)(ourCallbackFn)轉(zhuǎn)化為承諾是一個函數(shù)。

          // we start with this 
          async function foo({
            const x = await something1()
            const y = await something2()

            ourCallbackFn(){
              // ...
            }
          }

          // the transformation
          async function foo({
            const x = await something1()
            const y = await something2()

            await promiseCallbackFn() //??
          }

          function promiseCallbackFn({
            return new Promise((resolve, reject) => {
              ourCallbackFn((err, data) => { //??
                if (err) {
                  reject(err)
                } else {
                  resolve(data)
                }
              })
            })
          }

          忘記字符串連接,使用模板

          使用+操作符將字符串連接在一起以建立一個有意義的字符串是老式的。此外,用動態(tài)值(或表達式)連接字符串可能會導(dǎo)致挫折和錯誤。

          let name = 'Charlse';
          let place = 'India';
          let isPrime = bit => {
            return (bit === 'P' ? 'Prime' : 'Nom-Prime');
          }

          // string concatenation using + operator
          let messageConcat = 'Mr. ' + name + ' is from ' + place + '. He is a' + ' ' + isPrime('P') + ' member.'

          Template literals(或Template strings)允許嵌入表達式。

          它有獨特的語法,字符串必須用回車鍵包圍。模板字符串可以包含動態(tài)值的占位符。這些值由美元符號和大括號(${expression})標(biāo)記。 下面是一個例子:

          let name = 'Charlse';
          let place = 'India';
          let isPrime = bit => {
            return (bit === 'P' ? 'Prime' : 'Nom-Prime');
          }

          // using template string
          let messageTemplateStr = `Mr. ${name} is from ${place}. He is a ${isPrime('P')} member.`
          console.log(messageTemplateStr);

          isInteger

          有一個更簡單的方法可以知道一個值是否是一個整數(shù)。JavaScript的Number API提供了一個叫做,isInteger()的方法來達到這個目的。它是非常有用的,最好能知道。

          let mynum = 123;
          let mynumStr = "123";

          console.log(`${mynum} is a number?`Number.isInteger(mynum));
          console.log(`${mynumStr} is a number?`Number.isInteger(mynumStr));

          Output:

          123 is a number? true
          123 is a number? false

          Value as Number

          你有沒有注意到,event.target.value總是返回一個字符串類型的值,即使輸入框的類型是數(shù)字? 是的,請看下面的例子。我們有一個簡單的文本框,類型為數(shù)字。這意味著它只接受數(shù)字作為輸入。它有一個事件處理程序來處理加鍵事件。

          <input type='number' onkeyup="trackChange(event)" />

          在事件處理方法中,我們使用event.target.value取出值。但它返回的是一個字符串類型的值。現(xiàn)在,我將有一個額外的頭痛問題,就是如何將它解析為一個整數(shù)。如果輸入框接受浮動數(shù)(比如,16.56),那么parseFloat()怎么辦?啊,各種各樣的困惑和額外的工作!

          function trackChange(event{
             let value = event.target.value;
             console.log(`is ${value} a number?`Number.isInteger(value));
          }

          使用event.target.valueAsNumber代替。它以數(shù)字的形式返回值。

          let valueAsNumber = event.target.valueAsNumber;
          console.log(`is ${value} a number?`Number.isInteger(valueAsNumber));
          value-as-number

          && 運算符

          讓我們考慮一個情況,我們有一個布爾值和一個函數(shù)。

          let isPrime = true;
          const startWatching = () => {
              console.log('Started Watching!');
          }

          這段代碼太多,需要檢查布爾條件并調(diào)用函數(shù)。

          if (isPrime) {
              startWatching();
          }

          使用(&&)運算符的簡寫呢?是的,完全避免使用if語句。酷吧?

          isPrime && startWatching();

          默認值使用 ||

          如果你想為一個變量設(shè)置一個默認值,你可以使用 ||

          let person = {name'Jack'};
          let age = person.age || 35// sets the value 35 if age is undefined
          console.log(`Age of ${person.name} is ${age}`);

          但是等等,它有一個問題。如果這個人的年齡是0(可能是剛出生的嬰兒)。年齡將被計算為35,這是意想不到的行為。

          進入空值凝聚運算符(??)。它是一個邏輯運算符,當(dāng)其左手操作數(shù)為空或未定義時,返回其右手操作數(shù),否則返回其左手操作數(shù)。

          要用??運算符重寫上述代碼。

          let person = {name'Jack'};
          let age = person.age ?? 35// sets the value 0 if age 0, 35 in case of undefined and null
          console.log(`Age of ${person.name} is ${age}`);

          Randoms

          生成一個隨機數(shù)或從數(shù)組中獲取一個隨機項目是一個非常有用的方法,可以隨身攜帶。在我的很多項目中,我都看到它們多次出現(xiàn)。 從一個數(shù)組中獲取一個隨機項目。

          let planets = ['Mercury ''Mars''Venus''Earth''Neptune''Uranus''Saturn''Jupiter'];
          let randomPlanet = planets[Math.floor(Math.random() * planets.length)];
          console.log('Random Planet', randomPlanet);

          通過指定最小值和最大值從一個范圍內(nèi)生成一個隨機數(shù)。

           let getRandom = (min, max) => {
               return Math.round(Math.random() * (max - min) + min);
           }
           console.log('Get random', getRandom(010));

          函數(shù)默認參數(shù)

          在JavaScript中,函數(shù)參數(shù)(params)就像該函數(shù)的局部變量。在調(diào)用函數(shù)時,你可以為這些參數(shù)傳值,也可以不傳值。如果你不為param傳值,它將是未定義的,可能會引起一些不必要的副作用。

          在定義函數(shù)參數(shù)時,有一種簡單的方法可以將默認值傳遞給函數(shù)參數(shù)。下面是一個例子,我們將默認值Hello傳遞給問候函數(shù)的參數(shù)信息。

          let greetings = (name, message='Hello,') => {
              return `${message} ${name}`;
          }

          console.log(greetings('Jack'));
          console.log(greetings('Jack''Hola!'));

          所需函數(shù)參數(shù)

          在默認參數(shù)技術(shù)的基礎(chǔ)上進行擴展,我們可以將一個參數(shù)標(biāo)記為強制性的。首先,定義一個函數(shù)來拋出一個帶有錯誤信息的錯誤。

          let isRequired = () => {
              throw new Error('This is a mandatory parameter.');
          }

          然后為所需參數(shù)分配函數(shù)的默認值。記住,在調(diào)用時,當(dāng)一個值作為參數(shù)傳遞時,默認值會被忽略。但是,如果參數(shù)值是未定義的,則會考慮默認值。

          let greetings = (name=isRequired(), message='Hello,') => {
              return `${message} ${name}`;
          }
          console.log(greetings());

          在上面的代碼中,name將是未定義的,并且將嘗試為它設(shè)置默認值,即isRequired()函數(shù)。它將拋出一個錯誤。

          error

          逗號運算符

          當(dāng)我意識到逗號(,)是一個獨立的操作符時,我感到很驚訝,而且從來沒有注意到它的存在。我一直在代碼中使用它,但是,從來沒有意識到它的真正存在。

          在JavaScript中,逗號(,)運算符用于從左到右評估每個操作數(shù),并返回最后一個操作數(shù)的值。

          let count = 1;
          let ret = (count++, count);
          console.log(ret);

          在上面的例子中,變量ret的值將是,2.同樣的,下面代碼的輸出將把32的值記錄到控制臺。

          let val = (1232);
          console.log(val);

          我們用在哪里?有什么猜測嗎?逗號(,)運算符最常見的用法是在for循環(huán)中提供多個參數(shù)。

          for (var i = 0, j = 50; i <= 50; i++, j--)

          合并多個對象

          您可能需要將兩個對象合并在一起,并創(chuàng)建一個更好的信息對象來工作。你可以使用展開運算符......(是的,三個點!)。 考慮兩個對象,分別是emp和job。

          let emp = {
           'id''E_01',
           'name''Jack',
           'age'32,
           'addr''India'
          };

          let job = {
           'title''Software Dev',
            'location''Paris'
          };

          使用價差運算符將它們合并為:

          // spread operator
           let merged = {...emp, ...job};
           console.log('Spread merged', merged);

          有另一種方法來執(zhí)行這種合并。使用Object.assign()。你可以這樣做。

          console.log('Object assign'Object.assign({}, emp, job));

          結(jié)果:

          合并對象

          注意,spread操作符和Object.assign都是執(zhí)行淺層合并。在淺層合并中,第一個對象的屬性會被覆蓋到與第二個對象相同的屬性值。 對于深合并,請使用類似于:_merge of lodash。


          解構(gòu)

          將數(shù)組元素和對象屬性分解為變量的技術(shù)稱為,反結(jié)構(gòu)。讓我們通過幾個例子來看看。

          數(shù)組

          在這里,我們有一系列的表情符號,

          let emojis = ['??''??''??''??'];

          要解構(gòu),我們將使用如下語法。

          let [fire, clock, , watermelon] = emojis;

          這和做,讓火=表情符號[0]是一樣的;但多了很多靈活性。 你有沒有注意到,我只是用中間的空位忽略了獎杯表情?那么這樣做的輸出會是什么呢?

          console.log(fire, clock, watermelon);

          結(jié)果:

          讓我在這里也介紹一下叫做 rest 操作符的東西。如果你想對一個數(shù)組進行重構(gòu),將一個或多個項目賦值給變量,然后將其余的項目存入另一個數(shù)組,你可以使用......休息運算符來實現(xiàn),如下圖所示。

          let [fruit, ...rest] = emojis;
          console.log(rest);

          結(jié)果:

          對象

          和數(shù)組一樣,我們也可以對對象進行重構(gòu)。

          let shape = {
            name'rect',
            sides4,
            height300,
            width500
          };

          破壞結(jié)構(gòu),我們得到一個名字,邊在幾個變量中,其余的在另一個對象中。

          let {name, sides, ...restObj} = shape;
          console.log(name, sides);
          console.log(restObj);

          結(jié)果:


          獲取查詢參數(shù)

          window.location對象有一堆實用的方法和屬性,我們可以通過這些屬性和方法來獲取瀏覽器URL的協(xié)議、主機、端口、域名等信息。我們可以通過這些屬性和方法從瀏覽器的URL中獲取協(xié)議、主機、端口、域名等信息。

          我發(fā)現(xiàn)非常有用的屬性之一是,

          window.location.search

          搜索屬性從位置URL中返回查詢字符串。下面是一個示例URL:https:/tapasadhiary.com?project=js。location.search將返回,?project=js。

          let project = new URLSearchParams(location.search).get('project');

          結(jié)果:

          js

          最后

          我真的希望你能學(xué)到一些新的技巧。看你能把代碼寫得多小多清晰,是一件很有趣的事。

          你喜歡我的文章嗎?有問題嗎?我是不是犯了錯誤? 請告訴我!!!

          END



          如果覺得這篇文章還不錯
          點擊下面卡片關(guān)注我
          來個【分享、點贊、在看】三連支持一下吧

             “分享、點贊在看” 支持一波  

          瀏覽 49
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧日韩一级 | 综合色操逼 | 熟老女人色 | h网址在线观看 | 西西人体44www大胆无码 |