前端常用的函数封装js篇(二)

这是我参与8月更文挑战的第11天,活动详情查看:8月更文挑战

深拷贝

在JS中,数据类型分为基本数据类型和引用数据类型两种,对于基本数据类型来说,它的值直接存储在栈内存中,而对于引用类型来说,它在栈内存中仅仅存储了一个引用,而真正的数据存储在堆内存中

对于引用类型来说,我们将 obj1 赋予 obj2 的时候,我们其实仅仅只是将 obj1 存储在栈堆中的的引用赋予了 obj2 ,而两个对象此时指向的是在堆内存中的同一个数据,所以当我们修改任意一个值的时候,修改的都是堆内存中的数据,而不是引用,所以只要修改了,同样引用的对象的值也自然而然的发生了改变

防止出现两个对象相同的引用,出现修改一个对象影响到另一个对象的问题,我们使用深拷贝来解决这个问题

function deepCopy(arr) {
  var obj = arr instanceof Array ? [] : {};
  for (var item in arr) {
    if (arr[item] != "null" && arr[item] != null) {
      if (typeof arr[item] === "object") {
        obj[item] = qfyDeepCopy(arr[item]);
      } else {
        obj[item] = arr[item];
      }
    }
  }
  return obj;
}
复制代码

数组排序

这里封装的是快排时间复杂度O(nlogn)比平常的冒泡排序O(n2)会好一些。

function quicklySort(brr) {
  if (!Array.isArray(brr)) {
    console.log('type error!');
    return;
  }
  if (brr.length <= 1) { //当数组brr的长度 <= 1 的时候,以为这brr这个数组只有一个数或者是个空数组,那么久直接返回,不需要往下进行
    return brr
  }
  var centerIndex = Math.floor(brr.length / 2); //获取中间数的下标
  var centerNum = brr.splice(centerIndex, 1)[0]; //通过中间数的下标来找中的数
  var left = [],
    right = []; //建立左右两个空的数组
  for (var i = 0; i < brr.length; i++) { //进行for循环
    if (brr[i] < centerNum) { //当下标所对应的数小于中间是数的时候,推入左边数组的最后边
      left.push(brr[i])
    } else { //不符合条件的推入右边数组的后边
      right.push(brr[i])
    }
  }
  // console.log(left,right)
  return quicklySort(left).concat([centerNum], quicklySort(right)) //用concat将左边数组、中间数和右边数组连接起来
}
复制代码

保留小数点后几位(不四舍五入)默认两位

js中取小数点后两位方法最常用的就是toFixed方法了,但是toFixed会对保留小数进行四舍五入,如果我们有需求不进行四舍五入就得自己封装个保留小数的函数了。

/*
 * @Description: 保留小数点后几位(不四舍五入)默认两位
 * @param {Float} x 要处理的小数
 * @param {Float} num 保留几位
 */
// 备注:parseFloat、parseInt有问题。parseFloat('1a')==1
function qfyToDecimal(x, num) {
  // var f = parseFloat(x); 
  x = (x + '').trim(); //转成字符串 去空格
  var f = x / 1;
  // num = parseInt(num) || 2;
  num = num / 1 || 2;
  if (isNaN(f) || x === '' || isNaN(num) || num % 1 != 0) {
    console.log('type error!');
    return;
  }
  var divisorNum = Math.pow(10, num)
  var f = Math.round(x * divisorNum) / divisorNum;
  var s = f.toString();
  var rs = s.indexOf('.');
  if (rs < 0) {
    rs = s.length;
    s += '.';
  }
  while (s.length <= rs + num) {
    s += '0';
  }
  return s;
}
复制代码

字符替换

/*
 * @Description: 字符替换
 * @param {String} str 要处理的字符串
 * @param {String} l 表示你将要替换的字符
 * @param {String} r 表示你想要替换的字符
 */
function qfyStrReplace(str, l, r) {
  if (typeof str != "string") {
    console.log('type error!');
    return;
  }
  var reg = new RegExp(l, 'g') // g表示全部替换,默认替换第一个
  str = str.replace(reg, r)
  return str
}
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享