JavaScript工具函式助力高效開發

前端青山發表於2024-06-20

JavaScript工具函式助力高效開發

前言

日常開發中,面對各種不同的需求,我們經常會用到以前開發過的一些工具函式,把這些工具函式收集起來,將大大提高我們的開發效率

1. 校驗資料型別

export const typeOf = function(obj) {
  return Object.prototype.toString.call(obj).slice(8, -1).toLowerCase()
}

示例:

typeOf(new Date())  // date
typeOf(null) // null
typeOf(true) // boolean
typeOf(() => { }) // function
typeOf('前端圈子')  // string
typeOf([])  // array

2. 防抖

export const debounce = (() => {
  let timer = null
  return (callback, wait = 800) => {
    timer&&clearTimeout(timer)
    timer = setTimeout(callback, wait)
  }
})()

示例: 如 vue 中使用

methods: {
  loadList() {
    debounce(() => {
      console.log('載入資料')
    }, 500)
  }
}

3. 節流

export const throttle = (() => {
  let last = 0
  return (callback, wait = 800) => {
    let now = +new Date()
    if (now - last > wait) {
      callback()
      last = now
    }
  }
})()

4. 手機號脫敏

export const hideMobile = (mobile) => {
  return mobile.replace(/^(\d{3})\d{4}(\d{4})$/, "$1****$2")
}

5. 開啟全屏

export const launchFullscreen = (element) => {
  if (element.requestFullscreen) {
    element.requestFullscreen()
  } else if (element.mozRequestFullScreen) {
    element.mozRequestFullScreen()
  } else if (element.msRequestFullscreen) {
    element.msRequestFullscreen()
  } else if (element.webkitRequestFullscreen) {
    element.webkitRequestFullScreen()
  }
}

6. 關閉全屏

export const exitFullscreen = () => {
  if (document.exitFullscreen) {
    document.exitFullscreen()
  } else if (document.msExitFullscreen) {
    document.msExitFullscreen()
  } else if (document.mozCancelFullScreen) {
    document.mozCancelFullScreen()
  } else if (document.webkitExitFullscreen) {
    document.webkitExitFullscreen()
  }
}

7. 大小寫轉換

引數:

  • str 待轉換的字串
  • type 1-全大寫 2-全小寫 3-首字母大寫
export const turnCase = (str, type) => {
  switch (type) {
    case 1:
      return str.toUpperCase()
    case 2:
      return str.toLowerCase()
    case 3:
      //return str[0].toUpperCase() + str.substr(1).toLowerCase() // substr 已不推薦使用
      return str[0].toUpperCase() + str.substring(1).toLowerCase()
    default:
      return str
  }
}

示例:

turnCase('vue', 1) // VUE
turnCase('REACT', 2) // react
turnCase('vue', 3) // Vue

8. 解析URL引數

export const getSearchParams = () => {
  const searchPar = new URLSearchParams(window.location.search)
  const paramsObj = {}
  for (const [key, value] of searchPar.entries()) {
    paramsObj[key] = value
  }
  return paramsObj
}

示例:

// 假設目前位於 https://****com/index?id=154513&age=18;
getSearchParams(); // {id: "154513", age: "18"}

9. 判斷手機是Andoird還是IOS

/** 
 * 1: ios
 * 2: android
 * 3: 其它
 */
 
export const getOSType=() => {
  let u = navigator.userAgent, app = navigator.appVersion;
  let isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1;
  let isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);
  if (isIOS) {
    return 1;
  }
  if (isAndroid) {
    return 2;
  }
  return 3;
}

10. 陣列物件根據欄位去重

引數:

  • arr 要去重的陣列
  • key 根據去重的欄位名
export const uniqueArrayObject = (arr = [], key = 'id') => {
  if (arr.length === 0) return
  let list = []
  const map = {}
  arr.forEach((item) => {
    if (!map[item[key]]) {
      map[item[key]] = item
    }
  })
  list = Object.values(map)

return list
}

示例:

const responseList = [
    { id: 1, name: '前端' },
    { id: 2, name: '後端' },
    { id: 3, name: '測試' },
    { id: 1, name: '產品經理' },
    { id: 2, name: 'UI設計師' },
    { id: 3, name: '前端' },
    { id: 1, name: '後端' },
    { id: 2, name: '測試' },
    { id: 3, name: '產品經理' },
]

uniqueArrayObject(responseList, 'id')
// [{ id: 1, name: '前端' },{ id: 2, name: '後端' },{ id: 3, name: '測試' }]

