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

news2024/12/13 3:44:25

在这里插入图片描述

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

文章目录

  • 💯前言
  • 💯理论基础: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 中的点符号方括号提供了两种截然不同的对象属性访问方式。理解它们的适用场景行为差异,不仅有助于编写清晰的代码,还能有效避免潜在的逻辑错误

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

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

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


在这里插入图片描述


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2256762.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【工具变量】上市公司企业研发不确定性数据(2013-2023年)

一、测算方式:参考顶刊《中国工业经济》孙薇(2023)老师的做法,本文从专利的申请与授权的视角出发,以企业当年申请的发明专利中最终未被授权的比例度量研发不确定性 (uc)。这是因为,相…

easyExcel单一下拉框和级联下拉框

文章目录&#xff1a; 单一下拉框级联下拉框 具体实现&#xff1a; 单一下拉框 public class BoolWriteHandler implements SheetWriteHandler {private List<String> dropDown;private List<Integer> indexList;public BoolWriteHandler(List<Integer> i…

【C++】指针与智慧的邂逅:C++内存管理的诗意

文章目录 RAII 智能指针auto_ptrunique_ptr shared_ptr模拟实现定制删除器循环引用 和 weak_ptr RAII RAII&#xff08;Resource Acquisition Is Initialization&#xff09;是一种广泛应用于 C 等编程语言中的编程范式&#xff0c;它的核心思想是&#xff1a;资源的获取和释放…

【优选算法 位运算】位运算算法入门详解:常见位运算总结

判定字符是否唯一 题目解析 算法原理 解法一 &#xff1a;哈希数组 从前往后扫描字符串&#xff0c;把扫描到的字符先进行判断&#xff0c;如果对应的 val 0 &#xff0c;则放入哈希表中&#xff0c;否则返回 false&#xff0c;知道扫描完整个字符&#xff1b;时间…

深入理解Linux进程管理机制

个人主页&#xff1a;chian-ocean 文章专栏-Linux 前言 进程是现代操作系统中一个不可或缺的概念&#xff0c;其主要目的在于管理资源、实现并发、提高系统效率&#xff0c;并确保系统的稳定性和安全性。 进程的定义 进程&#xff08;Process&#xff09; 是计算机操作系统中…

R 语言科研绘图第 4 期 --- 折线图-置信区间

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…

springSecurity自定义登陆接口和JWT认证过滤器

下面我会根据该流程图去自定义接口&#xff1a; 我们需要做的任务有&#xff1a; 登陆&#xff1a;1、通过ProviderManager的方法进行认证&#xff0c;生成jwt&#xff1b;2、把用户信息存入redis&#xff1b;3、自定义UserDetailsService实现到数据库查询数据的方法。 校验&a…

使用 LabVIEW 与 PLC 通信的方式

要将 PLC 与 LabVIEW 或其他 NI 产品进行通信&#xff0c;首先需要明确 PLC 支持的通信协议和接口类型。NI 提供了多种方案&#xff0c;包括 OPC 服务器、Modbus、Ethernet/IP 和其他工业通信协议。下面将详细介绍这些方法&#xff0c;并进行比较分析&#xff0c;帮助你选择最适…

软考高级架构-9.4.4-双机热备技术 与 服务器集群技术

一、双机热备 1、特点&#xff1a; 软硬件结合&#xff1a;系统由两台服务器&#xff08;主机和备机&#xff09;、一个共享存储&#xff08;通常为磁盘阵列柜&#xff09;、以及双机热备软件&#xff08;提供心跳检测、故障转移和资源管理功能的核心软件&#xff09;组成。 …

专题二十五_动态规划_两个数组的 dp (含字符串数组)_算法专题详细总结

目录 动态规划_两个数组的 dp &#xff08;含字符串数组&#xff09; 1. 最⻓公共⼦序列&#xff08;medium&#xff09; 解析&#xff1a; 1. 状态表⽰&#xff1a; 2. 状态转移⽅程&#xff1a; 3. 初始化&#xff1a;​编辑 4. 填表顺序&#xff1a;​编辑 5. 返回值…

12,攻防世界simple_php

