访问对象的属性,你知道有哪些方法?

相信对象对于每个使用JavaScript的人来说都不陌生。访问对象的属性几乎日常开发每天都在用。下面我们一起探索下有哪些方式可以实现属性的访问。

访问对象属性介绍

对象是JavaScript的一种常见的数据类型。它允许我们以键值对的形式存储数据。这一系列的键成为对象的属性。

常见的访问对象的属性的方式有三种,包括点号、方括号和对象分解。点号也经常被叫做点号属性访问器。而方括号表示法也被称为方括号属性访问器。

这三种访问方式都是在你知道属性名的情况下,否则于事无补。你只能通过循环遍历获取所有的属性,其中包括你想要获取的那个属性。下面来分别看下三种访问方式。

点号

点号访问器是访问属性里用的最多的一种方式。或许是最简单的一种形式。语法就是你先指定一些对象,然后根据你所知道的属性名,在对象和属性名之间用点号连接。

使用同样的方式你也可以访问对象里更深层次的属性。通过层层嵌套的方式将它们连接起来。例如obj.shallowProp.deeperProp.DeepestProp

// Create an object using object literal:
const myObj = {name: 'Anthony Edward Stark',alias: 'Iron Man',gender: 'male',education: 'MIT',affiliation: {current: 'Avengers'},creators: ['Stan Lee', 'Larry Lieber', 'Don Heck', 'Jack Kirby'],status: {alignment: 'good'}
}// Accessing object properties with dot notation:
// First: name of the object.
// Second: name of the property to access.
// Third: dot character between the object and property.
console.log(myObj.name)
// Output:
// 'Anthony Edward Stark'// Accessing deeper object properties:
// Access the "current" property that exists
// in nested object assigned to "affiliation" property
console.log(myObj.affiliation.current)
// Output:
// 'Avengers'

在JavaScript中,有规则说明什么是有效标识符和无效标识符。有效标识符包含Unicode字母、$、_和数字0-9。但是不能以数字开头。当我们在声明变量的时候要注意这些规则。

在使用点访问器也要注意属性名的有效性。点访问器只在有效的标识符的情况下访问才有结果。如果该属性名以数字开头或者只包含数字,再或者包含-符号,就不能使用点访问器。

这个时候我们就得使用方括号访问器了。

// Create an object:
myObj = {1: 'First property','first-name': 'Bruce',
}// Try to use dot notation
// to access properties on "myObj".
console.log(myObj.1)
// Output:
// SyntaxError: Unexpected tokenconsole.log(myObj.first-name)
// Output:
// NaN// Try to use bracket notation
// to access properties on "myObj".
console.log(myObj['1'])
// Output:
// 'First property'console.log(myObj[1])
// Output:
// 'First property'console.log(myObj['first-name'])
// Output:
// 'Bruce'

方括号

第二种访问对象属性的方式就是方括号表示法。顾名思义就是通过方括号去访问,和点号有点类似。但是又有很大的区别。

首先我们给属性名加上引号,单引号或者双引号都可以。然后给它们整体用方括号包起来放在对象的后面。

方括号访问器也支持一级以上的属性访问。和点号类似。如果遇到属性值为数组的情况,则通过方括号加索引值得方式来获取该变量。

// Create an object:
const myObj = {name: 'Bruce Thomas Wayne',alias: 'Batman',affiliation: ['Batman Family', 'Justice League', 'Outsiders', 'Guild of Detection'],status: {alignment: 'good',occupation: 'businessman'}
}// Accessing object properties with bracket notation:
// First: name of the object.
// Second: name of the property to access.
// Note: property name must be wrapped with quotes
// and then with square brackets.
console.log(myObj['name'])
// Output:
// 'Bruce Thomas Wayne'// Accessing deeper object properties:
// Access the "alignment" property that exists
// in nested object assigned to "status" property
console.log(myObj['status']['alignment'])
// Output:
// 'good'// Accessing array items in objects:
// Access the second item inside the array
// assigned to "affiliation" property.
console.log(myObj['affiliation'][1])
// Output:
// 'Justice League'

有趣的一点是方括号支持通过计算的属性名进行访问。简而言之就是你一开始可能并不知道该属性名,但是之后这个属性名被存在某一个变量中,你可以引用此变量来访问与变量值匹配的属性。