11. 滾動到頁面頂部

export const scrollToTop = () => {
  const height = document.documentElement.scrollTop || document.body.scrollTop;
  if (height > 0) {
    window.requestAnimationFrame(scrollToTop);
    window.scrollTo(0, height - height / 8);
  }
}

12. 滾動到元素位置

export const smoothScroll = element =>{
    document.querySelector(element).scrollIntoView({
        behavior: 'smooth'
    });
};

示例:

smoothScroll('#target'); // 平滑滾動到 ID 為 target 的元素

13. 生成uuid

export const uuid = () => {
  const temp_url = URL.createObjectURL(new Blob())
  const uuid = temp_url.toString()
  URL.revokeObjectURL(temp_url) //釋放這個url
  return uuid.substring(uuid.lastIndexOf('/') + 1)
}

示例:

uuid() // a640be34-689f-4b98-be77-e3972f9bffdd

::: warning 注意 不過,uuid一般應由後端來進行生成 :::

14、金額格式化

引數:

  • {number} number:要格式化的數字
  • {number} decimals:保留幾位小數
  • {string} dec_point:小數點符號
  • {string} thousands_sep:千分位符號
export const moneyFormat = (number, decimals, dec_point, thousands_sep) => {
  number = (number + '').replace(/[^0-9+-Ee.]/g, '')
  const n = !isFinite(+number) ? 0 : +number
  const prec = !isFinite(+decimals) ? 2 : Math.abs(decimals)
  const sep = typeof thousands_sep === 'undefined' ? ',' : thousands_sep
  const dec = typeof dec_point === 'undefined' ? '.' : dec_point
  let s = ''
  const toFixedFix = function(n, prec) {
    const k = Math.pow(10, prec)
    return '' + Math.ceil(n * k) / k
  }
  s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.')
  const re = /(-?\d+)(\d{3})/
  while (re.test(s[0])) {
    s[0] = s[0].replace(re, '$1' + sep + '$2')
  }

if ((s[1] || '').length < prec) {
s[1] = s[1] || ''
s[1] += new Array(prec - s[1].length + 1).join('0')
}
return s.join(dec)
}

示例:

moneyFormat(10000000) // 10,000,000.00
moneyFormat(10000000, 3, '.', '-') // 10-000-000.000

15、儲存操作

class MyCache {
  constructor(isLocal = true) {
    this.storage = isLocal ? localStorage : sessionStorage
  }

setItem(key, value) {
if (typeof (value) === 'object') value = JSON.stringify(value)
this.storage.setItem(key, value)
}

getItem(key) {
try {
return JSON.parse(this.storage.getItem(key))
} catch (err) {
return this.storage.getItem(key)
}
}

removeItem(key) {
this.storage.removeItem(key)
}

clear() {
this.storage.clear()
}

key(index) {
return this.storage.key(index)
}

length() {
return this.storage.length
}
}

const localCache = new MyCache()
const sessionCache = new MyCache(false)

export { localCache, sessionCache }

示例:

localCache.getItem('user')
sessionCache.setItem('name','前端圈子')
sessionCache.getItem('token')
localCache.clear()

16、下載檔案

引數:

  • api 介面
  • params 請求引數
  • fileName 檔名
const downloadFile = (api, params, fileName, type = 'get') => {
  axios({
    method: type,
    url: api,
    responseType: 'blob', 
    params: params
  }).then((res) => {
    let str = res.headers['content-disposition']
    if (!res || !str) {
      return
    }
    let suffix = ''
    // 擷取檔名和檔案型別
    if (str.lastIndexOf('.')) {
      fileName ? '' : fileName = decodeURI(str.substring(str.indexOf('=') + 1, str.lastIndexOf('.')))
      suffix = str.substring(str.lastIndexOf('.'), str.length)
    }
    //  如果支援微軟的檔案下載方式(ie10+瀏覽器)
    if (window.navigator.msSaveBlob) {
      try {
        const blobObject = new Blob([res.data]);
        window.navigator.msSaveBlob(blobObject, fileName + suffix);
      } catch (e) {
        console.log(e);
      }
    } else {
      //  其他瀏覽器
      let url = window.URL.createObjectURL(res.data)
      let link = document.createElement('a')
      link.style.display = 'none'
      link.href = url
      link.setAttribute('download', fileName + suffix)
      document.body.appendChild(link)
      link.click()
      document.body.removeChild(link)
      window.URL.revokeObjectURL(link.href);
    }
  }).catch((err) => {
    console.log(err.message);
  })
}
使用:

