当前位置: 首页 > news >正文

【前端】理解 JavaScript 对象属性访问的复杂性


在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: 前端

文章目录

  • 💯前言
  • 💯理论基础:JavaScript 对象属性的访问模式
    • 1. 点符号访问(Dot Notation)
    • 2. 方括号访问(Bracket Notation)
    • 点符号与方括号的关键差异
  • 💯示例代码解析
    • 对象定义
    • 动态变量
    • 第一条语句:`console.log(obj[name]);`
    • 第二条语句:`console.log(obj.name);`
  • 💯总结:两种访问方式的本质差异
  • 💯优化代码表达与设计实践
    • 明确访问方式的适用场景
    • 避免变量与属性名的混淆
    • 增加调试信息
  • 💯高级场景与拓展应用
    • 动态生成属性
    • 遍历对象的属性
    • 使用 `Proxy` 和 `Reflect`
  • 💯结论


在这里插入图片描述


💯前言

  • JavaScript 编程中,开发者经常需要对对象的属性进行访问。然而,访问方式的不同可能导致代码行为的差异,尤其在动态属性的处理中。这种差异可能引发一些困惑,尤其对于初学者
    JavaScript在这里插入图片描述
    例如,考虑如下代码:

    var obj = {a: 1,b: 2,c: 3
    };var name = 'a';
    console.log(obj[name]); // 输出 1
    console.log(obj.name);  // 输出 undefined
    

    在上述代码中,console.log(obj[name])console.log(obj.name) 的输出结果截然不同。前者返回值 1,而后者返回 undefined。本文旨在深入探讨造成这种行为差异的原因,并提供有关 JavaScript 对象属性访问的全面解析。
    在这里插入图片描述


💯理论基础:JavaScript 对象属性的访问模式


1. 点符号访问(Dot Notation)

点符号访问是一种固定的属性访问形式,通常用于访问预定义的、符合标识符命名规则的对象属性。

  • 语法object.property
  • 要求:属性名必须是合法的标识符,例如字母、数字、下划线 _$ 开头。
  • 限制:属性名不能是变量或表达式。

示例:

var obj = { a: 1, b: 2 };
console.log(obj.a); // 输出 1

2. 方括号访问(Bracket Notation)

方括号访问允许开发者通过字符串或变量动态指定属性名。它更为灵活,可以处理动态生成的属性名或含特殊字符的属性。

  • 语法object['property']object[variable]
  • 优势:支持动态属性名和特殊字符。
  • 使用场景:在属性名不确定或包含特殊字符的情况下。

示例:

var obj = { 'my-key': 1 };
var key = 'my-key';
console.log(obj[key]); // 输出 1

点符号与方括号的关键差异

  • 点符号要求属性名是硬编码的标识符;方括号支持动态解析。
  • 点符号在解析时将属性名视为字符串常量,而方括号则解析表达式的值。

例如:

var obj = { a: 1 };
var key = 'a';
console.log(obj.a);    // 输出 1
console.log(obj[key]); // 输出 1
console.log(obj.key);  // 输出 undefined

在上述代码中,obj.aobj[key] 都能正确访问属性 a,但 obj.key 查找的是一个名为 key 的属性,而非变量 key 的值。


💯示例代码解析

让我们逐步分析开头代码的行为:


对象定义

var obj = {a: 1,b: 2,c: 3
};

对象 obj 定义了三个属性:

  • 属性 a 的值为 1
  • 属性 b 的值为 2
  • 属性 c 的值为 3

动态变量

var name = 'a';

变量 name 被赋值为字符串 'a'。需要注意,变量 name 并不是对象 obj 的属性。


第一条语句:console.log(obj[name]);

这里使用了方括号语法:

  • 方括号中的 name 被解析为变量,其值为 'a'
  • 因此,obj[name] 等价于 obj['a'],指向属性 a 的值。
  • 属性 a 的值为 1,因此输出 1

第二条语句:console.log(obj.name);

这里使用了点符号语法:

  • 点符号中的 name 被解析为字符串常量 'name',而非变量。
  • 换句话说,代码尝试访问对象 obj 中名为 name 的属性。
  • 由于 obj 并未定义名为 name 的属性,因此输出 undefined

💯总结:两种访问方式的本质差异

通过上述分析,可以总结出以下几点:

  1. 点符号的属性名是静态的:点符号中属性名必须直接写入代码,不能动态指定。
  2. 方括号的属性名是动态的:方括号支持变量、表达式及动态生成的属性名。
  3. 访问不存在的属性返回 undefined:无论使用哪种访问方式,若对象中无匹配的属性名,结果均为 undefined

💯优化代码表达与设计实践


