前言:在项目的业务逻辑中,有些场景会用到对象属性是否存在的判断。那么就需要我们选择适合业务的判断逻辑。
1. obj.name
通过 obj.name 判断属性是否存在,有个缺陷,就是当属性为 "", undefined, null, 0 时,也是判断的不存在。
let obj = {}; obj.name ? "存在" : "不存在"; // 不存在 let obj = { name: "" }; obj.name ? "存在" : "不存在"; // 不存在 let obj = { name: 0 }; obj.name ? "存在" : "不存在"; // 不存在 let obj = { name: null }; obj.name ? "存在" : "不存在"; // 不存在 let obj = { name: undefined }; obj.name ? "存在" : "不存在"; // 不存在 let obj = { name: "yqcoder" }; obj.name ? "存在" : "不存在"; // 存在
2. Object.keys(obj).includes('name')
拿到这个对象的所有属性名,这个属性名要求是自身可枚举的属性。那什么叫自身属性什么叫可枚举属性呐,自身属性是自有的属性,不是通过构造函数获得的,可枚举属性就是可以通过循环,遍历对象可以访问到的属性。
// 通过构造函数生成对象 function Create() {} Create.prototype.name = "yqcoder"; let obj = new Create(); console.log(obj.name); // yqcoder; Object.keys(obj).includes("name") ? "存在" : "不存在"; // "不存在" // 不可枚举属性 let obj = { name: "yqcoder" }; Object.defineProperty(obj, "name", { enumerable: false, }); console.log(obj.name); // yqcoder; Object.keys(obj).includes("name") ? "存在" : "不存在"; // 不存在 // 正常情况对象属性 let obj = { name: "yqcoder" }; Object.keys(obj).includes("name") ? "存在" : "不存在"; // "存在"
3. obj.hasOwnProperty('name')
可以不是可枚举的属性,只要是自有属性,就 ok。
// 通过构造函数生成对象 function Create() {} Create.prototype.name = "yqcoder"; let obj = new Create(); console.log(obj.name); // yqcoder; obj.hasOwnProperty("name") ? "存在" : "不存在"; // "不存在" // 不可枚举属性 let obj = { name: "yqcoder" }; Object.defineProperty(obj, "name", { enumerable: false, }); console.log(obj.name); // yqcoder; obj.hasOwnProperty("name") ? "存在" : "不存在"; // "存在" // 正常情况对象属性 let obj = { name: "yqcoder" }; obj.hasOwnProperty("name") ? "存在" : "不存在"; // "存在"
4. 关键字 in
不要求是自由可枚举的属性了,只要能找到就 ok
// 通过构造函数生成对象 function Create() {} Create.prototype.name = "yqcoder"; let obj = new Create(); console.log(obj.name); // yqcoder; 'name' in obj ? "存在" : "不存在"; // "存在" // 不可枚举属性 let obj = { name: "yqcoder" }; Object.defineProperty(obj, "name", { enumerable: false, }); console.log(obj.name); // yqcoder; 'name' in obj ? "存在" : "不存在"; // 存在 // 正常情况对象属性 let obj = { name: "yqcoder" }; obj.hasOwnProperty("name") ? "存在" : "不存在"; // 存在