downloadFile('/api/download', {id}, '檔名')

17、時間操作

關於時間操作,沒必要自己再寫一大串程式碼了,推薦使用 Moment.jsDay.js

Moment.js

在 JavaScript 中解析、校驗、操作、顯示日期和時間。

  • CDN
<script src="https://cdn.bootcdn.net/ajax/libs/react/18.2.0/cjs/react-jsx-dev-runtime.development.min.js"></script>
  • 安裝
npm install moment --save   # npm
yarn add moment             # Yarn
  • 使用

格式化日期

moment().format('MMMM Do YYYY, h:mm:ss a'); // 十一月 5日 2023, 12:33:14 下午
moment().format('dddd');                    // 星期日
moment().format("MMM Do YY");               // 11月 5日 23
moment().format('YYYY [escaped] YYYY');     // 2023 escaped 2023
moment().format();                          // 2023-11-05T12:33:14+08:00

相對時間

moment("20111031", "YYYYMMDD").fromNow(); // 12 年前
moment("20120620", "YYYYMMDD").fromNow(); // 11 年前
moment().startOf('day').fromNow();        // 13 小時前
moment().endOf('day').fromNow();          // 11 小時後
moment().startOf('hour').fromNow();       // 33 分鐘前

日曆時間

moment().subtract(10, 'days').calendar(); // 2023/10/26
moment().subtract(6, 'days').calendar();  // 本週一12:33
moment().subtract(3, 'days').calendar();  // 本週四12:33
moment().subtract(1, 'days').calendar();  // 昨天12:33
moment().calendar();                      // 今天12:33
moment().add(1, 'days').calendar();       // 明天12:33
moment().add(3, 'days').calendar();       // 下週三12:33
moment().add(10, 'days').calendar();      // 2023/11/15

多語言環境支援

moment.locale();         // zh-cn
moment().format('LT');   // 12:33
moment().format('LTS');  // 12:33:14
moment().format('L');    // 2023/11/05
moment().format('l');    // 2023/11/5
moment().format('LL');   // 2023年11月5日
moment().format('ll');   // 2023年11月5日
moment().format('LLL');  // 2023年11月5日下午12點33分
moment().format('lll');  // 2023年11月5日 12:33
moment().format('LLLL'); // 2023年11月5日星期日下午12點33分
moment().format('llll');

Day.js

Day.js 是一個僅 2kb 大小的輕量級 JavaScript 時間日期處理庫,下載、解析和執行的JavaScript更少,為程式碼留下更多的時間。

  • CDN
<script src="https://cdn.bootcdn.net/ajax/libs/dayjs/1.11.9/dayjs.min.js"></script>
  • 安裝
npm install dayjs --save   # npm
yarn add dayjs            # Yarn
cnpm install dayjs -S     # cnpm
pnpm add dayjs        # pnpm
  • 使用 然後在專案程式碼中引入即可:
var dayjs = require('dayjs')
// import dayjs from 'dayjs' // ES 2015
dayjs().format()
dayjs().format();                                     // 2020-09-08T13:42:32+08:00
dayjs().format('YYYY-MM-DD');                         // 2020-09-08
dayjs().format('YYYY-MM-DD HH:mm:ss');                // 2020-09-08 13:47:12
dayjs(1318781876406).format('YYYY-MM-DD HH:mm:ss');   // 2011-10-17 00:17:56

18、深複製

export const clone = parent => {
  // 判斷型別
  const isType = (obj, type) => {
    if (typeof obj !== "object") return false;
    const typeString = Object.prototype.toString.call(obj);
    let flag;
    switch (type) {
      case "Array":
        flag = typeString === "[object Array]";
        break;
      case "Date":
        flag = typeString === "[object Date]";
        break;
      case "RegExp":
        flag = typeString === "[object RegExp]";
        break;
      default:
        flag = false;
    }
    return flag;
  };

// 處理正則
const getRegExp = re => {
var flags = "";
if (re.global) flags += "g";
if (re.ignoreCase) flags += "i";
if (re.multiline) flags += "m";
return flags;
};
// 維護兩個儲存迴圈引用的陣列
const parents = [];
const children = [];

const _clone = parent => {
if (parent = null) return null;
if (typeof parent !
"object") return parent;

let child, proto;

if (isType(parent, "Array")) {
// 對陣列做特殊處理
child = [];
} else if (isType(parent, "RegExp")) {
// 對正則物件做特殊處理
child = new RegExp(parent.source, getRegExp(parent));
if (parent.lastIndex) child.lastIndex = parent.lastIndex;
} else if (isType(parent, "Date")) {
// 對Date物件做特殊處理
child = new Date(parent.getTime());
} else {
// 處理物件原型
proto = Object.getPrototypeOf(parent);
// 利用Object.create切斷原型鏈
child = Object.create(proto);
}

// 處理迴圈引用
const index = parents.indexOf(parent);

if (index != -1) {
// 如果父陣列存在本物件,說明之前已經被引用過,直接返回此物件
return children[index];
}
parents.push(parent);
children.push(child);

for (let i in parent) {
// 遞迴
child[i] = _clone(parent[i]);
}

return child;
};
return _clone(parent);
};

