数据类型判断

1、判断NaN

function isNaN(val) {
    // Number.isNaN是es6提出的,之前的可能没有这个函数,所以要先判断
  if (Number.isNaN) {
    return Number.isNaN(val);
  }
  // NaN是唯一非自反的
  return val !== val;
}

2、判断数字

function isNumeric(val) {
  return /^\d+(\.\d+)?$/.test(val);
}

正则解读:

  • ^ 匹配输入字符串的开始位置
  • \d 匹配一个数字字符,等价于[0-9]
  • + 匹配前面的子表达式一次或多次
  • \. 匹配字符'.'
  • ? 匹配前面的字表达式零次或多次
  • $ 匹配输入字符串的结束位置

所以isNumeric(1.)和isNumeric(.1)都是true。
疑惑点
1、有个很奇怪的现象,字符串'1'返回值也是true,/^[0-9]+$/.test('1')也是true。

3、判断date

function isDate(val) {
  return (
    Object.prototype.toString.call(val) === '[object Date]' &&
    !isNaN(val.getTime())
  );
}

数据深拷贝

1、深拷贝

const { hasOwnProperty } = Object.prototype;
// 深拷贝
function deepClone(obj) {
  if (Array.isArray(obj)) {
    return obj.map((item) => deepClone(item));
  }

  if (typeof obj === 'object') {
    // 对象拷贝
    return deepAssign({}, obj);
  }

  return obj;
}
// 对象拷贝
function deepAssign(to, from) {
  Object.keys(from).forEach((key) => {
    // 键值对拷贝
    assignKey(to, from, key);
  });

  return to;
}
// 键值对拷贝
function assignKey(to, from, key) {
  const val = from[key];
  // 是否为空
  if (!isDef(val)) {
    return;
  }
    // 是否是对象属性 是否是对象
  if (!hasOwnProperty.call(to, key) || !isObject(val)) {
    to[key] = val;
  } else {
    to[key] = deepAssign(Object(to[key]), from[key]);
  }
}
// 是否为空
function isDef(val){
  return val !== undefined && val !== null;
}
// 是否是对象
function isObject(val) {
  return val !== null && typeof val === 'object';
}

喆喆
74 声望7 粉丝

小白一枚!!!


« 上一篇
组件
下一篇 »
Echarts 结构