集合引用类型——对象

news2024/9/28 13:19:31

介绍:

        依据变量分类:ECMAScript变量包括两种不同类型的值:原始值和引用值。

        依据类型分类:ECMAScript类型包括两种不同类型的值:基本数据类型和集合数据类型。

原始值和引用值:

        原始值就是最简单的数据,引用值则是由多个值构成的对象。

        一个变量在被赋值时,Javascript引擎必须确定这个值是原始值还是引用值。原始值即基本数据类型(原始类型)的值,目前为止,共由6种基本数据类型:Undefined、Null、Boolean、Number、String和Symbol。原始值的变量是按值访问的;引用值是保存在内存中的对象,引用值的变量是按引用访问的。

引用数据类型:

在日常工作中,对象(Object)和数组(Array)是ECMAScript中使用较多的类型。下面重点看下对象都有哪些特性。 

ECMA-262将对象定义为一组属性的无序集合。严格来说,这意味着对象就是一组没有特定顺序的值。对象的每个属性或方法都由一个名称来标识,这个名称映射到一个值。可以把ECMAScript的对象想象成一张散列表,其中的内容就是一组名/值对,值可以是数据或者函数。

一、创建Object的实例由两种方式:

第一种是使用new操作符和Object构造函数。代码如下:

let person = new Object()
person.name = 'summer'
person.age = 18
person.sayName = function() {
  console.log(this.name)
}

第二种是对象子面量表示法。代码如下:

let person = {
  name: 'summer',
  age: 18,
  sayName() {
    console.log(this.name)
  }
}

* 在使用对象子面量表示法定义对象时,并不会实际调用Object构造函数。

虽然使用哪种方式创建Object实例都可以,但在日常工作中,我们基本都是在使用对象子面量的写法。

二、属性的类型

1.数据属性

数据属性包含一个保存数据值的位置。值会从这个位置读取,也会写入到这个位置。数据属性共有4个特性描述它们的行为。

  • [[Configurable]]:表示属性是否可以通过delete删除并重新定义,是否可以修改它的特性,以及是否可以把它改为访问器属性。默认情况下,所有直接定义在对象上的属性的这个特性都是true。

  • [[Enumerable]]:表示属性是可以通过for-in循环返回。默认情况下,所有直接定义在对象上的属性的这个特性都是true。

  • [[Writable]]:表示属性的值是否可以被修改。默认情况下,所有直接定义在对象上的属性的这个特性都是true。

  • [[Value]]:包含属性实际的值。这就是前面提到的那个读取和写入属性值的位置。这个特性的默认值时undefined。

let person = {
    name: 'summer',
    age: 18,
    sayName() {
        console.log(this.name)
    }
}

delete person.name
console.log('person', person) // person { age: 18, sayName: [Function: sayName] }
let person = {
    name: 'summer',
    age: 18,
    sayName() {
        console.log(this.name)
    }
}
Object.defineProperty(person, 'name', {
    configurable: false
})
delete person.name
console.log('person', person) // person { name: 'summer', age: 18, sayName: [Function: sayName] }

// 在严格模式下
console.log('person', person)

let person = {
    name: 'summer',
    age: 18,
    sayName() {
        console.log(this.name)
    }
}
Object.defineProperty(person, 'name', {
    configurable: false
})
delete person.name
console.log('person1', person)


Object.defineProperty(person, 'name', {
    configurable: true
})
delete person.name
console.log('person2', person)

 

上面代码将configurable设置为false,从结果上我们可以看出name属性不能从对象上删除。在非严格模式下这个属性调用delete没有任何效果,严格模式下就会抛出错误。另外,一个属性被定义为不可配置之后,就不可再变回可配置的了。

在调用Object.defineProperty()时,configurable、enumerable和writable的值如果不指定,则默认都是false。

几乎所有的Vue开发者都知道Vue2的双向数据绑定就是通过Object.defineProperty()的原理实现的,也就是访问器属性。

2.访问器属性

