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.js
和 Day.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) => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[m]))
escape('<div class="medium">Hi Medium.</div>')
// <div class="medium">Hi Medium.</div>
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;
}