1.判断数据类型为空
1.1.判断一个对象是否为空
总共有三种方法,for...in...遍历属性,JSON.stringify,Object.keys
obj = {};
// 方法一: for...in...遍历
function judgeObj(obj) {
for (let attr in obj) {
console.log("非空对象");
}
console.log("空对象");
}
judgeObj(obj);
// 方法二: JSON 方法
if (JSON.stringify(obj) == "{}") {
console.log("空对象");
} else {
console.log("非空对象");
}
// 方法三: ES6新增的方法 Object.keys() | (推荐)
if (Object.keys(obj).length === 0) {
console.log("空对象");
} else {
console.log("非空对象");
}
1.2.判断一个数组是否为空
let emptyArray = [];
if (Array.isArray(emptyArray) && emptyArray.length) {
console.log("数组非空");
} else {
console.log("数组为空");
}
// 拓展: 若emptyArray为undefined, null, {},''等时, 打印结果依旧为 "数组为空"
// 小结: 对该判断, 当且仅当 emptyArray 为数组且数组不为空, 才会打印 "数组非空"
isArray实现原理
Array.isArray = function(value) {
return Object.prototype.toString.call(value) === '[object Array]';
}
2.遍历对象和数组
2.1.遍历对象
// 方法一: for...in
obj = { NAME: "江南", AGE: 25 };
for (var index in obj) {
console.log("key=", index, "value=", obj[index]); // key= NAME value= 江南 key= AGE value= 25
}
// 小结: for in 循环是普通 for 循环的变体,主要用来遍历对象; 可以将对象中的属性依次循环出来.
// 作用: 最常用的地方是用于调试,可以更方便的去检查对象属性(通过输出到控制台或其他方式)
// 方法二: Object.keys()
// 遍历对象返回的是一个包含对象自身可枚举属性的数组(不含Symbol属性).
obj = { NAME: "江南", AGE: 25 };
let tmp = Object.keys(obj)
console.log(tmp); // [ 'NAME', 'AGE' ]
Object.keys(obj).forEach((index) => {
console.log("key=", index, "value=", obj[index]); // key= NAME value= 江南 key= AGE value= 25
});
// 方法三: Object.getOwnPropertyNames()
Object.getOwnPropertyNames(obj).forEach((index) => {
console.log("key=", index, "value=", obj[index]); // key= NAME value= 江南 key= AGE value= 25
});
// 方法四: Reflect.ownKeys()
Reflect.ownKeys(obj).forEach((index) => {
console.log("key=", index, "value=", obj[index]); // key= NAME value= 江南 key= AGE value= 25
});
2.2.遍历数组
// 方法一: forEach()
// forEach() 方法对数组的每个元素执行一次给定的函数.
const arr = ['a', 'b', 'c'];
arr.forEach(element => console.log(element)); // a b c
// 注意: 1.那些已删除或者未初始化的项将被跳过.
// 2.forEach 不会直接改变调用它的对象,但是那个对象可能会被 callback 函数改变.
// 3.没有办法中止或跳出 forEach() 循环; 若你需要,你可以使用:一个简单的 for 循环, for...of
// 提示: 只要条件允许,也可以使用 filter() 提前过滤出需要遍历的部分,再用 forEach() 处理.
// 方法二: map()
// map() 方法创建一个新数组,这个新数组由原数组中的每个元素都调用一次提供的函数后的返回值组成。
const persons = [
{ firstname: "Malcom", lastname: "Reynolds" },
{ firstname: "Kaylee", lastname: "Frye" },
{ firstname: "Jayne", lastname: "Cobb" },
];
let fullName = persons.map((item) => {
return [item.firstname, item.lastname].join(" ");
});
console.log(fullName); // [ 'Malcom Reynolds', 'Kaylee Frye', 'Jayne Cobb' ]
// 工作使用场景: 格式化后端返回的对象
let clubs = [
{ NAME: "萧山行社", CODE: "811" },
{ NAME: "滨江行社", CODE: "812" },
];
let fmtClubs = clubs.map((obj) => {
return {
value: obj.CODE,
label: obj.NAME,
};
});
console.log(fmtClubs);
[
{ value: '811', label: '萧山行社' },
{ value: '812', label: '滨江行社' }
]
// 方法三: 一般的 for 循环
let arr = ["a", "b", "c", "d"];
for (let i = 0; i < arr.length; i++) {
console.log(i, arr[i]);
}
// 方法四: for...of
// 只遍历出value,不能遍历出下标,可遍历除Symbol数据类型的属性,此方法作为遍历所有数据结构的统一的方法
let arr = ["a", "b", "c", "d"];
for (const v of arr) {
console.log(v);
}