注意区别在于,变量名放在方括号里是不需要加引号的。

// Create an object:
const myObj = {name: 'James Howlett',alias: 'Wolverine',status: {alignment: 'good'}
}// Assign a property you want to access to a variable:
const myProp = 'alias'// Use the variable to access specific property ("alias"):
// Referencing "myProp" will return value "alias",
// which will be used to access the same property ("alias").
// I.e.: myObj[myProp] => myObj['alias']
console.log(myObj[myProp])
// Output:
// 'Wolverine'

对象分解法

最后一种访问对象属性的方式就是对象分解法。可能很少有人用到。作为ES6规范的一部分,解构最近被加到JavaScript中来。由于它的简单易用,受到广大开发者的喜爱。

经常在声明变量的时候用到。在赋值运算的左边使用大括号包起属性的名称,右边即为对象。通过这种方式将指定的属性的值来给变量赋值。

// Create an object:
const myObj = {name: 'Unknown',alias: 'The Joker',affiliation: ['Black Glove', 'Injustice Gang', 'Injustice League', 'Joker League of Anarchy', 'Justice League of Arkham'],status: {alignment: 'bad',occupation: 'criminal'}
}// Extract the value of "alias" property:
const { alias } = myObj// Log the value of new "alias" variable:
console.log(alias)
// Output:
// 'The Joker'

还可以同时给多个属性解构,属性名称之间通过逗号隔开。

// Create an object:
const myObj = {name: 'Dr. Reed Richards',alias: 'Mister Fantastic',affiliation: 'Fantastic Four',status: {alignment: 'good'}
}// Use object destructuring to assign multiple variables:
// Desctructure "name", "alias", "affiliation" and "status".
const { name, alias, affiliation, status } = myObj// Log the values of new variables:
console.log(name)
// Output:
// 'Dr. Reed Richards'console.log(alias)
// Output:
// 'Mister Fantastic'console.log(affiliation)
// Output:
// 'Fantastic Four'console.log(status)
// Output:
// { alignment: 'good' }

使用解构的方式为变量赋值变得如此简单。但是如果你想给一个变量名不属性名相同的变量赋值,怎么办?也是可以的,对象解构允许你给变量指定别名。这样你就可以通过别名引用这个变量。

使用方式就是在左侧的属性名的后面通过:隔开。

// Create an object:
const myObj = {name: 'Bruce Banner',alias: 'Hulk',affiliation: ['S.H.I.E.L.D.'],status: {alignment: 'good'}
}// Extract the value of "name" property
// and assign it to variable called "realName" (new alias).
const { name: realName } = myObj// Use new alias "realName" to get the value
console.log(realName)
// Output:
// 'Bruce Banner'

如果你想从对象解构的属性中同时改变多个变量名,方法类似。只要在每个属性名的后面增加新的变量名,然后用:隔开即可。

// Create an object:
const myObj = {name: 'Oliver Jonas Queen',alias: 'Green Arrow',affiliation: ['Justice League', 'Justice Society International'],status: {alignment: 'good'}
}// Change multiple variable names:
// Change variable for "name" to "realName".
// Change variable for "alias" to "heroName".
// Change variable for "affiliation" to "connection".
const { name: realName, alias: heroName, affiliation: connection } = myObj// Log all values using new variable names:
console.log(realName)
// Output:
// 'Oliver Jonas Queen'console.log(heroName)
// Output:
// 'Green Arrow'console.log(connection)
// Output:
// [ 'Justice League', 'Justice Society International' ]

对象解构使用起来很爽吧,但是如果你访问的属性不存在会怎么样?有一种方式你可以做的是提供一个默认值。在属性名不存在的时候,获取的就是默认值。

我们将默认值通过=加到属性名的后面,如果这个时候又为属性名增加别名,那么就加在别名的后面。

// Create an object:
const myObj = {name: 'Richard John Grayson',alias: 'Nightwing',status: {alignment: 'good'}
}// Deconstruct the "name" property
// and add default value in case it doesn't exist.
const { name = 'Anonymous' } = myObj// Log the value of name
console.log(name)
// Output:
// 'Richard John Grayson'// Deconstruct the "name" property
// and "affiliation" property,
// change it to "connections" and add default value
// in case "affiliation" property doesn't exist.
const { name, affiliation: connections = 'No connections' } = myObj// Log the value of new variable "connections":
console.log(connections)
// Output:
// 'No connections'

