前端 JS 经典:判断对象属性是否存在

简介: 前端 JS 经典:判断对象属性是否存在

前言:在项目的业务逻辑中,有些场景会用到对象属性是否存在的判断。那么就需要我们选择适合业务的判断逻辑。

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") ? "存在" : "不存在"; // 存在


目录
相关文章
|
3天前
|
Web App开发 JSON JavaScript
JavaScript对象常用操作JSON总结
JavaScript对象常用操作JSON总结
16 8
|
1天前
|
存储 JavaScript 前端开发
JavaScript中的对象是数据结构,存储键值对,键为字符串,值可为任意类型,包括函数(作为方法)
【6月更文挑战第25天】JavaScript中的对象是数据结构,存储键值对,键为字符串,值可为任意类型,包括函数(作为方法)。
8 2
|
1天前
|
JavaScript 索引
Vue.js的`v-for`用于基于数组或对象渲染列表,如遍历数组生成`<li>`元素
【6月更文挑战第25天】Vue.js的`v-for`用于基于数组或对象渲染列表,如遍历数组生成`<li>`元素。基本语法是`v-for="(item, index) in items"`,支持遍历对象的键值对。注意与`v-if`同用时应使用`<template>`,组件上使用`v-for`需设`key`属性以优化性能。
10 2
|
3天前
|
设计模式 前端开发 JavaScript
关于写好前端JS代码的一些建议
关于写好前端JS代码的一些建议
14 2
|
7天前
|
JavaScript 前端开发 安全
安全开发-JS应用&原生开发&JQuery库&Ajax技术&加密编码库&断点调试&逆向分析&元素属性操作
安全开发-JS应用&原生开发&JQuery库&Ajax技术&加密编码库&断点调试&逆向分析&元素属性操作
|
5天前
|
存储 JavaScript 前端开发
第六篇-Javascript对象
第六篇-Javascript对象
10 2
|
7天前
|
JavaScript 前端开发
JavaScript进阶-模板字符串与增强的对象字面量
【6月更文挑战第19天】ES6的模板字符串和增强对象字面量提高了JavaScript的易读性和效率。模板字符串(` `)支持变量嵌入和多行,简化了字符串处理;增强对象字面量允许简写属性与方法,以及动态属性名。注意模板字符串的闭合和性能影响,以及对象字面量的简写语法和计算属性名的恰当使用。通过实例展示了这两项特性的应用,助力编写更优雅的代码。
|
7天前
|
JavaScript
js 判断对象内所有值为空
js 判断对象内所有值为空
|
1天前
|
前端开发 JavaScript 安全
解锁 JavaScript ES6:函数与对象的高级扩展功能
解锁 JavaScript ES6:函数与对象的高级扩展功能
|
1天前
|
JavaScript 前端开发 Java
遨游 JavaScript 对象星际:探索面向对象编程的深邃世界
遨游 JavaScript 对象星际:探索面向对象编程的深邃世界