此方法存在一定侷限性:一些特殊情況沒有處理: 例如Buffer物件、Promise、Set、Map。

如果確實想要完備的深複製,推薦使用 lodash 中的 cloneDeep 方法。

19、模糊搜尋

引數:

  • list 原陣列
  • keyWord 查詢的關鍵詞
  • attribute 陣列需要檢索屬性
export const fuzzyQuery = (list, keyWord, attribute = 'name') => {
  const reg = new RegExp(keyWord)
  const arr = []
  for (let i = 0; i < list.length; i++) {
    if (reg.test(list[i][attribute])) {
      arr.push(list[i])
    }
  }
  return arr
}

示例:

const list = [
  { id: 1, name: '前端' },
  { id: 2, name: '後端' },
  { id: 3, name: '測試' },
  { id: 4, name: '產品經理' },
  { id: 5, name: 'UI設計師' },
]
fuzzyQuery(list, '前', 'name') // [{id: 1, name: '樹哥'}]

20. 遍歷樹節點

export const foreachTree = (data, callback, childrenName = 'children') => {
  for (let i = 0; i < data.length; i++) {
    callback(data[i])
    if (data[i][childrenName] && data[i][childrenName].length > 0) {
      foreachTree(data[i][childrenName], callback, childrenName)
    }
  }
}

示例:

假設我們要從樹狀結構資料中查詢 id 為 9 的節點

const treeData = [{
  id: 1,
  label: '一級 1',
  children: [{
    id: 4,
    label: '二級 1-1',
    children: [{
      id: 9,
      label: '三級 1-1-1'
    }, {
      id: 10,
      label: '三級 1-1-2'
    }]
  }]
 }, {
  id: 2,
  label: '一級 2',
  children: [{
    id: 5,
    label: '二級 2-1'
  }, {
    id: 6,
    label: '二級 2-2'
  }]
  }, {
    id: 3,
    label: '一級 3',
    children: [{
      id: 7,
      label: '二級 3-1'
    }, {
      id: 8,
      label: '二級 3-2'
    }]
}],

let result
foreachTree(data, (item) => {
if (item.id === 9) {
result = item
}
})
console.log('result', result) // {id: 9,label: "三級 1-1-1"}

21.陣列物件根據某個元素的某個屬性去判斷原陣列是更新還是push

例如:根據id是否相等? 更新陣列物件中的某個物件,如果相等就更新,不相等就push進去

// 方法
function replaceObjectById(array, newObject) {
  const id = newObject.id;
  let isReplaced = false;
  
  const newArray = array.map(obj => {
    if (obj.id === id) {
      isReplaced = true;
      return newObject;
    }
    return obj;
  });
  
  if (!isReplaced) {
    newArray.push(newObject);
  }
  
  return newArray;
}
// 使用
const array = [
  { id: 1, name: 'Obj1' },
  { id: 2, name: 'Obj2' },
  { id: 3, name: 'Obj3' }
];

const newObject1 = { id: 2, name: 'NewObj1' };
const newObject2 = { id: 4, name: 'NewObj2' };

const updatedArray1 = replaceObjectById(array, newObject1);
console.log(updatedArray1);
// 輸出: [ { id: 1, name: 'Obj1' }, { id: 2, name: 'NewObj1' }, { id: 3, name: 'Obj3' } ]

const updatedArray2 = replaceObjectById(array, newObject2);
console.log(updatedArray2);
// 輸出: [ { id: 1, name: 'Obj1' }, { id: 2, name: 'Obj2' }, { id: 3, name: 'Obj3' }, { id: 4, name: 'NewObj2' } ]

22.生成隨機字串

