『前端积累』值得收藏的JavaScript函数

字符串(String)

1.检查字符串是否为有效的 JSON

const isValidJSON = str => {
  try {
    JSON.parse(str);
    return true;
  } catch(e) {
    return false;
  }
}

console.log(isValidJSON('{"name": "zhangsan","age": 40}')); // true
console.log(isValidJSON('{"name": "zhangsan",age: 40}')); // false
console.log(isValidJSON(null)); // true

2.判断当前运行环境是否为浏览器

const isBrowser = () => ![typeof window,typeof document].includes('undefined');

console.log(isBrowser()) // true (browser)
console.log(isBrowser()) // false (Node)

3.判断当前运行环境是否为Node.js

const isNode = () =>
  typeof process !== 'undefined' &&
  !!process.versions &&
  !!process.versions.node;

isNode(); // true (Node)
isNode(); // false (browser)

4.将波浪号路径转换为绝对路径

const reversePath = str => {
    let homedir = `${require('os').homedir()}`.replace(/\\/g,'/');
    return str.replace(/^~($|\/|\\)/,`${homedir}$1`);
}
 
console.log(reversePath('~/website')) // C:/Users/admin/website

5.以字节为单位返回字符串的长度

const byteSize = str => new Blob([str]).size;

console.log(byteSize('Hello World')); // 11

6.转义字符串以在 HTML 中使用

const escapeHTML = str =>
  str.replace(
    /[&<>'"]/g,
    tag =>
      ({
        '&': '&amp;',
        '<': '&lt;',
        '>': '&gt;',
        "'": '&#39;',
        '"': '&quot;'
      }[tag] || tag)
  );

console.log(escapeHTML('<a href="#">website</a>')); // &lt;a href=&quot;#&quot;&gt;website&lt;/a&gt;

7. Unescapes 转义 HTML 字符

const unescapeHTML = str =>
  str.replace(
    /&amp;|&lt;|&gt;|&#39;|&quot;/g,
    tag =>
      ({
        '&amp;': '&',
        '&lt;': '<',
        '&gt;': '>',
        '&#39;': "'",
        '&quot;': '"'
      }[tag] || tag)
  );

console.log(unescapeHTML(' &lt;a href=&quot;#&quot;&gt;website&lt;/a&gt;')); // <a href="#">website</a>

8.获取不带任何参数或片段标识符的当前 URL

const getBaseUrl = url => url.replace(/[?#].*$/,'');

console.log(getBaseUrl('https://www.baidu.com/home?name=zhangsan&&age=20')); // https://www.baidu.com/home
console.log(getBaseUrl('https://www.baidu.com/home#page')); // https://www.baidu.com/home

数组(Array)

1.获取数组中最大的n个数字

const maxFromArray = (array,number = 1) => [...array].sort((x,y) => y - x).slice(0,number);

console.log(maxFromArray([3,2,1,4,6,8])); // [8]
console.log(maxFromArray([7,3,2,1,4,6,8],2)); // [8,7]

2.随机获取数组中元素

onst randomEle = (arr) => arr[Math.floor(Math.random() * arr.length)];

console.log(randomEle([1,5,7,10,100]))

对象(Object)

1.获取URL地址栏中的参数

const getUrlParams = url => 
  (url.match(/([^?=&]+)(=([^&]*))/g) || []).reduce(
    (pre, cur) => (
      (pre[cur.split('=')[0]] = cur.split('=')[1]), pre
    ),
    {}
  );

console.log(getUrlParams('https://www.baidu.com/home?name=zhangsan&age=20')); 
// {name: "zhangsan", age: "20"}

2.rgb(x,x,x)颜色表达方式格式转换成对象格式

const toRGBObject = rgbstr => {
  const [red,green,blue] = rgbstr.match(/\d+/g).map(Number);
  return { red,green,blue }
}
console.log(toRGBObject('rgb(100,255,245')); // {red: 100, green: 255, blue: 245}

数字(Number)

1.逆转数字

const reverseNumber = n => parseFloat(`${n}`.split('').reverse().join('')) * Math.sign(n);

console.log(reverseNumber(1234)); // 4321
console.log(reverseNumber(1.23)); // 32.1
console.log(reverseNumber(-23.4)); // -4.32
console.log(reverseNumber(-500)); // -5

说明:Math.sign(x)此函数共有5种返回值, 分别是 1, -1, 0, -0, NaN. 代表的各是正数, 负数, 正零, 负零, NaN。传入该函数的参数会被隐式转换成数字类型。

Math.sign(3);     //  1
Math.sign(-3);    // -1
Math.sign("-3");  // -1
Math.sign(0);     //  0
Math.sign(-0);    // -0
Math.sign(NaN);   // NaN
Math.sign("foo"); // NaN
Math.sign();      // NaN

Math.sign()的Polyfill:

if (!Math.sign) {
  Math.sign = function(x) {
    // If x is NaN, the result is NaN.
    // If x is -0, the result is -0.
    // If x is +0, the result is +0.
    // If x is negative and not -0, the result is -1.
    // If x is positive and not +0, the result is +1.
    x = +x; // convert to a number
    if (x === 0 || isNaN(x)) {
      return Number(x);
    }
    return x > 0 ? 1 : -1;
  };
}

2.计算阶乘

const factorial = (number) => 
    number < 0 
    ? (() => {throw new TypeError('类型错误')})() 
    : number <= 1 
    ? 1
    : number * factorial(number - 1);

console.log(factorial(0)); // 1
console.log(factorial(1)); // 1
console.log(factorial(4)); // 24
console.log(factorial(-1)); // 类型错误

说明:0的阶乘为1是规定,n的阶乘是1x2x3x4x......xn。

3.生成指定范围内的随机整数

const randomIntegerRange = (min,max) => {
 return  Math.floor(Math.random() * (max - min + 1)) + min;
}

console.log(randomIntegerRange(10,20)) // 12
posted @ 2018-10-29 20:24  风雨后见彩虹  阅读(4443)  评论(0编辑  收藏  举报