simple_php 题目来源:Cyberpeace-n3k0 题目描述: 小宁听说php是最好的语言,于是她简单学习之后写了几行php代码。 进入靶场 这段PHP代码是一个简单的web应用示例&#xff0c;让我们逐步分析这段代码&#xff1a; show_source(__FILE__);&#xff1a;这行代码会显示当前文件的…

NIO - selector简单介绍

一 前言 selector作为NIO当中三大组件之一&#xff0c;是处理NIO非阻塞模式下的核心组件&#xff0c;它允许一个单个线程管理多个通道。 NIO下的阻塞模式 因为对于阻塞模式下的NIO模式&#xff0c;存在很大的问题&#xff0c;即使在单线程下&#xff0c;对应的服务端也会一直进…

二、部署docker

二、安装与部署 2.1 安装环境概述 Docker划分为CE和EE&#xff0c;CE为社区版&#xff08;免费&#xff0c;支持周期三个月&#xff09;&#xff0c;EE为企业版&#xff08;强调安全&#xff0c;付费使用&#xff09;。 Docker CE每月发布一个Edge版本&#xff08;17.03&…

Camp4-L2:LMDeploy 量化部署进阶实践

书生浦语大模型实战营第四期&#xff1a;LMDeploy 量化部署进阶实践 教程链接&#xff1a;https://github.com/InternLM/Tutorial/tree/camp4/docs/L2/LMDeploy视频链接&#xff1a;https://www.bilibili.com/video/BV18aUHY3EEG/?vd_sourceb96c7e6e6d1a48e73edafa36a36f1697…

Qt之第三方库QCustomPlot使用(二)

Qt开发 系列文章 - qcustomplot&#xff08;二&#xff09; 目录 前言 一、Qt开源库 二、QCustomPlot 1.qcustomplot介绍 2.qcustomplot下载 3.qcustomplot移植 4.修改项目文件.pro 5.提升QWidget类‌ 三、技巧讲解 1.拖动缩放功能 2.等待更新 总结 前言 Qt第三方…

python数据分析之爬虫基础:selenium详细讲解

目录 1、selenium介绍 2、selenium的作用&#xff1a; 3、配置浏览器驱动环境及selenium安装 4、selenium基本语法 4.1、selenium元素的定位 4.2、selenium元素的信息 4.3、selenium元素的交互 5、Phantomjs介绍 6、chrome handless模式 1、selenium介绍 &#xff08;1…

LearnOpenGL学习(模型加载 -- Assimp,网格,模型)

完整代码见&#xff1a;zaizai77/Cherno-OpenGL: OpenGL 小白学习之路 Assimp 3D建模工具如Blender、3DS Max在导出模型文件时&#xff0c;会自动生成所有的顶点坐标、顶点法线和纹理坐标。 .obj 格式只包含了模型数据和材质信息&#xff08;颜色、贴图等&#xff09; Assi…

qtcanpool 知 08:Docking

文章目录 前言口味改造后语 前言 很久以前&#xff0c;作者用 Qt 仿照前端 UI 设计了一个 ministack&#xff08;https://gitee.com/icanpool/qtcanpool/blob/release-1.x/src/libs/qcanpool/ministack.h&#xff09; 控件&#xff0c;这个控件可以折叠。部分用户体验后&#…

【Linux】文件管理必备知识和基本指令

【Linux】文件管理必备知识和基本指令 什么是操作系统什么是文件什么是路径01. ls 指令02. pwd命令03. cd 指令04. touch指令05.mkdir指令&#xff08;重要&#xff09;&#xff1a;06.rmdir指令 && rm 指令&#xff08;重要&#xff09;&#xff1a;rmdir指令rm指令 0…

R155 VTA 认证对汽车入侵检测系统(IDS)合规要求

续接上集“浅谈汽车网络安全车辆型式认证&#xff08;VTA&#xff09;的现状和未来发展”&#xff0c;有许多读者小伙伴有联系笔者来确认相关的R155 VTA网络安全审核要求&#xff0c;基于此&#xff0c;笔者将针对 R155 VTA 每一条网络安全审核细则来具体展开。 今天就先从汽车…