解构的时候遇到计算属性怎么办?

和方括号访问器类似,对象解构也支持属性是一个变量的情况。除了使用方括号将属性名包起来以外,值得一提的是,这个时候你必须要为它指定一个别名,否则会出现语法错误。

// Create an object:
const myObj = {name: 'Max Eisenhardt',alias: 'Magneto',status: {alignment: 'bad'},creators: ['Stan Lee', 'Jack Kirby']
}// Assign a property you want to access to a variable:
const myProp = 'name'// Use the variable to access specific property ("name")
// and also create alias for it:
// Referencing "myProp" will now return value "name",
// which will be used to access the "name" property.
const { [myProp]: name } = myObj// Log the value of new variable "name":
console.log(name)
// Output:
// 'Wolverine'// Use computed property name with default value:
const myProp = 'powers'// Use the variable to access specific property ("powers")
// and create alias "abilities" for it.
// If the property doesn't exist, use 'Unknown'
// as the default value for the new variable.
const { [myProp]: abilities = 'Unknown' } = myObj// Log the value of new variable "abilities":
console.log(abilities)
// Output:
// 'Unknown'

结论:以上三种访问对象属性的方式:点号和方括号和对象分解的方式。具体采用哪种,我们平时使用的时候根据具体情况而定,并没有什么好坏之分。尤其要注意每种使用方式的边缘情况,以上都有说到。

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

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

相关文章

一些行家技巧和窍门

我正在将使用WebLogic Workshop(是的,使用不受支持的IDE可以正确阅读)的现有应用程序迁移到Maven。 在旅途中有一些陷阱,我想在这里写下给那些可能会觉得有用并且特别适合自己的人以作为参考。 整个应用程序使用Apache XMLBeans处…

【视频内含福利】原来手机套壳视频是这么做出来的

最近视频圈子里都在发这种视频,究竟是怎么做出来的?研究下来发现原来是用的这款名字叫Record Maker的APP,旨在帮助用户轻松快速给视频加上手机壳的效果。目前App Store上的版本是1.2.1,最近一次更新支持了iPhone11/iPhone12模型&a…

机器学习 基本概念,常用经典模型

1. 机器学习 明白一些基本概念 什么是机器学习研究如何通过计算的手段,利用经验来改善系统自身的性能通俗来讲,让代码学着干活 特征:自变量标签:因变量 学习的种类有监督学习:提供标签,分类、回归无监督学习…

日常开发之重构

作为开发人员,应该让重构贯穿于你的开发日常的每一刻。 为什么这么说? 重构是为了改善软件的设计、结构和实现,同时保留其现有的功能。 重构的潜在优势包括提高代码的可读性和降低复杂度。 这些都可以提高源代码的可维护性,并创建…

摇钱树

