[JS]《你不知道的Javascript·上》——对象

news/2025/5/21 3:58:46

对象的定义语法

声明形式

var myObj={key:value,...
}

构造形式

var myObj=new Object();
myObj.key=value;

JS的六种主要类型

  • string
  • number
  • boolean
  • null
  • undefined
  • object

内置对象(对象子类型)

  • String
  • Number
  • Boolean
  • Object
  • Function
  • Array
  • Date
  • RegExp
  • Error

内容

var myObj={a:2
};myObj.a;//2——属性访问myObj["a"];//2——键访问

可计算属性名

可以在文字形式中使用[ ]包裹一个表达式来当作属性名。

属性与方法

从技术角度来说,函数永远不会“属于”一个对象,所以把对象内部引用的函数称为“方法”是不妥的。

数组

数组期待的是数值下标。最好只用对象来存储键/值对,只用数组来存储数值下标/值对。
如果试图向数组添加一个属性,但是属性名“看起来”像一个数组,那么它会变成一个数值下标(因此会修改数组的内容而不是添加一个属性)。

复制对象——浅复制

var newObj=Object.assign( {},myObject );
Object.assign方法的第一个参数是目标对象,之后还可以跟一个或多个源对象。它会遍历一个或多个源对象的所有可枚举的自有键,并把它们复制(使用=操作符赋值)到目标对象,最后返回目标对象。

属性描述符

var myObj={a:2};Object.getOwnPropertyDescriptor(myObj,"a");
/*{value:2,writable:true,enumerable:true,configurable:true
}*/

普通的对象属性对应的属性描述符除了key:value,还包含另外三个特性:writable(可写)、enumerable(可枚举)、configurable(可配置,将其修改为false是单向操作,无法撤消)。

可以使用Object.defineProperty(...)来添加一个新属性或者修改一个已有属性(如果它是configurable)并对特性进行设置。

不变性

  1. 对象常量:结合writable:false和configurable:false就可以创建一个真正的常量属性。
  2. 禁止拓展:Object.preventExtensions(...)
  3. 密封:Object.seal(...)会创建一个密封的对象,实际上是在一个现有对象上调用Object.preventExtensions(...)并把所有现有属性标记为configurable:false。所以密封之后不仅不能添加新属性,也不能重新配置或者删除任何现有属性(虽然可以修改属性的值)。
  4. 冻结:Object.freeze(...)会创建一个冻结对象,实际上是在现有对象调用Object.seal(...)并设置为writable:false,这样就无法修改它们的值。这是应用在对象上的级别最高的不可变性。

[[GET]]

对象默认的内置[[GET]]操作首先在对象中查找是否有名称相同的属性,如果找到就会返回这个属性的值。如果无论如何都没有找到名称相同的属性,那[[GET]]操作会返回值undefined。需要注意的是,这种方法和访问变量时是不一样的。如果你引用了一个当前词法作用域中不存在的变量,并不会像对象属性一样返回undefined,而是会派出一个ReferenceError异常。

[[PUT]]

Getter和Setter

通常来说getter和setter是成对出现的。

存在性

var myObj={a:2
};("a" in myObj);//true
("b" in myObj);//falsemyObj.hasOwnProperty("a");//true
myObj.hasOwnProperty("b");//false

in操作符会检查属性是否在对象及其[[Prototype]]原型链中。hasOwnProperty(...)只会检查属性是否在myObj中,不会检查[[Prototype]]。

*:in实际上检查的是某个属性名是否存在。对于数组来说这个区别非常重要,4 in [2,4,6]的结果并不是你的期待的true,因为[2,4,6]这个数组中包含的属性名是0、1、2,没有4。

  • 枚举
propertyIsEnumerable(...)//会检查给定的属性名是否直接存在于对象中
Object.keys(...)//会返回一个数组,包含所有可枚举属性
Object.getOwnpropertyNames(...)//会返回一个数组,包含所有属性,无论是否可枚举

遍历