明确访问方式的适用场景

  1. 固定属性名

    • 若属性名确定且符合标识符规则,优先使用点符号,语法更加清晰简洁。
    • 示例:console.log(obj.a);
  2. 动态或特殊属性名

    • 若属性名由变量或表达式生成,必须使用方括号。
    • 示例:console.log(obj[key]);

避免变量与属性名的混淆

建议避免变量名与属性名过于相似,以降低歧义风险。例如:

var obj = { name: 1 };
var name = 'a';
console.log(obj[name]); // 明确动态访问

增加调试信息

调试时,可以使用 console.log 检查变量值和对象结构,确保属性名的解析逻辑符合预期:

console.log('name:', name);
console.log('obj[name]:', obj[name]);

💯高级场景与拓展应用


动态生成属性

动态属性名可以通过方括号语法在对象定义时直接生成:

var dynamicKey = 'newKey';
var obj = { [dynamicKey]: 42 };
console.log(obj.newKey); // 输出 42

遍历对象的属性

使用 for...inObject.keys() 遍历对象时,方括号是访问属性值的常见方式:

var obj = { a: 1, b: 2 };
for (var key in obj) {console.log(key, obj[key]);
}

使用 ProxyReflect

JavaScript 的 Proxy 对象提供了对属性访问的拦截机制,可用于自定义属性解析逻辑。例如:

var handler = {get: function(target, prop) {return prop in target ? target[prop] : `属性 ${prop} 不存在`;}
};var obj = { a: 1 };
var proxy = new Proxy(obj, handler);
console.log(proxy.a); // 输出 1
console.log(proxy.b); // 输出 "属性 b 不存在"

通过 Proxy,开发者可以灵活定制属性访问的行为。


💯结论

  • 在这里插入图片描述
    JavaScript 中的点符号方括号提供了两种截然不同的对象属性访问方式。理解它们的适用场景行为差异,不仅有助于编写清晰的代码,还能有效避免潜在的逻辑错误

  • 点符号:适用于静态、确定的属性名,语法直观。

  • 方括号:适用于动态或含特殊字符的属性名,功能更为灵活。

通过熟练运用这些访问方式,开发者能够更加高效地操作对象属性,提升代码的可读性与健壮性。


在这里插入图片描述


在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

相关文章:

【前端】理解 JavaScript 对象属性访问的复杂性

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 💯前言💯理论基础:JavaScript 对象属性的访问模式1. 点符号访问(Dot Notation)2. 方括号访问(Bracket Notation)点符号…...

Django异步视图adrf解决办法

提问 在Django编写异步视图的时候会出现 AssertionError: Expected a Response, HttpResponse or HttpStreamingResponse to be returned from the view 或者 TypeError: sync_to_async can only be applied to sync functions. 诸如此类的错误的时候一般发生在异步视图中…...

【一文了解】C#基础-接口

目录 1. 定义 2. 接口的特点与规则 3. 接口的实现 3.1单接口实现 3.2多接口实现 4. 接口的作用和用途 1)扩展行为 2)规范行为 3)降低耦合 5. 接口与继承的比较 1)继承 2)接口 6. 接口与抽象类的比较 1)IComparable(比较器,常用) 2)IComparer(比较器)…...

活着就好20241210

亲爱的朋友们,大家早上好!🌞 今天是10号,星期二,2024年12月的第十天,同时也是第50周的开始,农历甲辰[龙]年十一月初六日。在这晨光熹微的美好时刻,愿那温暖而明媚的阳光轻轻拂过你的…...

多表设计 - 一对一多对多

一.一对一关系概述: 例如:一位用户只能有一张身份证,一张身份证也只能对应一位用户 如果用户基本信息查询频率比用户身份信息查询频率高,为了提高效率,可拆分为两张表: 此时如何体现一对一的关系呢&#xf…...

