你可能需要知道的前端小知识——JavaScript的对象类型

275 阅读2分钟
  • 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

  • 之前更新了JavaScript的类型,关于JavaScript的对象类型介绍的比较简单,本文详细的写一下我理解的JavaScript的对象类型。

对象类型(The Object Type)

  • 对象就是属性的集合,属性分为数据属性和访问器属性。
  • 对象是属性的索引结构。

数据属性

  • 属性描述使用的都是JavaScript的基本数据类型。
  • 数据属性
    • value:属性的值
    • writeable:属性能否被复制
    • enumerable:属性能否使用for in枚举
    • configurable:属性能否被修改
  • 通常用于定义的属性的代码会产生这些数据属性,通常writeableenumerableconfigurable默认为true,可以通过内置函数Object.getOwnPropertyDescripter查看。

访问器属性

  • 比如常见的:getter和setter
  • 访问器属性
    • getter:函数或undefined,在取属性值的时候被调用
    • setter:函数或undefined,在设置属性值时被调用
    • enumerable:属性能否被for in枚举
    • configurable:属性能否被修改
  • 访问器属性是属性在读写时候执行的代码,在读写同一属性的时候,可以得到不同的值。
  • 如果要改变属性的值或者定义访问属性,可以通过OBject.defineProperty实现

对象类型中的NumberStringBoolean

  • 日常在使用时会混用,不过3new Number(3)是完全不同的值。
  • 构造器是两用的。在使用new调用时,会生成对象。当直接调用时,会强制类型转换。

对象之间的比较

let a = {t:1}; let b = {t:1}; a===b //false

  • 即使完全相同的两个对象,也并非同一个对象。
    • 原因在于:对象的唯一表示是内存地址,所以,就算是属性都一样的对象,因为内存地址不同,所以不是不是同一个对象。

JavaScript的对象和其他语言对象的对比

  • c++(这里仅指c++本身,不牵扯c语言)
    • c++的对象有成员变量和成员函数
  • Java
    • Java对象有属性和方法
  • 所以对象有状态和行为(行为可能引起状态的变化)。
  • JavaScript对象不区分状态和行为,把状态和行为都抽象为“属性”(property)。因为这种抽象,JavaScript的对象有更多自己的特点。
    • 可以在运行时为对象添加/修改状态和行为

讨论:关于类和原型

  • 在有了class语法后,不需要再模拟类,但是原型体系仍然存在于JavaScript中。
  • 是否仍然有必要理解/了解原型?在有类之后,原型在JavaScript中是怎样的存在?

总结

  • JavaScript的对象基本上就这些内容了,对于对象,有更多的不同的看法,欢迎留言讨论。