在读取访问器属性时,会调用get函数。在写入访问器属性时,会抵用set函数并传入新值。共有4个属性描述它们的行为。

  • [[Configurable]]:表示属性是否可以通过delete删除并重新定义,是否可以修改它的特性,以及是否可以它改为数据属性。默认情况下,所有直接定义在对象上的属性的这个特性都是true。
  • [[Enumerable]]:表示属性是否可以通过for-in循环返回。默认情况下,所有直接定义在对象上的属性的这个特性都是true。
  • [[Get]]:获取函数,在读取属性时调用。默认值为undefined。
  • [[Set]]:设置函数,在写入属性时调用。默认值为undefined。
  • 访问器属性是不能直接定义的,必须使用Object.defineProperty()。

三、属性的读取

let person = {
    name: 'summer',
    age: 18,
    sayName() {
        console.log(this.name)
    }
}

console.log(person.name)// summer
console.log(person['name']) // summer

let propertyStr = 'name'
console.log(person[propertyStr]) // summer

从功能上讲,这两种存取属性的方式没有区别。使用中括号的主要优势就是可以通过变量访问属性。

通常,点语法是首选的属性存取方式,除非访问属性时必须使用变量。

参考书籍:《JavaScript高级程序设计》

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

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

相关文章

网络层IP

文章目录网络层基本概念IP报头分片和组装如何分片如何组合16位标识符13位片偏移3位标志网段划分IP地址的分类CIDRIP地址数量限制私有IP和公网IP运营商路由网络层 http和tcp只考虑了两端的问题,并没有考虑路途中的事情。路由查找 IP的构成:32位网络号主…

【Ctfer训练计划】——(八)

作者名:Demo不是emo 主页面链接:主页传送门 创作初心:舞台再大,你不上台,永远是观众,没人会关心你努不努力,摔的痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷座…

fx5u 脉冲输出指令PLSY(DPLSY)4种写法

本文描述三菱FX5U的 脉冲输出指令PLSY(DPLSY),4种写法,都有效。 第一行:设置脉冲输出频率 第二行:DPLSY D0 K0 K1,FX5U ,第二个参数是脉冲数量,设置为K0表示一值输出脉冲。 第三个参数是轴号K1,表示Y0脉冲…

2023跨年倒计时2023最炫烟花秀烟花代码

📋 前言 🖱 博客主页:在下马农的碎碎念✍ 本文由在下马农原创,首发于CSDN📆 首发时间:2022/12/30📅 最近更新时间:2022/12/30🤵 此马非凡马,房星本是星。向前…

c#入门-补码

补码 明明我们用正数用的更多,如果把0归到负数里面,那么正数就是整的2n次方了。 为什么不这么做呢? 如果你的手表快了20分钟,你可以: 1.把他调慢20分钟 2.再调快11小时40分钟 其实负数就是一个特别大的正数。CPU没有…

Unity 基于法线和深度实现完美描边,可独立控制物体描边

目录前言自定义PostProcessOutlineShader关键代码说明1 使用深度绘制描边1.1 获得斜四方形UV坐标:1.2 采样四方向深度2 使用法线绘制描边3 解决倾斜表面白块问题3.1 计算视方向3.2 使用视方向修正阈值4 单独控制物体是否显示描边OutlineShader完整代码前言 最近项目…

github上传代码(亲测实用)

又被github上传代码折腾了我3个小时,各种问题都遇到过,最后写篇博客记录一下,方便后续上传。 github创建项目完成后,就会出现上传指令,如下图所示: 现在只需要按着命令的提示一步步执行; 1.点…

一文读懂HTTPS

大家第一次接触 HTTPS 协议的时候是不是和我一样,非常困惑。 这玩意概念又多又繁琐。尤其是里面的公钥私钥啥的。 当时就特别想知道,为什么用公钥加密却不能用公钥解密? 看完这篇文章你会弄明白,同时还会解锁很多HTTPS里的细节…

ansible的安装

自定义环境 1.操作环境 角色主机名IP地址组名 控制主机 server.example.com 192.168.90.134 server 受控主机 node1.example.com 192.168.90.135 node1 受控主机 node2.example.com 192.168.90.133 node2 需要保准三台主机能够互相通信。设置同一种网络模式&#xff0…

