在JavaScript中,对象是个无序的键值对数据集。例如:

  var xiaoqiang={
name:"wangqiang",
age:30,
city:"guangzhou",
job:"engineer"
}

上述例子中的小强是一位年轻人,对于这个对象我们用一个括号进行定义。在括号体内我们描述了这个人的几种属性:姓名、年龄、所在城市,工作等。 每一个属性对应一个值,形成了一个数据集。

对象属性的访问、添加、删除

我们可以通过点操作符访问一个对象的属性,访问小强的姓名可以用xiaoqiang.name,也可以用方括号的方式xiaoqiang["name"]的方式。还可以动态添加一个属性, 动态删除一个属性。例如:

  xiaoqiang["name"];    //返回wangqiang
xiaoqiang.name; //返回wangqiang
xiaoqiang.height; //undefined
xiaoqiang.height = 1.8 // 给xiaoqiang动态添加了一个属性
delete xiaoqiang.height;

我们还可以通过Object的静态方法defineProperty动态地给一个对象添加属性。下面的例子,我们动态地给xiaoli对象添加一个name属性:

  xiaoli = {};
Object.defineProperty(xiaoli,"name",{
value:"xiaoli",
writable:false, // 属性不能修改,
enumerable:true, // 属性可枚举,如:可以通过for ( let item of Object.entries(xiaoli)){...} 的方式枚举属性
})

对象属性的测试

通过in关键字测试对象中的属性,也可以通过Object的hasOwn方法测试对象属性。一个对象的属性包括自有属性和继承来的属性。

  "name" in xiaoqiang;    //true;
"toString" in xiaoqiang; //true 通过object对象继承的属性
xiaoqiang.hasOwnProperty("age") //true age是xiaoqiang自己的属性
xiaoqiang.hasOwnProperty("toString")//false 通过继承自object的属性,不算自己的属性
Object.hasOwn(xiaoqiang,"age"); //true Object的静态方法判断是否是自己的属性
Object.hasOwn(xiaoqiang,"toString"); //false
Object.getOwnPropertyNames(person); //获取所有自身的属性名称

特殊情况

在定义一个对象时,对象属性的键是字符串类型,一般情况下可以省略单引号或双引号。如果键中包含特殊的字符,那就必须带上双引号或单引号,例如:

  var xiaoqiang={
name:"wangqiang",
age:30,
city:"guangzhou",
job:"engineer",
"company-address":"tianhe district,guangzhou" // company-address要加引号
}
xiaoqiang["company-address"]

上述对象xiaoqiang的company-address属性带有特殊的符号,所以定义的时候需用引号包裹起来,在进行属性访问的时候需用方括号

对象属性以及值的遍历

使用Object的entries方法,然后进行遍历

  var xiaoqiang={
name:"wangqiang",
age:30,
city:"guangzhou",
job:"engineer",
"company-address":"tianhe district,guangzhou" // company-address要加引号
}
//对象属性的遍历。
for (let item of Object.entries(xiaoqiang)){
console.log(item[0],item[1]);
}

使用Object的keys方法和values方法,然后进行遍历

  var xiaoqiang={
name:"wangqiang",
age:30,
city:"guangzhou",
job:"engineer",
"company-address":"tianhe district,guangzhou" // company-address要加引号
}
//对象键的遍历。
for (let item of Object.keys(xiaoqiang)){
console.log(item);
}
//对象值的遍历。
for (let item of Object.values(xiaoqiang)){
console.log(item);
}

对象的冻结、密封、不可扩展

冻结对象:一个冻结对象是指已经不能添加新属性、删除现有属性或修改已有属性的值的对象。使用 Object.freeze() 方法可以将对象转换为冻结对象。

  var lihong={};
lihong.name="lihong";
lihong.age=20;
Object.freeze(lihong);
lihong.height = 171; //height属性添加不成功
delete lihong.age; //age属性删除不成功
lihong.name = "Lihong"; //age属性修改不成功

密封对象:一个密封对象是指已经不能添加新属性和删除现有属性的对象,但是可以修改已有属性的值。使用 Object.seal() 方法可以将对象转换为密封对象。

  var lihong={};
lihong.name="lihong";
lihong.age=20;
Object.seal(lihong);
lihong.height = 171; //height属性添加不成功
delete lihong.age; //age属性删除不成功
lihong.name = "Lihong"; //name属性可修改的

不可扩展对象:一个不可扩展对象是指已经不能添加新属性的对象,但是可以修改现有属性的值或删除现有属性。使用 Object.preventExtensions() 方法可以将对象转换为不可扩展对象。

  var lihong={};
lihong.name="lihong";
lihong.age=20;
Object.preventExtensions(lihong);
lihong.height = 171; //height属性添加不成功
delete lihong.age; //age属性是可删除的
lihong.name = "Lihong"; //name属性是可修改的

文章同时发表在:码农编程网 欢迎访问

本节重点

  • 对象是一个无序键值对的数据集;
  • 对象的属性必须是字符串、如包含特殊的字符引号包裹起来;
  • 对象属性的添加、测试、对象属性和值的遍历;
  • 冻结对象、密封对象、不可扩展对象。

