JavaScript 工具函式大全(新)
前言
一線大廠筆試題靈感來源
目錄:
- 第一部分:陣列
- 第二部分:函式
- 第三部分:字串
- 第四部分:物件
- 第五部分:數字
- 第六部分:瀏覽器操作及其它
篩選自以下兩篇文章:
原本只想篩選下上面的那篇文章,在精簡掉了部分多餘且無用的工具函式後,感覺不夠。於是順藤摸瓜,找到了原地址:
然後將所有程式碼段都看了遍,篩選了以下一百多段程式碼片段,並加入了部分自己的理解。
另外,本文工具函式的命名非常值得借鑑。
1. 第一部分:陣列
1. all
:布林全等判斷
const all = (arr, fn = Boolean) => arr.every(fn);
all([4, 2, 3], x => x > 1); // true
all([1, 2, 3]); // true
2. allEqual
:檢查陣列各項相等
const allEqual = arr => arr.every(val => val === arr[0]);
allEqual([1, 2, 3, 4, 5, 6]); // false
allEqual([1, 1, 1, 1]); // true
3.approximatelyEqual
:約等於
const approximatelyEqual = (v1, v2, epsilon = 0.001) => Math.abs(v1 - v2) < epsilon;
approximatelyEqual(Math.PI / 2.0, 1.5708); // true
4.arrayToCSV
:陣列轉CSV
格式(帶空格的字串)
const arrayToCSV = (arr, delimiter = ',') =>
arr.map(v => v.map(x => `"${x}"`).join(delimiter)).join('n');
arrayToCSV([['a', 'b'], ['c', 'd']]); // '"a","b"n"c","d"'
arrayToCSV([['a', 'b'], ['c', 'd']], ';'); // '"a";"b"n"c";"d"'
5.arrayToHtmlList
:陣列轉li
列表
此程式碼段將陣列的元素轉換為<li>
標籤,並將其附加到給定ID的列表中。
const arrayToHtmlList = (arr, listID) =>
(el => (
(el = document.querySelector('#' + listID)),
(el.innerHTML += arr.map(item => `<li>${item}</li>`).join(''))
))();
arrayToHtmlList(['item 1', 'item 2'], 'myListID');
6. average
:平均數
const average = (...nums) => nums.reduce((acc, val) => acc + val, 0) / nums.length;
average(...[1, 2, 3]); // 2
average(1, 2, 3); // 2
7. averageBy
:陣列物件屬性平均數
此程式碼段將獲取陣列物件屬性的平均值
const averageBy = (arr, fn) =>
arr.map(typeof fn === 'function' ? fn : val => val[fn]).reduce((acc, val) => acc + val, 0) /
arr.length;
averageBy([{ n: 4 }, { n: 2 }, { n: 8 }, { n: 6 }], o => o.n); // 5
averageBy([{ n: 4 }, { n: 2 }, { n: 8 }, { n: 6 }], 'n'); // 5
8.bifurcate
:拆分斷言後的陣列
可以根據每個元素返回的值,使用reduce()
和push()
將元素新增到第二次引數fn
中 。
const bifurcate = (arr, filter) =>
arr.reduce((acc, val, i) => (acc[filter[i] ? 0 : 1].push(val), acc), [[], []]);
bifurcate(['beep', 'boop', 'foo', 'bar'], [true, true, false, true]);
// [ ['beep', 'boop', 'bar'], ['foo'] ]
9. castArray
:其它型別轉陣列
const castArray = val => (Array.isArray(val) ? val : [val]);
castArray('foo'); // ['foo']
castArray([1]); // [1]
castArray(1); // [1]
10. compact
:去除陣列中的無效/無用值
const compact = arr => arr.filter(Boolean);
compact([0, 1, false, 2, '', 3, 'a', 'e' * 23, NaN, 's', 34]);
// [ 1, 2, 3, 'a', 's', 34 ]
11. countOccurrences
:檢測數值出現次數
const countOccurrences = (arr, val) => arr.reduce((a, v) => (v === val ? a + 1 : a), 0);
countOccurrences([1, 1, 2, 1, 2, 3], 1); // 3
12. deepFlatten
:遞迴扁平化陣列
const deepFlatten = arr => [].concat(...arr.map(v => (Array.isArray(v) ? deepFlatten(v) : v)));
deepFlatten([1, [2], [[3], 4], 5]); // [1,2,3,4,5]
13. difference
:尋找差異
此程式碼段查詢兩個陣列之間的差異。
const difference = (a, b) => {
const s = new Set(b);
return a.filter(x => !s.has(x));
};
difference([1, 2, 3], [1, 2, 4]); // [3]
14. differenceBy
:先執行再尋找差異
在將給定函式應用於兩個列表的每個元素之後,此方法返回兩個陣列之間的差異。
const differenceBy = (a, b, fn) => {
const s = new Set(b.map(fn));
return a.filter(x => !s.has(fn(x)));
};
differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor); // [1.2]
differenceBy([{ x: 2 }, { x: 1 }], [{ x: 1 }], v => v.x); // [ { x: 2 } ]
15. dropWhile
:刪除不符合條件的值
此程式碼段從陣列頂部開始刪除元素,直到傳遞的函式返回為true
。
const dropWhile = (arr, func) => {
while (arr.length > 0 && !func(arr[0])) arr = arr.slice(1);
return arr;
};
dropWhile([1, 2, 3, 4], n => n >= 3); // [3,4]
16. flatten
:指定深度扁平化陣列
此程式碼段第二引數可指定深度。
const flatten = (arr, depth = 1) =>
arr.reduce((a, v) => a.concat(depth > 1 && Array.isArray(v) ? flatten(v, depth - 1) : v), []);
flatten([1, [2], 3, 4]); // [1, 2, 3, 4]
flatten([1, [2, [3, [4, 5], 6], 7], 8], 2); // [1, 2, 3, [4, 5], 6, 7, 8]
17. indexOfAll
:返回陣列中某值的所有索引
此程式碼段可用於獲取陣列中某個值的所有索引,如果此值中未包含該值,則返回一個空陣列。
const indexOfAll = (arr, val) => arr.reduce((acc, el, i) => (el === val ? [...acc, i] : acc), []);
indexOfAll([1, 2, 3, 1, 2, 3], 1); // [0,3]
indexOfAll([1, 2, 3], 4); // []
18. intersection
:兩陣列的交集
const intersection = (a, b) => {
const s = new Set(b);
return a.filter(x => s.has(x));
};
intersection([1, 2, 3], [4, 3, 2]); // [2, 3]
19. intersectionWith
:兩陣列都符合條件的交集
此片段可用於在對兩個陣列的每個元素執行了函式之後,返回兩個陣列中存在的元素列表。
const intersectionBy = (a, b, fn) => {
const s = new Set(b.map(fn));
return a.filter(x => s.has(fn(x)));
};
intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor); // [2.1]
20. intersectionWith
:先比較後返回交集
const intersectionWith = (a, b, comp) => a.filter(x => b.findIndex(y => comp(x, y)) !== -1);
intersectionWith([1, 1.2, 1.5, 3, 0], [1.9, 3, 0, 3.9], (a, b) => Math.round(a) === Math.round(b)); // [1.5, 3, 0]
21. minN
:返回指定長度的升序陣列
const minN = (arr, n = 1) => [...arr].sort((a, b) => a - b).slice(0, n);
minN([1, 2, 3]); // [1]
minN([1, 2, 3], 2); // [1,2]
22. negate
:根據條件反向篩選
const negate = func => (...args) => !func(...args);
[1, 2, 3, 4, 5, 6].filter(negate(n => n % 2 === 0)); // [ 1, 3, 5 ]
23. randomIntArrayInRange
:生成兩數之間指定長度的隨機陣列
const randomIntArrayInRange = (min, max, n = 1) =>
Array.from({ length: n }, () => Math.floor(Math.random() * (max - min + 1)) + min);
randomIntArrayInRange(12, 35, 10); // [ 34, 14, 27, 17, 30, 27, 20, 26, 21, 14 ]
24. sample
:在指定陣列中獲取隨機數
const sample = arr => arr[Math.floor(Math.random() * arr.length)];
sample([3, 7, 9, 11]); // 9
25. sampleSize
:在指定陣列中獲取指定長度的隨機數
此程式碼段可用於從陣列中獲取指定長度的隨機數,直至窮盡陣列。
使用Fisher-Yates
演算法對陣列中的元素進行隨機選擇。
const sampleSize = ([...arr], n = 1) => {
let m = arr.length;
while (m) {
const i = Math.floor(Math.random() * m--);
[arr[m], arr[i]] = [arr[i], arr[m]];
}
return arr.slice(0, n);
};
sampleSize([1, 2, 3], 2); // [3,1]
sampleSize([1, 2, 3], 4); // [2,3,1]
26. shuffle
:“洗牌” 陣列
此程式碼段使用Fisher-Yates
演算法隨機排序陣列的元素。
const shuffle = ([...arr]) => {
let m = arr.length;
while (m) {
const i = Math.floor(Math.random() * m--);
[arr[m], arr[i]] = [arr[i], arr[m]];
}
return arr;
};
const foo = [1, 2, 3];
shuffle(foo); // [2, 3, 1], foo = [1, 2, 3]
27. nest
:根據parent_id
生成樹結構(阿里一面真題)
根據每項的parent_id
,生成具體樹形結構的物件。
const nest = (items, id = null, link = 'parent_id') =>
items
.filter(item => item[link] === id)
.map(item => ({ ...item, children: nest(items, item.id) }));
用法:
const comments = [
{ id: 1, parent_id: null },
{ id: 2, parent_id: 1 },
{ id: 3, parent_id: 1 },
{ id: 4, parent_id: 2 },
{ id: 5, parent_id: 4 }
];
const nestedComments = nest(comments); // [{ id: 1, parent_id: null, children: [...] }]
強烈建議去理解這個的實現,因為這是我親身遇到的阿里一面真題:
2. 第二部分:函式
1.attempt
:捕獲函式執行異常
該程式碼段執行一個函式,返回結果或捕獲的錯誤物件。
onst attempt = (fn, ...args) => {
try {
return fn(...args);
} catch (e) {
return e instanceof Error ? e : new Error(e);
}
};
var elements = attempt(function(selector) {
return document.querySelectorAll(selector);
}, '>_>');
if (elements instanceof Error) elements = []; // elements = []
2. defer
:推遲執行
此程式碼段延遲了函式的執行,直到清除了當前呼叫堆疊。
const defer = (fn, ...args) => setTimeout(fn, 1, ...args);
defer(console.log, 'a'), console.log('b'); // logs 'b' then 'a'
3. runPromisesInSeries
:執行多個Promises
const runPromisesInSeries = ps => ps.reduce((p, next) => p.then(next), Promise.resolve());
const delay = d => new Promise(r => setTimeout(r, d));
runPromisesInSeries([() => delay(1000), () => delay(2000)]);
//依次執行每個Promises ,總共需要3秒鐘才能完成
4. timeTaken
:計算函式執行時間
const timeTaken = callback => {
console.time('timeTaken');
const r = callback();
console.timeEnd('timeTaken');
return r;
};
timeTaken(() => Math.pow(2, 10)); // 1024, (logged): timeTaken: 0.02099609375ms
5. createEventHub
:簡單的釋出/訂閱模式
建立一個釋出/訂閱(釋出-訂閱)事件集線,有emit
,on
和off
方法。
- 使用
Object.create(null)
建立一個空的hub
物件。 -
emit
,根據event
引數解析處理程式陣列,然後.forEach()
透過傳入資料作為引數來執行每個處理程式。 -
on
,為事件建立一個陣列(若不存在則為空陣列),然後.push()
將處理程式新增到該陣列。 -
off
,用.findIndex()
在事件陣列中查詢處理程式的索引,並使用.splice()
刪除。
const createEventHub = () => ({
hub: Object.create(null),
emit(event, data) {
(this.hub[event] || []).forEach(handler => handler(data));
},
on(event, handler) {
if (!this.hub[event]) this.hub[event] = [];
this.hub[event].push(handler);
},
off(event, handler) {
const i = (this.hub[event] || []).findIndex(h => h === handler);
if (i > -1) this.hub[event].splice(i, 1);
if (this.hub[event].length === 0) delete this.hub[event];
}
});
用法:
const handler = data => console.log(data);
const hub = createEventHub();
let increment = 0;
// 訂閱,監聽不同事件
hub.on('message', handler);
hub.on('message', () => console.log('Message event fired'));
hub.on('increment', () => increment++);
// 釋出:發出事件以呼叫所有訂閱給它們的處理程式,並將資料作為引數傳遞給它們
hub.emit('message', 'hello world'); // 列印 'hello world' 和 'Message event fired'
hub.emit('message', { hello: 'world' }); // 列印 物件 和 'Message event fired'
hub.emit('increment'); // increment = 1
// 停止訂閱
hub.off('message', handler);
6.memoize
:快取函式
透過例項化一個Map
物件來建立一個空的快取。
透過檢查輸入值的函式輸出是否已快取,返回儲存一個引數的函式,該引數將被提供給已記憶的函式;如果沒有,則儲存並返回它。
const memoize = fn => {
const cache = new Map();
const cached = function(val) {
return cache.has(val) ? cache.get(val) : cache.set(val, fn.call(this, val)) && cache.get(val);
};
cached.cache = cache;
return cached;
};
Ps: 這個版本可能不是很清晰,還有Vue原始碼版的:
/**
* Create a cached version of a pure function.
*/
export function cached<F: Function> (fn: F): F {
const cache = Object.create(null)
return (function cachedFn (str: string) {
const hit = cache[str]
return hit || (cache[str] = fn(str))
}: any)
}
7. once
:只呼叫一次的函式
const once = fn => {
let called = false
return function () {
if (!called) {
called = true
fn.apply(this, arguments)
}
}
};
8.flattenObject
:以鍵的路徑扁平化物件
使用遞迴。
- 利用
Object.keys(obj)
聯合Array.prototype.reduce()
,以每片葉子節點轉換為扁平的路徑節點。 - 如果鍵的值是一個物件,則函式使用呼叫適當的自身
prefix
以建立路徑Object.assign()
。 - 否則,它將適當的字首鍵值對新增到累加器物件。
-
prefix
除非您希望每個鍵都有一個字首,否則應始終省略第二個引數。
const flattenObject = (obj, prefix = '') =>
Object.keys(obj).reduce((acc, k) => {
const pre = prefix.length ? prefix + '.' : '';
if (typeof obj[k] === 'object') Object.assign(acc, flattenObject(obj[k], pre + k));
else acc[pre + k] = obj[k];
return acc;
}, {});
flattenObject({ a: { b: { c: 1 } }, d: 1 }); // { 'a.b.c': 1, d: 1 }
9. unflattenObject
:以鍵的路徑展開物件
與上面的相反,展開物件。
const unflattenObject = obj =>
Object.keys(obj).reduce((acc, k) => {
if (k.indexOf('.') !== -1) {
const keys = k.split('.');
Object.assign(
acc,
JSON.parse(
'{' +
keys.map((v, i) => (i !== keys.length - 1 ? `"${v}":{` : `"${v}":`)).join('') +
obj[k] +
'}'.repeat(keys.length)
)
);
} else acc[k] = obj[k];
return acc;
}, {});
unflattenObject({ 'a.b.c': 1, d: 1 }); // { a: { b: { c: 1 } }, d: 1 }
這個的用途,在做Tree
元件或複雜表單時取值非常舒服。
3. 第三部分:字串
1.byteSize
:返回字串的位元組長度
const byteSize = str => new Blob([str]).size;
byteSize('?'); // 4
byteSize('Hello World'); // 11
2. capitalize
:首字母大寫
const capitalize = ([first, ...rest]) =>
first.toUpperCase() + rest.join('');
capitalize('fooBar'); // 'FooBar'
capitalize('fooBar', true); // 'Foobar'
3. capitalizeEveryWord
:每個單詞首字母大寫
const capitalizeEveryWord = str => str.replace(/b[a-z]/g, char => char.toUpperCase());
capitalizeEveryWord('hello world!'); // 'Hello World!'
4. decapitalize
:首字母小寫
const decapitalize = ([first, ...rest]) =>
first.toLowerCase() + rest.join('')
decapitalize('FooBar'); // 'fooBar'
decapitalize('FooBar'); // 'fooBar'
5. luhnCheck
:銀行卡號碼校驗(luhn
演算法)
Luhn
演算法的實現,用於驗證各種標識號,例如信用卡號,IMEI號,國家提供商標識號等。
與String.prototype.split('')
結合使用,以獲取數字陣列。獲得最後一個數字。實施luhn
演算法。如果被整除,則返回,否則返回。
const luhnCheck = num => {
let arr = (num + '')
.split('')
.reverse()
.map(x => parseInt(x));
let lastDigit = arr.splice(0, 1)[0];
let sum = arr.reduce((acc, val, i) => (i % 2 !== 0 ? acc + val : acc + ((val * 2) % 9) || 9), 0);
sum += lastDigit;
return sum % 10 === 0;
};
用例:
luhnCheck('4485275742308327'); // true
luhnCheck(6011329933655299); // false
luhnCheck(123456789); // false
補充:銀行卡號碼的校驗規則:
關於luhn
演算法,可以參考以下文章:
銀行卡號碼的校驗採用Luhn
演算法,校驗過程大致如下:
-
從右到左給卡號字串編號,最右邊第一位是1,最右邊第二位是2,最右邊第三位是3….
-
從右向左遍歷,對每一位字元t執行第三個步驟,並將每一位的計算結果相加得到一個數s。
-
對每一位的計算規則:如果這一位是奇數位,則返回t本身,如果是偶數位,則先將t乘以2得到一個數n,如果n是一位數(小於10),直接返回n,否則將n的個位數和十位數相加返回。
-
如果s能夠整除10,則此號碼有效,否則號碼無效。
因為最終的結果會對10取餘來判斷是否能夠整除10,所以又叫做模10演算法。
當然,還是庫比較香: bankcardinfo
6. splitLines
:將多行字串拆分為行陣列。
使用String.prototype.split()
和正規表示式匹配換行符並建立一個陣列。
const splitLines = str => str.split(/r?n/);
splitLines('Thisnis anmultilinenstring.n'); // ['This', 'is a', 'multiline', 'string.' , '']
7. stripHTMLTags
:刪除字串中的HTMl
標籤
從字串中刪除HTML / XML
標籤。
使用正規表示式從字串中刪除HTML / XML
標記。
const stripHTMLTags = str => str.replace(/<[^>]*>/g, '');
stripHTMLTags('<p><em>lorem</em> <strong>ipsum</strong></p>'); // 'lorem ipsum'
4. 第四部分:物件
1. dayOfYear
:當前日期天數
const dayOfYear = date =>
Math.floor((date - new Date(date.getFullYear(), 0, 0)) / 1000 / 60 / 60 / 24);
dayOfYear(new Date()); // 285
2. forOwn
:迭代屬性並執行回撥
const forOwn = (obj, fn) => Object.keys(obj).forEach(key => fn(obj[key], key, obj));
forOwn({ foo: 'bar', a: 1 }, v => console.log(v)); // 'bar', 1
3. Get Time From Date
:返回當前24小時制時間的字串
const getColonTimeFromDate = date => date.toTimeString().slice(0, 8);
getColonTimeFromDate(new Date()); // "08:38:00"
4. Get Days Between Dates
:返回日期間的天數
const getDaysDiffBetweenDates = (dateInitial, dateFinal) =>
(dateFinal - dateInitial) / (1000 * 3600 * 24);
getDaysDiffBetweenDates(new Date('2019-01-01'), new Date('2019-10-14')); // 286
5. is
:檢查值是否為特定型別。
const is = (type, val) => ![, null].includes(val) && val.constructor === type;
is(Array, [1]); // true
is(ArrayBuffer, new ArrayBuffer()); // true
is(Map, new Map()); // true
is(RegExp, /./g); // true
is(Set, new Set()); // true
is(WeakMap, new WeakMap()); // true
is(WeakSet, new WeakSet()); // true
is(String, ''); // true
is(String, new String('')); // true
is(Number, 1); // true
is(Number, new Number(1)); // true
is(Boolean, true); // true
is(Boolean, new Boolean(true)); // true
6. isAfterDate
:檢查是否在某日期後
const isAfterDate = (dateA, dateB) => dateA > dateB;
isAfterDate(new Date(2010, 10, 21), new Date(2010, 10, 20)); // true
7. isBeforeDate
:檢查是否在某日期前
const isBeforeDate = (dateA, dateB) => dateA < dateB;
isBeforeDate(new Date(2010, 10, 20), new Date(2010, 10, 21)); // true
8 tomorrow
:獲取明天的字串格式時間
const tomorrow = () => {
let t = new Date();
t.setDate(t.getDate() + 1);
return t.toISOString().split('T')[0];
};
tomorrow(); // 2019-10-15 (如果明天是2019-10-15)
9. equals
:全等判斷
在兩個變數之間進行深度比較以確定它們是否全等。
此程式碼段精簡的核心在於Array.prototype.every()
的使用。
const equals = (a, b) => {
if (a === b) return true;
if (a instanceof Date && b instanceof Date) return a.getTime() === b.getTime();
if (!a || !b || (typeof a !== 'object' && typeof b !== 'object')) return a === b;
if (a.prototype !== b.prototype) return false;
let keys = Object.keys(a);
if (keys.length !== Object.keys(b).length) return false;
return keys.every(k => equals(a[k], b[k]));
};
用法:
equals({ a: [2, { e: 3 }], b: [4], c: 'foo' }, { a: [2, { e: 3 }], b: [4], c: 'foo' }); // true
5. 第五部分:數字
1. randomIntegerInRange
:生成指定範圍的隨機整數
const randomIntegerInRange = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;
randomIntegerInRange(0, 5); // 3
2. randomNumberInRange
:生成指定範圍的隨機小數
const randomNumberInRange = (min, max) => Math.random() * (max - min) + min;
randomNumberInRange(2, 10); // 6.0211363285087005
3. round
:四捨五入到指定位數
const round = (n, decimals = 0) => Number(`${Math.round(`${n}e${decimals}`)}e-${decimals}`);
round(1.005, 2); // 1.01
4. sum
:計算陣列或多個數字的總和
const sum = (...arr) => [...arr].reduce((acc, val) => acc + val, 0);
sum(1, 2, 3, 4); // 10
sum(...[1, 2, 3, 4]); // 10
5. toCurrency
:簡單的貨幣單位轉換
const toCurrency = (n, curr, LanguageFormat = undefined) =>
Intl.NumberFormat(LanguageFormat, { style: 'currency', currency: curr }).format(n);
toCurrency(123456.789, 'EUR'); // €123,456.79
toCurrency(123456.789, 'USD', 'en-us'); // $123,456.79
toCurrency(123456.789, 'USD', 'fa'); // ۱۲۳٬۴۵۶٫۷۹
toCurrency(322342436423.2435, 'JPY'); // ¥322,342,436,423
6. 第六部分:瀏覽器操作及其它
1. bottomVisible
:檢查頁面底部是否可見
const bottomVisible = () =>
document.documentElement.clientHeight + window.scrollY >=
(document.documentElement.scrollHeight || document.documentElement.clientHeight);
bottomVisible(); // true
2. Create Directory
:檢查建立目錄
此程式碼段呼叫fs
模組的existsSync()
檢查目錄是否存在,如果不存在,則mkdirSync()
建立該目錄。
const fs = require('fs');
const createDirIfNotExists = dir => (!fs.existsSync(dir) ? fs.mkdirSync(dir) : undefined);
createDirIfNotExists('test');
3. currentURL
:返回當前連結url
const currentURL = () => window.location.href;
currentURL(); // ''
4. distance
:返回兩點間的距離
該程式碼段透過計算歐幾里得距離來返回兩點之間的距離。
const distance = (x0, y0, x1, y1) => Math.hypot(x1 - x0, y1 - y0);
distance(1, 1, 2, 3); // 2.23606797749979
5. elementContains
:檢查是否包含子元素
此程式碼段檢查父元素是否包含子元素。
const elementContains = (parent, child) => parent !== child && parent.contains(child);
elementContains(document.querySelector('head'), document.querySelector('title')); // true
elementContains(document.querySelector('body'), document.querySelector('body')); // false
6. getStyle
:返回指定元素的生效樣式
const getStyle = (el, ruleName) => getComputedStyle(el)[ruleName];
getStyle(document.querySelector('p'), 'font-size'); // '16px'
7. getType
:返回值或變數的型別名
const getType = v =>
v === undefined ? 'undefined' : v === null ? 'null' : v.constructor.name.toLowerCase();
getType(new Set([1, 2, 3])); // 'set'
getType([1, 2, 3]); // 'array'
8. hasClass
:校驗指定元素的類名
const hasClass = (el, className) => el.classList.contains(className);
hasClass(document.querySelector('p.special'), 'special'); // true
9. hide
:隱藏所有的指定標籤
const hide = (...el) => [...el].forEach(e => (e.style.display = 'none'));
hide(document.querySelectorAll('img')); // 隱藏所有<img>標籤
10. httpsRedirect
:HTTP
跳轉 HTTPS
const httpsRedirect = () => {
if (location.protocol !== 'https:') location.replace('https://' + location.href.split('//')[1]);
};
httpsRedirect(); // 若在``, 則跳轉到``
11.insertAfter
:在指定元素之後插入新元素
const insertAfter = (el, htmlString) => el.insertAdjacentHTML('afterend', htmlString);
// <div id="myId">...</div> <p>after</p>
insertAfter(document.getElementById('myId'), '<p>after</p>');
12.insertBefore
:在指定元素之前插入新元素
const insertBefore = (el, htmlString) => el.insertAdjacentHTML('beforebegin', htmlString);
insertBefore(document.getElementById('myId'), '<p>before</p>'); // <p>before</p> <div id="myId">...</div>
13. isBrowser
:檢查是否為瀏覽器環境
此程式碼段可用於確定當前執行時環境是否為瀏覽器。這有助於避免在伺服器(節點)上執行前端模組時出錯。
const isBrowser = () => ![typeof window, typeof document].includes('undefined');
isBrowser(); // true (browser)
isBrowser(); // false (Node)
14. isBrowserTab
:檢查當前標籤頁是否活動
const isBrowserTabFocused = () => !document.hidden;
isBrowserTabFocused(); // true
15. nodeListToArray
:轉換nodeList
為陣列
const nodeListToArray = nodeList => [...nodeList];
nodeListToArray(document.childNodes); // [ <!DOCTYPE html>, html ]
16. Random Hexadecimal Color Code
:隨機十六進位制顏色
const randomHexColorCode = () => {
let n = (Math.random() * 0xfffff * 1000000).toString(16);
return '#' + n.slice(0, 6);
};
randomHexColorCode(); // "#e34155"
17. scrollToTop
:平滑滾動至頂部
該程式碼段可用於平滑滾動到當前頁面的頂部。
const scrollToTop = () => {
const c = document.documentElement.scrollTop || document.body.scrollTop;
if (c > 0) {
window.requestAnimationFrame(scrollToTop);
window.scrollTo(0, c - c / 8);
}
};
scrollToTop();
18. smoothScroll
:滾動到指定元素區域
該程式碼段可將指定元素平滑滾動到瀏覽器視窗的可見區域。
const smoothScroll = element =>
document.querySelector(element).scrollIntoView({
behavior: 'smooth'
});
smoothScroll('#fooBar');
smoothScroll('.fooBar');
19. detectDeviceType
:檢測移動/PC裝置
const detectDeviceType = () =>
/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)
? 'Mobile'
: 'Desktop';
20. getScrollPosition
:返回當前的滾動位置
預設引數為window
,pageXOffset(pageYOffset)
為第一選擇,沒有則用scrollLeft(scrollTop)
const getScrollPosition = (el = window) => ({
x: el.pageXOffset !== undefined ? el.pageXOffset : el.scrollLeft,
y: el.pageYOffset !== undefined ? el.pageYOffset : el.scrollTop
});
getScrollPosition(); // {x: 0, y: 200}
21. size
:獲取不同型別變數的長度
這個的實現非常巧妙,利用Blob
類檔案物件的特性,獲取物件的長度。
另外,多重三元運算子,是真香。
const size = val =>
Array.isArray(val)
? val.length
: val && typeof val === 'object'
? val.size || val.length || Object.keys(val).length
: typeof val === 'string'
? new Blob([val]).size
: 0;
size([1, 2, 3, 4, 5]); // 5
size('size'); // 4
size({ one: 1, two: 2, three: 3 }); // 3
22. escapeHTML
:轉義HTML
當然是用來防XSS
攻擊啦。
const escapeHTML = str =>
str.replace(
/[&<>'"]/g,
tag =>
({
'&': '&',
'<': '<',
'>': '>',
"'": ''',
'"': '"'
}[tag] || tag)
);
escapeHTML('<a href="#">Me & you</a>'); // '<a href="#">Me & you</a>'
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4692/viewspace-2824063/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- javascript常用函式大全JavaScript函式
- Hive函式大全Hive函式
- mysql函式大全MySql函式
- PHP函式大全PHP函式
- JavaScript工具函式助力高效開發JavaScript函式
- PHP常用函式大全PHP函式
- 第104章 Caché 函式大全 $ZF 函式函式
- 第111章 Caché 函式大全 $ZNAME 函式函式
- MySQL函式大全(字串函式,數學函式,日期函式,系統級函式,聚合函式)MySql函式字串
- Python 內建函式大全Python函式
- Js字串操作函式大全JS字串函式
- oracle 10g函式大全–日期型函式Oracle 10g函式
- 第四十章 Caché 函式大全 $METHOD 函式函式
- javaScript函式JavaScript函式
- 遞迴函式例項大全遞迴函式
- 第六十三章 Caché 函式大全 $SORTEND 函式函式
- JavaScript 匿名函式JavaScript函式
- JavaScript function 函式JavaScriptFunction函式
- JavaScript睡眠函式JavaScript函式
- JavaScript Generator 函式JavaScript函式
- javascript函式(5)JavaScript函式
- javascript-函式表示式JavaScript函式
- Javascript函式引數求值——Thunk函式JavaScript函式
- Python3中的函式 大全Python函式
- PHP經常用到的函式大全PHP函式
- Excel函式公式大全,辦公文員必備Excel函式公式Excel函式公式
- JavaScript函式宣告和函式表示式區別JavaScript函式
- JavaScript中的compose函式和pipe函式JavaScript函式
- javascript函式全解JavaScript函式
- JavaScript裡的函式JavaScript函式
- JavaScript 回撥函式JavaScript函式
- JavaScript 建構函式JavaScript函式
- JavaScript | 函式與方法JavaScript函式
- JavaScript 箭頭函式JavaScript函式
- JavaScript回撥函式JavaScript函式
- JavaScript 函式語法JavaScript函式
- javascript函式有哪些JavaScript函式
- Javascript 高階函式JavaScript函式