数据类型判断
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';
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。