实现 DataGridView 下拉列表功能(C# WinForms)

本文介绍如何在 WinForms 中使用 DataGridViewComboBoxColumn 实现下拉列表功能,并通过事件响应来处理用户的选择。以下是实现步骤和示例代码。 1. 效果展示 该程序的主要功能是展示如何在 DataGridView 中插入下拉列表,并在选择某一项时触发事件。 2.…...

使用Java创建RabbitMQ消息生产者的详细指南

目录 在现代分布式系统中,消息队列是实现异步通信的重要工具。RabbitMQ作为一种流行的开源消息代理,支持多种消息协议,广泛应用于微服务架构和事件驱动的应用程序中。本文将深入探讨如何使用Java创建RabbitMQ的消息生产者,发送消息…...

【LC】160. 相交链表

题目描述: 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意&…...

Spark架构及运行流程

Spark架构图 Driver: 解析用户的应用程序代码,转化为作业(job)。创建SparkContext上下文对象,其负责与资源管理器(ClusterManager)通信,进行资源的申请、任务的分配和监控等。跟踪Executor的执行情况。可通过UI界面查询运行情况。…...

Linux安装Python2.7.5(centos自带同款)

卸载已安装的python,防止版本兼容问题 rpm -qa|grep python|xargs rpm -ev --allmatches --nodeps 删除残余文件 whereis python |xargs rm -frv 安装前提是已安装gcc和g gcc --version g --version 下载安装python2.7.5 https://www.python.org/downloads/release/pyt…...

上传ssh公钥到目标服务器

创建密钥 ssh-keygen -t rsa -b 4096 -C "xxxx.xx"上传 sudo ssh-copy-id -i /Users/xx/.ssh/id_rsa.pub root127.0.0.1...

【LLMs】用LM Studio本地部署离线大语言模型

文章目录 一、下载LM Studio二、下载大语言模型1. 查看模型介绍2. 点击模型文件进行下载2.1 完整下载2.2 部分下载 三、加载模型1. 打开LM Studio图形化界面,点击**My Models**2. 然后,点击“...”,选择“change”,选择刚下载好的…...

SpringBoot下类加入容器的几种方式

SpringBoot下类加入容器的几种方式 在 Spring Boot 中,类加入容器的方式不仅多样,而且每种方式都有其特定的使用场景。以下是几种常见的将类加入 Spring 容器的方法及其适用场景: 1. 使用 Component 及其派生注解 使用场景:当开…...

【Mysql】忘记Root密码后如何不影响数据进行重置密码

方法一:通用方法--启动时跳过权限表 1> 停止数据库 以管理员方式打开cmd!! C:\Users\Administrator>net stop mysql MySQL 服务正在停止.. MySQL 服务已成功停止。 2> 启动时跳过权限表 mysqld --console --skip-grant-tables -…...

宝塔内设置redis后,项目以及RedisDesktopManager客户端连接不上!

项目展现问题: Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to xxx.宝塔外链.ip.xxxx:6379 redis客户端连接失败: 1、宝塔中确认redis端口已放行 2、修改redis的配置 bind&#x…...

一文了解模式识别顶会ICPR 2024的研究热点与最新趋势

简介 对模式识别研究领域前沿方向的跟踪是提高科研能力和制定科研战略的关键。本文通过图文并茂的方式介绍了ICPR 2024的研究热点与最新趋势,帮助读者了解和跟踪模式识别的前沿研究方向。本推文的作者是黄星宇,审校为邱雪和许东舟。 一、会议介绍 ICPR…...

【深度学习】深刻理解BERT

BERT(Bidirectional Encoder Representations from Transformers)是由Google于2018年提出的一种预训练的语言表示模型,它基于Transformer架构并能够处理自然语言处理(NLP)中的多种任务。BERT的核心创新是其使用了双向编…...

一种基于通义千问prompt辅助+Qwen2.5-coder-32b+Bolt.new+v0+Cursor的无代码对话网站构建方法

前言 今年似乎大模型之间的“内卷”已经有些偃旗息鼓了,各大技术公司逐渐从单纯追求模型参数量的竞赛中抽身,转向更加注重模型的实际应用效果与效率,开始内卷起了LLM“载具” 不知道这个词是不是我第一个发明的哈,总之我更喜欢…...

Java版-图论-最小生成树-Kruskal算法

实现描述 为了造出一棵最小生成树,我们从最小边权的边开始,按边权从小到大依次加入,如果某次加边产生了环,就扔掉这条边,直到加入了 n-1 条边,即形成了一棵树。 实现代码 首选我们对所有的边&#xff0c…...

计算机网络知识总结

1.网络协议是什么? 在计算机网络要做到有条不紊地交换数据,就必须遵守一些约定好的规则,比如交换数据地格式,是否需要发送一个应答信息。这些规则被称为网络协议。 分层结构 应用层:为计算机用户提供服务表示层&…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

【位运算】消失的两个数字(hard)

消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...

零基础设计模式——行为型模式 - 责任链模式

第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...

一些实用的chrome扩展0x01

简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序,无论是测试应用程序、搜寻漏洞还是收集情报,它们都能提升工作流程。 FoxyProxy 代理管理工具,此扩展简化了使用代理(如 Burp…...

医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor

1 医疗树模型与可解释人工智能基础 医疗领域的人工智能应用正迅速从理论研究转向临床实践,在这一过程中,模型可解释性已成为确保AI系统被医疗专业人员接受和信任的关键因素。基于树模型的集成算法(如RandomForest、XGBoost、LightGBM)因其卓越的预测性能和相对良好的解释性…...