深入了解Js中的对象的更多相关文章

  1. js中判断对象具体类型

    大家可能知道js中判断对象类型可以用typeof来判断.看下面的情况 <script> alert(typeof 1);//number alert(typeof "2" ...

  2. 浅解析js中的对象

    浅解析js中的对象 原文网址:http://www.cnblogs.com/foodoir/p/5971686.html,转载请注明出处. 前面的话: 说到对象,我首先想到的是每到过年过节见长辈的时候 ...

  3. js中XMLHttpRequest对象实现GET、POST异步传输

    js中XMLHttpRequest对象实现GET.POST异步传输 /* * 统一XHR接口 */ function createXHR() { // IE7+,Firefox, Opera, Chr ...

  4. JavaScript学习12 JS中定义对象的几种方式

    JavaScript学习12 JS中定义对象的几种方式 JavaScript中没有类的概念,只有对象. 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工 ...

  5. js中推断对象详细类型

    大家可能知道js中推断对象类型能够用typeof来推断. 看以下的情况 <script> alert(typeof 1);//number alert(typeof "2&quo ...

  6. JavaScript学习12 JS中定义对象的几种方式【转】

    avaScript学习12 JS中定义对象的几种方式 转自:  http://www.cnblogs.com/mengdd/p/3697255.html JavaScript中没有类的概念,只有对象. ...

  7. JS中有关对象的继承以及实例化、浅拷贝深拷贝的奥秘

    一.属性的归属问题 JS对象中定义的属性和方法如果不是挂在原型链上的方法和属性(直接通过如类似x的方式进行定义)都只是在该对象上,对原型链上的没有影响.对于所有实例共用的方法可直接定义在原型链上这样实 ...

  8. JS中定义对象和集合

    在js中定义对象: 方式一: var obj = {}; obj['a']=1; obj['b']=2; 方式二: var obj=new Object(); obj.a=1; obj.b=2; 在j ...

  9. Js中Map对象的使用

    Js中Map对象的使用 1.定义 键/值对的集合. 2.语法 mapObj = new Map() 3.备注 集合中的键和值可以是任何类型.如果使用现有密钥向集合添加值,则新值会替换旧值. 4.属性 ...

  10. JS中的对象和方法简单剖析

    众所周知,在js中对象就是精髓,不理解对象就是不理解js. 那么什么事js中的对象呢? 在js中,几乎一切皆对象: Boolean ,String,Number可以是对象(或者说原生数据被认作对象): ...

随机推荐

  1. .Net7 GC标记阶段代码的改变

    前言 由于业务需求,在探究.Net7的CLR,发现了一个不通的地方,也就是通过GCInfo获取到了对象之后.它并没有在GcScanRoots(对象扫描标记)里面对它进行标记,那么如果没有标记这个对象如 ...

  2. 谷歌浏览器配置Selenium,并配合python使用

    python环境准备 python 需要安装selenium ,这个直接pip安装即可 pip install selenium -i http://pypi.douban.com/simple -- ...

  3. 最新版本 Stable Diffusion 开源 AI 绘画工具之汉化篇

    目录 汉化预览 下载汉化插件一 下载汉化插件二 下载汉化插件三 开启汉化 汉化预览 在上一篇文章中,我们安装好了 Stable Diffusion 开源 AI 绘画工具 但是整个页面都是英文版的,对于 ...

  4. 关于Cookie要懂的知识

    ☞演示 什么是Cookie? http是一个无状态协议,它不对之前发生过的请求和响应的状态进行管理.这样就可能导致,我们登陆一个网站后,每次跳转新页面,之前的登陆状态都不能被记住,要重新登陆等问题. ...

  5. C++中va_list, va_start, va_arg, va_end的基本用法

    关于va_list, va_start, va_arg, va_end 由于在C语言中没有函数重载,解决不定数目函数参数问题变得比较麻烦,即使采用C++,如果参数个数不能确定,也很难采用函数重载.对这 ...

  6. 开源Apinto网关-流量策略

    背景介绍 Apinto是一款高性能.可扩展.易维护的API网关. Apinto网关基于GO语言模块化开发,5分钟极速部署,配置简单.易于维护,支持集群与动态扩容,企业级开箱即用.Apinto除了提供丰 ...

  7. 6.Get和Post

    1.概述 URL是一个资源描述符,一个URL用于描述一个网上资源 Get用于获取/查询资源信息,Post用于更新资源信息 2.联系和区别 2.1.Get后退刷新无害,Post需要重新提交: 2.2.G ...

  8. 第一章 static、单例与继承

    目录 面向对象 一.static关键字 1.static修饰成员变量 2.static修饰成员变量内存中执行原理 3.成员方法的执行原理 4.工具类 5.静态关键字注意事项 6.代码块 java静态代 ...

  9. openGauss Datakit安装部署

    一.问题描述:目前找不到任何关于opengauuss Datakit安装部署的文档,自己来尝试踩坑. DataKit是一个以资源(物理机,数据库)为底座的开发运维工具,将上层的开发运维工具插件化,各插 ...

  10. SQL server数据库拼接语句(STUFF)用法

    我对SQLserver 中STUFF函数的理解是在sql server中将字符串中的第一个字符串某一部分字符替换成另外一部分,组成新的字符串数据. STUFF(character_expression ...