forEach(...)//会遍历数组中的所有值并忽略回调函数的返回值
every(...)//会一直运行直到回调函数返回false
some(...)//会一直运行直到回调函数返回true

for...of

var myArray=[1,2,3];for(var v of myArray){console.log(v);
}
//1
//2
//3

自定义迭代器

var myObj={a:2,b:3
};Object.defineProperty(myObj,Symbol.iterator,{enumerable:false,writable:flse,configurable:true,value:function(){var o=this;var idx=0;var ks=Object.keys(o);return{next:function(){return{value:o[ks[idx++]],done:(idx>ks.length)};}};}
});//手动遍历myObj
var it=myObj[Sysbol.iterator]();
it.next();//{value :2,done:false}
it.next();//{value :3,done:false}
it.next();//{value :undefined,done:true}//用for...of遍历myObj
for (var v of myObj){console.log(v);
;//2
//3
文章来源:https://blog.csdn.net/weixin_34138255/article/details/88772340
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://dhexx.cn/news/show-1633905.html

相关文章

大数据系列(1)——Hadoop集群坏境搭建配置

前言 关于时下最热的技术潮流,无疑大数据是首当其中最热的一个技术点,关于大数据的概念和方法论铺天盖地的到处宣扬,但其实很多公司或者技术人员也不能详细的讲解其真正的含义或者就没找到能被落地实施的可行性方案,更有很多数据相…

与上司意见不合时,妥协还是反驳?

人在职场,总会碰到与上司意见不合时,通过哪些技巧可以让上司较容易地接受下属提出的反对意见呢? 1. 不要全盘否绝 不要全盘否决上司的方案。首先,人都有自恋情结,上司对于自己提出的方案一定觉得很是完美&#xff0…

Java面试题目!Java学习路线和方法推荐

我们写程序的都知道一个公式叫做 “程序设计 算法 数据结构”。我们想让我们的网站的地盘更加牢固的话,我觉得数据结构与算法还是很有必要学习的。所以第三步,我推荐可以适当花时间看一下 数据结构与算法 但是,同样不做强求!你抽…

【转】C++ const 关键字总结

const是一个C语言的限定符,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性。另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。 1. 修饰常量 用const修饰的变…

openwrt 分区

下面以ar9344 16M flash为例子: uboot启动时传递给内核的参数为: bootargsconsolettyS0,115200 root31:02 rootfstypejffs2 init/sbin/init mtdpartsath-nor0:256k(u-boot),64k(u-boot-env),14528k(rootfs),1408k(uImage),64k(mib0),64k(ART) 其中我们要…

Java 中 HashMap 底层数据结构

点击上方“Java基基”,选择“设为星标”做积极的人,而不是积极废人!源码精品专栏 原创 | Java 2020 超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析数据库…

ThreadLocal系列(一)-ThreadLocal的使用及原理解析

ThreadLocal系列之ThreadLocal(源码基于java8) 项目中我们如果想要某个对象在程序运行中的任意位置获取到,就需要借助ThreadLocal来实现,这个对象称作线程的本地变量,下面就介绍下ThreadLocal是如何做到线程内本地变量…

面试,这些问题一定要问清楚!

现如今,找一份工作实属不易,尤其是刚毕业的大学生,他们在求职之初就更不敢多与企业谈条件了。为了得到工作机会,部分大学生最初与企业面谈的时候,不敢多提要求,往往是企业方一锤定音;可是一旦入…

Java面试题目!基于基于jsp

管理员功能: 系统登录,首页,。。 新增管理员,管理员信息列表,网站用户信息列表,。。 新增公告信息,公告信息查询,。。 美容项目类型信息查询,城市列表,操作。。 美容院信息列表,美容项目信息查询,。 订单信息查询,美容项目评价信息列表等功能。。。。 用户角色…

WMI-Win32_CDROMDrive 光驱参数

为什么80%的码农都做不了架构师?>>> Availability --设备状态信息 Capabilities --媒体访问设备的阵列能力。例如,该装置可支持的随机存取(3),可移动介质(7),和自动清洗…