javascript 상용 도구 함수 요약

13098 단어
머리말
  • 다음 코드 는 자신 이 쓴 것, 작업 프로젝트 구조 에 사 용 된 것, 다른 프레임 워 크 소스 에 사 용 된 것, 인터넷 에서 본 것 이다.
  • 주로 도구 함수 로 서 프레임 워 크 업무 에 서 비 스 를 제공 하고 자신 은 다른 프레임 워 크 라 이브 러 리 에 의존 하지 않 으 며 일 부 는 es6 / es7 의 문법 을 사용 할 때 디 코딩
  • 에 주의해 야 한다.
  • 함수 에서 가능 한 한 잘못된 상황 을 처 리 했 지만 잘못된 상황 이 발생 할 수 있 습 니 다 (비정 기적 으로 완선)
  • 1. url 의 인자 가 져 오기
      /**
       *  url    
       * @return {object}
       * @example
       * getRequest()  getRequest().paramA
       */
    function getRequest() {
        var searchString = window.location.search.substring(1),
            params = searchString.split("&"),
            hash = {};
        if (searchString == "") return {};
        for (var i = 0; i < params.length; i++) {
            var pos = params[i].indexOf('=');
            if (pos == -1) { continue; }
            var paraName = params[i].substring(0, pos),
                paraValue = params[i].substring(pos + 1);
            hash[paraName] = paraValue;
        }
        return hash;
    }
    
  • 대상 을 되 돌려 주 고 url 에 있 는 인 자 를 키 값 쌍 으로 되 돌려 주 는 형식 으로 되 돌려 줍 니 다. url 에 인자 가 없 으 면 빈 대상 으로 되 돌려 줍 니 다
  • 2. url 인자 추가
      /**
       *   url  
       * @param {string} url url  
       * @param {string|object} key       
       * @param {string} value  
       * @return {string}     url
       * @example
       * appendQuery('lechebang.com', 'id', 3);
       * appendQuery('lechebang.com?key=value', { cityId: 2, cityName: '  '});
       */
      function appendQuery (url, key, value) {
        var options = key;
        if (typeof options == 'string') {
          options = {};
          options[key] = value;
        }
        options = $.param(options);
        if (url.includes('?')) {
          url += '&' + options
        } else {
          url += '?' + options
        }
        return url;
      }
    
  • url 과 추가 해 야 할 매개 변수 키 쌍 을 입력 하고 추가 해 야 할 매개 변 수 는 대상 형식 을 직접 전달 할 수 있 습 니 다.원래 url 에 인자 가 있 는 지 판단 하고 없 으 면 '?' 를 추가 합 니 다.파 라 메 터 를 추가 한 url 을 되 돌려 줍 니 다.

  • 3. 두 날짜 의 시간 차 를 계산한다
      /**
       *             
       * @param {Date, Date}  date1 date2
       * @return {object | null} 
       * @example
       * getDiff(new Date('2017-09-08'), new Date())
       */
    function getDiff(date1, date2) {
         if (!date1.getTime || !date2.getTime) return null
         var ms = (date1.getTime() - date2.getTime());
         var day1 = Math.round(ms / 24 / 3600 / 1000),
             hh1 = Math.round((ms / 3600 / 1000) % 24),
             mm1 = Math.round((ms / 1000 / 60) % 60),
             ss1 = Math.round((ms / 1000) % 60);
         return {
             day: day1,
             hour: hh1,
             minute: mm1,
             second: ss1
          };
    }
    
  • 두 개의 Date 날짜 대상 을 입력 하고 한 대상 을 되 돌려 줍 니 다. 그 속성 치 는 day, hour, minute, second 는 각각 차이 일수, 시간, 분, 초 를 표시 합 니 다.결 과 는 Math. round () 로 정 리 했 고 결과 가 마이너스 라면 첫 번 째 날짜 가 두 번 째 날짜 앞
  • 임 을 나타 낸다.
    4. canvas 를 image 그림 형식 으로 변환
      /**
       *  canvas   image  
       * @param {string}  cId
       * @return {object HTMLImageElement} 
       * @example
       * canvasToImg('canvas')  canvasToImg('#canvarsId')
       */
    function canvasToImg(cId){
        let canvas = document.querySelector(cId)
        if (!canvas || !canvas.toDataURL) return new Image()
        let imgData = canvas.toDataURL('image/png'),
            imgs= new Image();
            imgs.src=imgData;
        return imgs
    }
    
  • css 선택 기 를 입력 합 니 다. 함 수 는 선택 기 에 따라 canvas 노드 를 조회 한 다음 에 이 canvas 의 image 형식 노드 를 되 돌려 줍 니 다. 찾 지 못 하면 빈 image 를 되 돌려 줍 니 다.원 리 는 canvas 를 base 64 인 코딩 으로 바 꾸 는 것 입 니 다. toDataURL 방법 은 canvas 노드 만 있 는 것 같 습 니 다. 그리고 src 를 새로 만 드 는 것 은 이 base 64 인 코딩 의 그림 입 니 다.
  • ps: 어떤 상황 에서 이런 전환 을 해 야 합 니까?현재 내 가 알 고 있 는 것 중 하 나 는 canvas 가 모 바 일 에서 길 게 눌 러 휴대 전화 에 저장 할 수 없다 는 것 이다.

  • 5. 랜 덤 guid 생 성
      /**
       *        guid
       * @return {string}
       * @example
       * // 7f603b20-17ff-4f47-aeb9-e7996de04939
       * util.guid();
       * @see http://stackoverflow.com/questions/105034/create-guid-uuid-in-javascript
       */
      function guid () {
        return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
          var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
          return v.toString(16);
        });
      }
    
  • 이 방법 은 무 작위 guid 를 만 드 는 데 사 용 됩 니 다. 생 성 된 guid 를 전체 국면 에서 유일한 것 으로 볼 수 있 습 니 다 (같은 id 를 만 드 는 경 우 는 매우 적 습 니 다).guid 는 전단 에서 사용 하 는 것 이 비교적 적은 것 같 습 니 다. 현재 프로젝트 는 백 엔 드 인 터 페 이 스 를 요청 할 때마다 이 방법 을 사용 하여 guid 를 생 성하 여 전달 하 는 것 입 니 다.

  • 6. 1 개 월 일수 획득
      function isLeapYear (year) {
        if (year % 100 === 0) {
          if (year % 400 === 0) {
            return true;
          }
        } else if (year % 4 === 0) {
          return true;
        }
        return false;
      }
      /**
       *           
       * @return {number}
       * @param {string | number}  year month
       * @example
       * getDaysInMonth(2017, 9)
       */
      function getDaysInMonth (year, month) {
        return [31, isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
      }
    
  • 한 해 와 달 이 들 어 와 이 달 로 돌아 가 는 데 며칠 이 걸 리 는 지, 윤년 인지 아 닌 지 를 판단 하 는 isLeapYear 방법 도 포함 되 어 있 습 니 다. 달력 이나 날짜 에 구성 요 소 를 선택 할 때 사용 해 야 합 니 다
  • 7. 필터 대상 속성
      /**
       *              
       * @param{object, array} obj key
       * @return{object}
       * @example
       * pick(obj, [key1, key2])
       */
      function pick (obj, keys) {
        let result = {}
        if (!obj || !keys.forEach) {
          return result
        }
        keys.forEach((item) => {
          if (obj.hasOwnProperty(item)) {
            result[item] = obj[item]
          }
        })
        return result
      }
    
  • 한 대상 과 한 배열 에 들 어가 배열 을 옮 겨 다 니 며 대상 에 배열 에 포 함 된 속성 이 있 으 면 추출 하여 추출 한 속성 으로 구 성 된 대상 을 되 돌려 줍 니 다.
  • 이 방법 은 사용 하 는 곳 이 매우 많다. 예 를 들 어 하나의 인터페이스 에서 결과 대상 을 얻 었 다. 위 에 많은 속성 을 사용 하지 못 할 수도 있 으 니 이 방법 으로 여과 할 수 있다.예 를 들 어 예전 에 제 가 vue 로 프로젝트 를 쓸 때 인 터 페 이 스 를 되 돌려 주 는 대상 을 vue 의 data 속성 으로 페이지 를 렌 더 링 했 습 니 다. 이때 이 대상 은 vue 인 스 턴 스 위 에 동적 으로 연결 되 었 지만 그 중에서 일부 속성 페이지 렌 더 링 은 전혀 사용 되 지 않 고 이런 속성 을 감청 해 야 합 니 다. 성능 을 헛되이 낭비 합 니 다.이 럴 때 인터페이스 가 되 돌아 오 는 대상 을 선별 해서 vue 에 부여 하 는 data 가 훨씬 합 리 적 입 니 다.

  • 8. 대상 여 부 를 판단 한다
      /**
       *                
       * @param{object} obj 
       * @return{object}
       * @example
       * isObject (null) isObject (() => {} )
       */
    function isObject (obj) {
        var type = typeof obj;
        return type === 'function' || type === 'object' && !!obj;
      }
    
  • 들 어 오 는 매개 변수 가 합 법 적 인 대상 인지 판단 하고 function 형식 은 모두 true 로 돌아 가 며 null 은 false (type: of null 은 object 로 돌아 갑 니 다)
  • 9. 함수 가 native code 인지 판단 하기
      /**
       *                   
       * @param{function} Ctor 
       * @return{boolean}
       * @example
       * isNative (window.Symbol)  isNative (window.Promise)
       */
    function isNative (Ctor) {
      return typeof Ctor === 'function' && /native code/.test(Ctor.toString())
    }
    
  • javascript 은 원래 가지 고 있 는 방법 으로 toString 을 문자열 로 변환 할 때 'native code' 필드 를 포함 합 니 다. 예 를 들 어 Math. max. toString () 은 'function max () {[native code]}' 로 돌아 갑 니 다.
  • 이 방법 은 일부 원생 특성 이 현재 브 라 우 저 에 의 해 지원 되 는 지 여 부 를 판단 할 수 있 습 니 다.예 를 들 어 isNative (window. Promise) 는 chrome 에서 true 로 돌아 갑 니 다. chrome 은 원생 es6 문법 을 지원 하기 때문에 ie 에 넣 으 면 false 로 돌아 갈 수 밖 에 없습니다 ~
  • 10. 딥 클론 대상
      /**
       *                   
       * @param{object} obj 
       * @return{object}
       * @example
       * cloneDeep(obj)
       */
      function cloneDeep (obj) {
        if (!isObject(obj)) return obj;
        let result
        if (Array.isArray(obj)) {
          result = []
          obj.forEach((item) => {
            result.push(cloneDeep(item))
          })
          return result
        }
        result = {}
        for (let key in obj) {
          let item = obj[key]
          if (_.isObject(item)) {
            result[key] = cloneDeep(item)
          } else {
            result[key] = item
          }
        }
    
        return result
      }
    
  • 먼저 들 어 오 는 매개 변 수 를 판단 하고 합 법 적 인 대상 이 아니면 그 자체 로 돌아간다.그 다음 에 그 속성 을 옮 겨 다 니 면 속성 에 대상 을 포함 하 는 것 은 다시 cloneDeep 방법 을 재 귀적 으로 호출 합 니 다. 얕 은 복 제 는 Object. assign () 방법 을 직접 사용 할 수 있 습 니 다.

  • 11. 두 지점 의 실제 거 리 를 얻는다
    /**
       *            ,     ,  ,       
       * @return {null|number}      ,      ,  null
       * @example
       * getDistance(31.282055633974, 121.379623888259)
       */
      function getDistance (endLat, endLon, startLat, startLon) {
        if (!startLat) {
          let address = Lizard.state.address
    
          if (address && address.lat) {
            startLat = address.lat
            startLon = address.lon
          }
        }
    
        //     
        if (!startLat) {
          return null
        }
    
        const PI = Math.PI
        let lon1 = (PI / 180) * startLon
        let lon2 = (PI / 180) * endLon 
        let lat1 = (PI / 180) * startLat  
        let lat2 = (PI / 180) * endLat 
        //       
        let R = 6378.137;  
    
        //       km,       ,  *1000      
        let d = Math.acos(Math.sin(lat1) * Math.sin(lat2) + Math.cos(lat1) * Math.cos(lat2) * Math.cos(lon2 - lon1)) * R;  
    
        return parseInt(d * 1000, 10)
      }
    
  • 두 점 의 경위도 에 차례대로 들 어간 다음 에 두 점 의 거 리 를 계산 해 내 고 단 위 는 km 이다.이 방법 은 실제 적 으로 응용 되 는 것 이 비교적 적 을 수 있 습 니 다. 저 는 여기 서 쓰 겠 습 니 다. 전단 으로 거 리 를 계산 하 는 방법 (포 지 셔 닝 을 얻 을 수 있 는 상황 에서) 입 니 다.

  • 12. 그림 불 러 오기 (promise 패키지)
    /**
       *     url,    promise  ,     resolve
       * @return {Promise} 
       * @example
       * loadImg(url).then(console.log('    ')).catch(err => {console.log(err)})
       */
      function loadImg (url) {
        return new Promise((resolve, reject) => {
          let img = new Image()
    
          img.addEventListener('load', function() {
            resolve([img.width, img.height])
          }, false)
    
          img.addEventListener('error', reject, false)
    
          img.src = url
        })
      }
    
  • 이 함 수 는 ECMAScript 6 입문 을 참고 하여 promise 의 전형 적 인 응용 인 스 턴 스 라 고 할 수 있 습 니 다. 로드 가 완 료 된 후 promise 대상 resolve 를 불 러 오고 그림 의 너비 와 높이 를 되 돌려 주 며 나중에 스타일 을 조정 할 수 있 도록 합 니 다.불 러 오 는 데 실패 하면 reject 로 돌아 가기 때문에 이 방법 을 다시 호출 한 후 catch 방법 으로 이상 을 포착 해 야 합 니 다.

  • 13. 반복 문자열 n 회
    /**
       *      ,     ,       
       * @return {string} 
       * @param{string, number} str n 
       * @example
       * loadImg(url).then(console.log('    ')).catch(err => {console.log(err)})
       */
      const repeat = (str, n) => {
        let res = ''
        while (n) {
          if (n % 2 === 1) res += str
          if (n > 1) str += str
          n >>= 1
        }
        return res
      }
    
  • 이 함 수 는 vue 소스 코드 에서 보 았 습 니 다. 비트 연산 자 를 사 용 했 습 니 다. 제 가 실현 하면 바로 n 회 반복 을 생각 할 수 있 습 니 다. 위 에 있 는 이 함수 가 실 행 될 때 시간 복잡 도 차 이 는 n / 2 에 불과 합 니 다.

  • 14. 변 수 는 '$' 또는 '' 로첫머리
    /**
       *      ,     '$'  '_'  
       * @return {Boolean} 
       * @param{string} str
       * @example
       * isReserved (‘$’)  isReserved (‘param’)
       */
    function isReserved (str) {
      var c = (str + '').charCodeAt(0);
      return c === 0x24 || c === 0x5F
    }
    
  • 역시 vue 소스 코드 의 방법 으로 변수 가 '$' 또는 '' 로 되 어 있 는 지 판단 합 니 다.처음에 charCodeAt (index) 방법 은 index 위치 에 대응 하 는 문자열 의 유 니 코드 인 코딩 을 되 돌려 줍 니 다. '$' 에 대응 하 는 유 니 코드 인 코딩 은 36 입 니 다. 여 기 는 16 진법 표시 방법 이 0x 24 입 니 다.변수 이름 이 어떤 문자 로 시작 하거나 끝 나 는 지 판단 하려 면 위의 방법 을 약간 수정 하면 이 루어 집 니 다.
  • ps: vue 에서 이 방법 을 어디 에 사 용 했 는 지 알 아 보 겠 습 니 다. vue 인 스 턴 스 의 data 대상 을 초기 화 할 때 판단 하 겠 습 니 다. vue 인 스 턴 스 data 에 '$' 또는 '' 이 라 고 명명 되 어 있다 면.의 대상 은 이 속성 을 get / set 로 다시 정의 하지 않 습 니 다.쉽게 말 하면 vue 의 data 에서 $data 라 는 속성 을 정의 하고 템 플 릿 에 {{$data}} 을 표시 하면 잘못 보 고 됩 니 다.

  • 15. promise 확장 - finally
    /**
       *    promise       finally,      ,    promise             
       * @param{function} callback
       * @example
       *  server.listen(0).then(function () { // run test }).finally(server.stop);
       */
    Promise.prototype.finally = function (callback) {
      let P = this.constructor;
      return this.then(
        value  => P.resolve(callback()).then(() => value).catch(e => {console.error(e)}),
        reason => P.resolve(callback()).then(() => { throw reason }).catch(e => {console.error(e)})
      );
    };
    
  • ECMAScript 6 입문 을 참고 하여 promise 대상 에 대한 확장 방법 은 앞의 promise 상태 가 무엇이든 콜 백 함 수 를 호출 합 니 다.
  • 저 는 원래 코드 를 바탕 으로 새로운 catch 를 추 가 했 습 니 다. 콜 백 을 호 환 할 때 reject 상태 인 promise 의 상황 을 되 돌려 주 었 습 니 다.

  • 16. dom 요소 가 현재 창 에서 볼 수 있 는 지 판단 하기
    /**
       *        dom              
       *         false   , true                true
       * @param {object,Boolean}
       * @example
       *  elementIsVisibleInViewport(document.querySelector('div'), true)
       */
    const elementIsVisibleInViewport = (el, partiallyVisible = false) => {
      const { top, left, bottom, right } = el.getBoundingClientRect();
      const { innerHeight, innerWidth } = window;
      return partiallyVisible
        ? ((top > 0 && top < innerHeight) || (bottom > 0 && bottom < innerHeight)) &&
            ((left > 0 && left < innerWidth) || (right > 0 && right < innerWidth))
        : top >= 0 && left >= 0 && bottom <= innerHeight && right <= innerWidth;
    };
    

    결어
  • 다시 보충
  • 좋은 웹페이지 즐겨찾기