题目描述 Cpg 正在游览一个梦中之城,在这个城市中有n棵摇钱树。。。这下,可让Cpg看傻了。。。可是Cpg只能在这个城市中呆K天,但是现在摇钱树已经成熟了,每天 每棵都会掉下不同的金币(不属于Cpg!&#xff09…

apache thrift_使用Java快速入门的Apache Thrift

apache thriftApache Thrift是由facebook创建的RPC框架,现在它是一个Apache项目。 Thrift允许您在不依赖语言的定义文件中定义数据类型和服务接口。 该定义文件用作编译器的输入,以生成用于构建通过不同编程语言进行通信的RPC客户端和服务器的代码。 您也…

前端八大灵感设计,代码变为现实

我们都知道掌握编程技术是一项很难的事情,没有捷径可走。需要我们在日复一日的工作中去锻炼。如果想要达到擅长甚至需要长年累月的积累。下面列举了一些可以给你带来编码灵感的例子,相信你看到会有想去写代码的冲动。因为一个好的工程师,是不…

Apple 公司开发者账号添加团队成员

Apple 公司开发者账号添加团队成员 简介 首先公司内部团队开发需要的账号类型为公司账号,可以添加团队成员协同开发。 账号下的团队成员有三种角色: Team Agent (代理) 代理: 就是注册开发者账号的那一个,权限最高,续费和创建开发…

相互问题

HTTPS协议是用于确保我们的连接安全的公认标准。 理解此协议的工作原理不是问题,并且从2000年起可以使用相应的RFC文档 。 尽管HTTPS的使用如此广泛,但您仍然可以找到一种无需不必要的复杂性就无法处理此协议的软件。 不幸的是,在使用该语言…

八个使前端工程师惊艳的效果设计,码否?

我们都知道掌握编程技术是一项很难的事情,没有捷径可走。需要我们在日复一日的工作中去锻炼。如果想要达到擅长甚至需要长年累月的积累。 下面列举了一些可以给你带来编码灵感的例子,相信你看到会有想去写代码的冲动。 因为一个好的工程师,…

OpenStack_I版 1.准备过程

openstack是一个开源云平台,python开发此次部署为实验环境, 采用扁平化简单的网络架构部署  优点:低耦合的,模块化Nova 计算资源池Glance 镜像服务Swift 对象存储Horizon 对计算资源,网络资源起别…

使用React和Tailwind CSS搭建项目框架

众所周知,Tailwind CSS框架越来越流行,所以我决定尝试学习并使用Tailwind CSS来搭建一个项目模板,一方面自己深入学习下,二来帮助新人更快地上手Tailwind CSS开发。 创建一个React项目 通过使用create-react-app命令创建一个新的…

快点,再快点!

现在看视频不来个两倍速(或者更快)都觉得在浪费生命。特别是在看视频教程的时候,文字我们可以做到一目十行,但是视频呢,如果有字幕,我们甚至不用听清,用3倍速或者4倍速完全没有问题,…

jetty eclipse_3个步骤实现Jetty和Eclipse集成

jetty eclipse本教程将引导您逐步了解如何集成Jetty和Eclipse,以及如何在Eclipse中的Jetty服务器上运行Web应用程序。 脚步: 安装Jetty Eclipse插件 建立网路应用程式 运行网络应用 1 –安装Jetty Eclipse插件 将服务器添加到“服务器”视图时&…

01jquey基础

1.html代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>无标题文档</title> <script type"text/javascript" src"jquery-3.2.1.min.js"></script> <script type"tex…

使用React和Tailwind CSS搭建项目模板

公众号关注 “太空编程”设为 “星标”&#xff0c;带你了解硬核的编程知识&#xff01;众所周知&#xff0c;Tailwind CSS框架越来越流行&#xff0c;所以我决定尝试学习并使用Tailwind CSS来搭建一个项目模板&#xff0c;一方面自己深入学习下&#xff0c;二来帮助新人更快地…

Java用Java编译

在上一篇文章中&#xff0c;我写了关于如何在运行时生成代理的信息&#xff0c;我们已经了解到生成Java源代码的程度。 但是&#xff0c;要使用该类&#xff0c;必须对其进行编译&#xff0c;并将生成的字节码加载到内存中。 那是“编译”时间。 幸运的是&#xff0c;从Java 1.…

PHP实现前台页面与MySQL的数据绑定、同步更新

今天我来给大家介绍一个PHP-MySQL的小项目。 使用 PHP和前台Ajax 实现在前台对MySQL数据库中数据的增、删等操作语句功能。 如果有问题&#xff0c;欢迎拍砖~ 有不懂的地方&#xff0c;提出来咱们一起探讨~ 首先&#xff0c;我们先做好前台HTML、CSS样式&#xff0c;代码如下&a…

如何用Vue实现简易的富文本编辑器,并支持Markdown语法

前端开发经常会用到富文本编辑器&#xff0c;比如CKEditor&#xff0c;动不动一个库几十M的代码量&#xff0c;其中涉及许多你可能用不到的功能特性和相关设置&#xff0c;CKEditor最新版本的代码仓库就有接近2000个JS文件&#xff0c;300,000行代码。 可是如果你只需要一个简…

互联网基建成果,快速实现一个clubhouse要多久

最近国外的一款基于语音的社交软件clubhouse掀起了一股热潮&#xff0c;尤其是在Eleon Musk的带动下&#xff0c;整个互联网圈内人都在第一时间抢先体验。不管它为什么会火&#xff0c;肯定不是技术上有什么特别的优势。随着整个互联网技术生态的不断发展&#xff0c;互联网基础…