當我們需要一個唯一id時,透過Math.random建立一個隨機字串簡直不要太方便噢!!!

const randomString = () => Math.random().toString(36).slice(2)
randomString() // gi1qtdego0b
randomString() // f3qixv40mot
randomString() // eeelv1pm3ja

23.轉義HTML特殊字元

解決XSS方法之一就是轉義HTML。

const escape = (str) => str.replace(/[&<>"']/g, (m) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[m]))
escape('<div class="medium">Hi Medium.</div>') 
// &lt;div class=&quot;medium&quot;&gt;Hi Medium.&lt;/div&gt

24.單詞首字母大寫

const uppercaseWords = (str) => str.replace(/^(.)|\s+(.)/g, (c) => c.toUpperCase())
uppercaseWords('hello world'); // 'Hello World'

25.將字串轉換為小駝峰

const toCamelCase = (str) => str.trim().replace(/[-_\s]+(.)?/g, (_, c) => (c ? c.toUpperCase() : ''));
toCamelCase('background-color'); // backgroundColor
toCamelCase('-webkit-scrollbar-thumb'); // WebkitScrollbarThumb
toCamelCase('_hello_world'); // HelloWorld
toCamelCase('hello_world'); // helloWorld

26.轉義HTML特殊字元

得益於ES6,使用Set資料型別來對陣列去重太方便了

const removeDuplicates = (arr) => [...new Set(arr)]
console.log(removeDuplicates([1, 2, 2, 3, 3, 4, 4, 5, 5, 6])) 
// [1, 2, 3, 4, 5, 6]

27.鋪平一個陣列

const flat = (arr) =>
    [].concat.apply(
        [],
        arr.map((a) => (Array.isArray(a) ? flat(a) : a))
    )
// Or
const flat = (arr) => arr.reduce((a, b) => (Array.isArray(b) ? [...a, ...flat(b)] : [...a, b]), [])
flat(['cat', ['lion', 'tiger']]) // ['cat', 'lion', 'tiger']

28.移除陣列中的假值

const removeFalsy = (arr) => arr.filter(Boolean)
removeFalsy([0, 'a string', '', NaN, true, 5, undefined, 'another string', false])
// ['a string', true, 5, 'another string']

29.確認一個數字是奇數還是偶數

const isEven = num => num % 2 === 0
isEven(2) // true
isEven(1) // false

30.獲取兩個數字之間的隨機數

const random = (min, max) => Math.floor(Math.random() * (max - min + 1) + min)
random(1, 50) // 25
random(1, 50) // 34

31.計算平均值

const average = (...args) => args.reduce((a, b) => a + b) / args.length;
average(1, 2, 3, 4, 5);   // 3

32.將數字截斷到固定的小數點

const round = (n, d) => Number(Math.round(n + "e" + d) + "e-" + d)
round(1.005, 2) //1.01
round(1.555, 2) //1.56

33.計算兩個日期之間天數

const diffDays = (date, otherDate) => Math.ceil(Math.abs(date - otherDate) / (1000 * 60 * 60 * 24));
diffDays(new Date("2021-11-3"), new Date("2022-2-1"))  // 90

34.從日期中獲取是一年中的哪一天

const dayOfYear = (date) => Math.floor((date - new Date(date.getFullYear(), 0, 0)) / (1000 * 60 * 60 * 24))
dayOfYear(new Date()) // 74

35.獲取一個隨機的顏色值

const randomColor = () => `#${Math.random().toString(16).slice(2, 8).padEnd(6, '0')}`
randomColor() // #9dae4f
randomColor() // #6ef10e

36.將RGB顏色轉換為十六進位制顏色值

const rgbToHex = (r, g, b) => "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1)
rgbToHex(255, 255, 255)  // '#ffffff'

37.清除所有的cookie

const clearCookies = () => document.cookie.split(';').forEach((c) => (document.cookie = c.replace(/^ +/, '').replace(/=.*/, `=;expires=${new Date().toUTCString()};path=/`)))

38.檢測黑暗模式

const isDarkMode = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches

39.交換兩個變數的值

[foo, bar] = [bar, foo]

40.暫停一會

const pause = (millis) => new Promise(resolve => setTimeout(resolve, millis))
const fn = async () => {
  await pause(1000)
  console.log('fatfish') // 1s later
}
fn()

41.JS適配rem

// 呼叫
getFontSize();

<style>
/使用方式很簡單,比如效果圖上,有張圖片。寬高都是100px;/
/樣式寫法就是/
img{
width:1rem;
height:1rem;
}
/這樣的設定,比如在螢幕寬度大於等於750px裝置上,1rem=100px;圖片顯示就是寬高都是100px/
/比如在iphone6(螢幕寬度:375)上,375/750100=50px;就是1rem=50px;圖片顯示就是寬高都是50px;*/
</style>

/**
 * JS適配rem
 */
function getFontSize(){
    var doc=document,win=window;
    var docEl = doc.documentElement,
        resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
        recalc = function () {
            var clientWidth = docEl.clientWidth;
            if (!clientWidth) return;
            //如果螢幕大於750(750是根據我效果圖設定的,具體數值參考效果圖),就設定clientWidth=750,防止font-size會超過100px
            if(clientWidth>750){clientWidth=750}
            //設定根元素font-size大小
            docEl.style.fontSize = 100 * (clientWidth / 750) + 'px';
        };
    //螢幕大小改變,或者橫豎屏切換時,觸發函式
    win.addEventListener(resizeEvt, recalc, false);
    //文件載入完成時,觸發函式
    doc.addEventListener('DOMContentLoaded', recalc, false);
}

42.JS判斷瀏覽器

/**
 * JS判斷瀏覽器
 * @returns {string}
 */
function getBrowserName () {
    if (navigator.userAgent.indexOf("MSIE 8.0") > 0) {
        return "MSIE8";
    } else if (navigator.userAgent.indexOf("MSIE 6.0") > 0) {
        return "MSIE6";
    } else if (navigator.userAgent.indexOf("MSIE 7.0") > 0) {
        return "MSIE7";
    } else if (isFirefox = navigator.userAgent.indexOf("Firefox") > 0) {
        return "Firefox";
    }
    if (navigator.userAgent.indexOf("Chrome") > 0) {
        return "Chrome";
    } else {
        return "Other";
    }
}

43.JS判斷兩個陣列是否相等

/**
 * @param {Array} arr1
 * @param {Array} arr2
 * @returns {boolean} 返回true 或 false
 */
function arrayEqual(arr1, arr2) {
    if (arr1 === arr2) return true;
    if (arr1.length != arr2.length) return false;
    for (var i = 0; i < arr1.length; ++i) {
        if (arr1[i] !== arr2[i]) return false;
    }
    return true;
}

44.JS驗證手機格式

    // 呼叫方法:
    verifyPhoneNumber('18412345678')
/**
 * @param str 對應手機號碼
 * @returns {boolean} 結果返回 true 和 false。
 * true 為正確手機號碼
 * false 為錯誤手機號碼
 */
function verifyPhoneNumber(str){
    var myreg = /^(((13[0-9]{1})|(15[0-9]{1})|(17[0-9]{1})|(18[0-9]{1}))+\d{8})$/;
    return myreg.test(str);
}

45.獲取位址列引數的值

// 若當前的URL地址為:a.html?t1=1&t2=2&t3=3
console.log(getUrlParam("t1")); // 1
/**
 * JS獲取位址列引數的值
 * @param name 對應的引數
 * @returns {*} 如果有,則返回引數值,沒有則返回null
 */
function getUrlParam(name){
    var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
    var r = window.location.search.substr(1).match(reg);
    if (r != null) {
        return unescape(r[2]);
    } else {
        return null;
    }
}

46.檢查輸入的字元是否具有特殊字元

checkQuote("dasd1!/,/.");    // true
checkQuote("52014sdsda");    // false
/**
 * JS檢查輸入的字元是否具有特殊字元
 * @param str 字串
 * @returns true 或 false; true表示包含特殊字元 主要用於註冊資訊的時候驗證
 */
function checkQuote(str) {
    var items = new Array("~", "`", "!", "@", "#", "$", "%", "^", "&", "*", "{", "}", "[", "]", "(", ")");
    items.push(":", ";", "'", "|", "\", "<", ">", "?", "/", "<<", ">>", "||", "//");
    items.push("select", "delete", "update", "insert", "create", "drop", "alter", "trancate");
    str = str.toLowerCase();
    for ( var i = 0; i < items.length; i++) {
        if (str.indexOf(items[i]) >= 0) {
            return true;
        }
    }
    return false;
}

47.JS判斷是否為空

/**
 * JS判斷是否為空
 * @param val
 * @returns {boolean}
 */
function isNull(val) {
    if (val == undefined || val == null || val == "") {
        return true;
    }
    return false;
}

相關文章