Tic-Tac-Toe可能棋局搜索的实现(python)

目录 1. 前言 2. 算法流程 3. 代码实现 3.1 终局及胜负判定方法 3.2 搜索邻节点 3.3 打印棋盘状态 3.4 代码 4. 小结 1. 前言 Tic-Tac-Toe中文常译作井字棋,即在3 x 3的棋盘上,双方轮流落子,先将3枚棋子连成一线的一方获得胜利。Tic-…

✿✿✿JavaScript --- jQuery框架一

目 录 1.jQuery的介绍和在线学习网址以及下载网址 2.jQuery的功能和优势 3.引用jQuery库和第一个案例 4.jQuery代码格式和注释 5.jQuery如何达到获取原生的DOM对象 6.jQuery选择器(CSS对比版) (1)常见选择器 (2)高级选择器以及方法 (3)属性选择…

单片机基础知识

目录 一、单片机基本认知 二、IO口输入和输出 三、点亮一个LED 1、编程实现LED闪烁 2、按下按键点亮灯 3、按键的消抖 4、记录状态位来控制LED 一、单片机基本认知 单片机和PC电脑相比的话,相当于电脑的主板 单片机是一种集成电路芯片。单片机又称单片微控…

S32DS_Optimization优化选项

S32DS_Optimization优化选项 S32DS3.4的选项, 右击工程后出现的选项 char is signed 让char类型为有符号, 类似signed char bitfield is unsigned 当声明不使用signed/unsigned时, 控制位字段是否无符号; 默认signed(因为基本整形(int等)也是signed) Function sections 默认情…

C语言—动态内存管理和柔性数组

目录 1. C/C的内存开辟 2. 为什么存在动态内存分配 3. 动态内存函数介绍 3.1 malloc 和 free 3.2 calloc() 3.3 realloc() 4. 常见的动态内存错误 4.1 对NULL指针的解引用操作 4.2 对动态开辟的空间越界访问 4.3 对非动态内存开辟的空间进行free(&…

外贸谈判前需要注意的4p

01Past了解客户的过去 当一个客户找到我们的时候,作为业务,我们需要第一时间回复客户所问到的问题。让客户感受到,他需要的产品我们公司可以提供。于此同时,在客户沟通意愿度较高的时候,我们不妨多跟客户沟通一下几个问…

Java学习笔记 --- MySQL-索引和事务

一、索引 索引的原理 1、没有索引会全表扫描,从而查找速度会很慢 2、使用索引会形成一个索引的数据结构,比如二叉树 3、索引的代价 磁盘占用 对 dml(update、delete、insert)语句的效率影响 索引的类型 1、主键索引&#xff…

2022年圣诞节 | 用代码实现简单圣诞树

2022年圣诞节到来啦,很高兴这次我们又能一起度过~ 一、前言 本文我们用 Python 来画一棵带背景音乐效果的雪夜圣诞树以及使用 HTMLCSSJS 在页面渲染出动态圣诞树,所涉及到的源码均来自GitHub开源站点。 二、效果展示 Python HTMLCSSJS 三、编码实现 …

(六)汇编语言——包含多个段的程序

目录 使用数据 使用栈 代码 总结 使用数据 首先,我们来看一个问题,就是编程计算0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H的和,结果存在ax寄存器…

《剑指offer》每日三题

这里使用的是题库: https://leetcode.cn/problem-list/xb9nqhhg/?page1 目录剑指 Offer 07. 重建二叉树剑指 Offer 14- I. 剪绳子剑指 Offer 14- II. 剪绳子 II剑指 Offer 07. 重建二叉树 递归思想: 代码 class Solution {int pPre0;//用于遍历preorde…

深入理解HashMap

HashMap集合 1. HashMap集合简介 HashMap基于哈希表的Map接口实现,是以key-value存储形式存在,即主要用来存放键值对。hashMap的实现不是同步的,这就意味着它不是线程安全的。它的key、value都可以为null。此外,HashMap中的映射不是有序的。 JDK1.8之前…