
151.数组中某元素出现的次数
1/** * @param { array } arr * @param {*} value */ 2 export function countOccurrences(arr, value) { 3 4 return arr.reduce((a, v) => v === value ? a + 1 : a + 0, 0); 5 }
152.加法函数(精度丢失问题)
1/** * @param { number } arg1 * @param { number } arg2 */ 2 export function add(arg1, arg2) { 3 4 let r1, r2, m; 5 try { 6 r1 = arg1.toString().split(".")[1].length } catch (e) { 7 r1 = 0 } 8 try { 9 r2 = arg2.toString().split(".")[1].length } catch (e) { 10 r2 = 0 } 11 m = Math.pow(10, Math.max(r1, r2)); 12 return (arg1 * m + arg2 * m) / m 13 }
153.减法函数(精度丢失问题)
1/** * @param { number } arg1 * @param { number } arg2 */ 2 export function sub(arg1, arg2) { 3 4 let r1, r2, m, n; 5 try { 6 r1 = arg1.toString().split(".")[1].length } catch (e) { 7 r1 = 0 } 8 try { 9 r2 = arg2.toString().split(".")[1].length } catch (e) { 10 r2 = 0 } 11 m = Math.pow(10, Math.max(r1, r2)); 12 n = (r1 >= r2) ? r1 : r2; 13 return Number(((arg1 * m - arg2 * m) / m).toFixed(n)); 14 }
154.除法函数(精度丢失问题)
1/** * @param { number } num1 * @param { number } num2 */ 2 export function division(num1,num2){ 3 4 let t1,t2,r1,r2; 5 try{ 6 7 t1 = num1.toString().split('.')[1].length; 8 }catch(e){ 9 10 t1 = 0; 11 } 12 try{ 13 14 t2=num2.toString().split(".")[1].length; 15 }catch(e){ 16 17 t2=0; 18 } 19 r1=Number(num1.toString().replace(".","")); 20 r2=Number(num2.toString().replace(".","")); 21 return (r1/r2)*Math.pow(10,t2-t1); 22 }
155.乘法函数(精度丢失问题)
1/** * @param { number } num1 * @param { number } num2 */ 2 export function mcl(num1,num2){ 3 4 let m=0,s1=num1.toString(),s2=num2.toString(); 5 try{ 6 m+=s1.split(".")[1].length}catch(e){ 7 } 8 try{ 9 m+=s2.split(".")[1].length}catch(e){ 10 } 11 return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m); 12 }
156.递归优化(尾递归)
1/** * @param { function } f */ 2 export function tco(f) { 3 4 let value; 5 let active = false; 6 let accumulated = []; 7 8 return function accumulator() { 9 10 accumulated.push(arguments); 11 if (!active) { 12 13 active = true; 14 while (accumulated.length) { 15 16 value = f.apply(this, accumulated.shift()); 17 } 18 active = false; 19 return value; 20 } 21 }; 22 }
157.生成随机整数
1export function randomNumInteger(min, max) { 2 3 switch (arguments.length) { 4 5 case 1: 6 return parseInt(Math.random() * min + 1, 10); 7 case 2: 8 return parseInt(Math.random() * (max - min + 1) + min, 10); 9 default: 10 return 0 11 } 12}
158.去除空格
1/** * @param { string } str 待处理字符串 * @param { number } type 去除空格类型 1-所有空格 2-前后空格 3-前空格 4-后空格 默认为1 */ 2 export function trim(str, type = 1) { 3 4 if (type && type !== 1 && type !== 2 && type !== 3 && type !== 4) return; 5 switch (type) { 6 7 case 1: 8 return str.replace(/\s/g, ""); 9 case 2: 10 return str.replace(/(^\s)|(\s*$)/g, ""); 11 case 3: 12 return str.replace(/(^\s)/g, ""); 13 case 4: 14 return str.replace(/(\s$)/g, ""); 15 default: 16 return str; 17 } 18 }
159.大小写转换
1/** * @param { string } str 待转换的字符串 * @param { number } type 1-全大写 2-全小写 3-首字母大写 其他-不转换 */ 2 3export function turnCase(str, type) { 4 5 switch (type) { 6 7 case 1: 8 return str.toUpperCase(); 9 case 2: 10 return str.toLowerCase(); 11 case 3: 12 return str[0].toUpperCase() + str.substr(1).toLowerCase(); 13 default: 14 return str; 15 } 16}
160.随机16进制颜色 hexColor
1/** * 方法一 */ 2 export function hexColor() { 3 4 5 let str = '#'; 6 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'B', 'C', 'D', 'E', 'F']; 7 for (let i = 0; i < 6; i++) { 8 9 let index = Number.parseInt((Math.random() * 16).toString()); 10 str += arr[index] 11 } 12 return str; 13 }
161.随机16进制颜色 randomHexColorCode
1/** * 方法二 */ 2 export const randomHexColorCode = () => { 3 4 let n = (Math.random() * 0xfffff * 1000000).toString(16); 5 return '#' + n.slice(0, 6); 6 };
162.转义html(防XSS攻击)
1export const escapeHTML = str =>{ 2 3 str.replace( 4 /[&<>'"]/g, 5 tag => 6 ({ 7 8 '&': '&', 9 '<': '<', 10 '>': '>', 11 "'": ''', 12 '"': '"' 13 }[tag] || tag) 14 ); 15};
163.检测移动/PC设备
1export const detectDeviceType = () => { 2 return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ? 'Mobile' : 'Desktop'; };
164.隐藏所有指定标签
1/** * 例: hide(document.querySelectorAll('img')) */ 2 export const hideTag = (...el) => [...el].forEach(e => (e.style.display = 'none'));
165.返回指定元素的生效样式
1/** * @param { element} el 元素节点 * @param { string } ruleName 指定元素的名称 */ 2 export const getStyle = (el, ruleName) => getComputedStyle(el)[ruleName];
166.检查是否包含子元素
1/** * @param { element } parent * @param { element } child * 例:elementContains(document.querySelector('head'), document.querySelector('title')); // true */ 2 export const elementContains = (parent, child) => parent !== child && parent.contains(child);
167.数字超过规定大小加上加号“+”,如数字超过99显示99+
1/** * @param { number } val 输入的数字 * @param { number } maxNum 数字规定界限 */ 2 export const outOfNum = (val, maxNum) =>{ 3 4 val = val ? val-0 :0; 5 if (val > maxNum ) { 6 7 return `${ maxNum}+` 8 }else{ 9 10 return val; 11 } 12 };
168.如何隐藏所有指定的元素
1const hide = (el) => Array.from(el).forEach(e => (e.style.display = 'none')); 2 3 // 事例:隐藏页面上所有`<img>`元素? 4 hide(document.querySelectorAll('img'))
169.如何检查元素是否具有指定的类?
页面DOM里的每个节点上都有一个classList对象,程序员可以使用里面的方法新增、删除、修改节点上的CSS类。使用classList,程序员还可以用它来判断某个节点是否被赋予了某个CSS类。
1const hasClass = (el, className) => el.classList.contains(className) 2 3 // 事例 4 hasClass(document.querySelector('p.special'), 'special') // true
170.如何切换一个元素的类?
1const toggleClass = (el, className) => el.classList.toggle(className) 2 3 // 事例 移除 p 具有类`special`的 special 类 4 toggleClass(document.querySelector('p.special'), 'special')
171.如何获取当前页面的滚动位置?
1const getScrollPosition = (el = window) => ({ 2 3 x: el.pageXOffset !== undefined ? el.pageXOffset : el.scrollLeft, 4 y: el.pageYOffset !== undefined ? el.pageYOffset : el.scrollTop 5 }); 6 7 // 事例 8 getScrollPosition(); // {x: 0, y: 200}
172.如何平滑滚动到页面顶部
1const scrollToTop = () => { 2 3 const c = document.documentElement.scrollTop || document.body.scrollTop; 4 if (c > 0) { 5 6 window.requestAnimationFrame(scrollToTop); 7 window.scrollTo(0, c - c / 8); 8 } 9 } 10 11 // 事例 12 scrollToTop() 13 14window.requestAnimationFrame() 告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行。 15 requestAnimationFrame:优势:由系统决定回调函数的执行时机。60Hz的刷新频率,那么每次刷新的间隔中会执行一次回调函数,不会引起丢帧,不会卡顿。 16 17window.requestAnimationFrame() 告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行。 18 requestAnimationFrame:优势:由系统决定回调函数的执行时机。60Hz的刷新频率,那么每次刷新的间隔中会执行一次回调函数,不会引起丢帧,不会卡顿。
173.如何检查父元素是否包含子元素?
1const elementContains = (parent, child) => parent !== child && parent.contains(child); 2 3 // 事例 4 elementContains(document.querySelector('head'), document.querySelector('title')); 5 // true 6 elementContains(document.querySelector('body'), document.querySelector('body')); 7 // false
174.如何检查指定的元素在视口中是否可见?
1const elementIsVisibleInViewport = (el, partiallyVisible = false) => { 2 3 const { 4 top, left, bottom, right } = el.getBoundingClientRect(); 5 const { 6 innerHeight, innerWidth } = window; 7 return partiallyVisible 8 ? ((top > 0 && top < innerHeight) || (bottom > 0 && bottom < innerHeight)) && 9 ((left > 0 && left < innerWidth) || (right > 0 && right < innerWidth)) 10 : top >= 0 && left >= 0 && bottom <= innerHeight && right <= innerWidth; 11 }; 12 13 // 事例 14 elementIsVisibleInViewport(el); // 需要左右可见 15 elementIsVisibleInViewport(el, true); // 需要全屏(上下左右)可以见
175.如何获取元素中的所有图像?
1const getImages = (el, includeDuplicates = false) => { 2 3 const images = [...el.getElementsByTagName('img')].map(img => img.getAttribute('src')); 4 return includeDuplicates ? images : [...new Set(images)]; 5 }; 6 7 // 事例:includeDuplicates 为 true 表示需要排除重复元素 8 getImages(document, true); // ['image1.jpg', 'image2.png', 'image1.png', '...'] 9 getImages(document, false); // ['image1.jpg', 'image2.png', '...']
176.如何确定设备是移动设备还是台式机/笔记本电脑?
1const detectDeviceType = () => 2 /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) 3 ? 'Mobile' 4 : 'Desktop'; 5 6 // 事例 7 detectDeviceType(); // "Mobile" or "Desktop"
177.How to get the current URL?
1const currentURL = () => window.location.href 2 3 // 事例 4 currentURL() // 'https://google.com'
178.如何创建一个包含当前URL参数的对象?
1const getURLParameters = url => 2 (url.match(/([^?=&]+)(=([^&]*))/g) || []).reduce( 3 (a, v) => ((a[v.slice(0, v.indexOf('='))] = v.slice(v.indexOf('=') + 1)), a), 4 { 5 } 6 ); 7 8 // 事例 9 getURLParameters('http://url.com/page?n=Adam&s=Smith'); // {n: 'Adam', s: 'Smith'} 10 getURLParameters('google.com'); // {}
179.如何将一组表单元素转化为对象?
1const formToObject = form => 2 Array.from(new FormData(form)).reduce( 3 (acc, [key, value]) => ({ 4 5 ...acc, 6 7[key]: value 8 9 }), 10 { 11 } 12 ); 13 14 // 事例 15 formToObject(document.querySelector('#form')); 16 // { email: 'test@email.com', name: 'Test Name' }
180.如何从对象检索给定选择器指示的一组属性?
1const get = (from, ...selectors) => 2 [...selectors].map(s => 3 s 4 .replace(/\[([^\[\]]*)\]/g, '.$1.') 5 .split('.') 6 .filter(t => t !== '') 7 .reduce((prev, cur) => prev && prev[cur], from) 8 ); 9 const obj = { 10 selector: { 11 to: { 12 val: 'val to select' } }, target: [1, 2, { 13 a: 'test' }] }; 14 15 // Example 16 get(obj, 'selector.to.val', 'target[0]', 'target[2].a'); 17 // ['val to select', 1, 'test']