JavaScript中对象和纯对象的区别是什么?

18

在JavaScript中,我不理解对象和纯对象之间的区别。

我知道什么是Object,但不理解什么是纯对象。我搜索了这个问题,但还是不明白。

根据我的理解,普通对象长得像下面这样

const object = {};

在JavaScript中,我们将函数称为对象

function test() {

}

但是什么是纯对象?它与普通对象有何不同。谢谢。

编辑:

看到下面的错误后,我的困惑始于对纯对象的理解。因此,我的问题是要了解JavaScript中纯对象的概念。

动作必须是纯对象。使用自定义中间件进行异步操作。


4
在Javascript中,没有所谓的“普通对象”。你从哪里听说过“普通对象”这个术语?你所写的被称为“对象字面量”。请在Javascript规范中展示“普通对象”这个术语的使用。 - mpm
1
@Think-Twice 看起来你正在使用redux。在redux中,如果没有任何额外的中间件,操作数据必须是一个普通对象。看起来你返回了一个函数,这需要thunk中间件来处理。默认情况下,redux只寻找一个对象 - thunk中间件添加了额外的功能,可以调用函数。 - Ryan
@Ryan,这就是我卡住的地方。thunk 期望的纯对象是什么?我希望 thunk 必须使用 JavaScript 纯对象的概念? - Hemadri Dasari
@Think-Twice thunk中间件不需要一个普通对象。普通的redux只允许普通的对象,而thunk为函数作为返回类型提供了支持。如果你打算只返回普通对象,那么不需要thunk。如果你打算返回一个函数,你就需要使用thunk。thunk中间件对于基于dispatch的流程非常有用。因为你甚至不知道JS的基本原理,比如对象和函数,我建议在没有使用redux的情况下尝试学习react。现在只使用组件本地状态-删除REDUX。 - Ryan
显示剩余2条评论
7个回答

24

我认为你想表达的是 普通的 JavaScript 对象,也就是 plain object。

在原生 JavaScript 中,POJO(Plain Old JavaScript Object)是最简单的对象类型:它是由一组键值对构成的,可以使用 {} 对象字面量表示法或者使用 new Object() 构造函数创建。

普通的 JavaScript 对象:

可以使用方括号语法糖来表示对象字面量:

var obj = {};

使用 Object() 构造函数:

var obj = new Object();

除普通对象之外的内容:

使用函数构造器:

var Obj = function(name) {
  this.name = name;
}
var c = new Obj("hello"); 

使用 ES6 类语法:

class myObject  {
  constructor(name) {
    this.name = name;
  }
}
var e = new myObject("hello");

13

简单对象(POJO - Plain Old JavaScript Object)

var plainObj1 = {}; // typeof plainObj1 --> Object
var plainObj2 = {name : "myName"}; // typeof plainObj2 --> Object
var plainObj3 = new Object(); // typeof plainObj3 --> Object

非普通对象

var Person = function(){}; //class
var nonPlainObj = new Person(); // typeof nonPlainObj --> function

你好,在“非纯对象”示例中,第一行“var Person = function(){}; //class”中的“class”是什么意思?请详细说明为什么要在那里写它?谢谢。 - Viktor Borítás
1
var nonPlainObj = new Person(); 这是错误的:typeof nonPlainObj → 'object'。应该是 typoef Person 是一个 function - WoodrowShigeru

6

使用字面量或new Object创建的对象被称为纯粹对象。例如:

let a = {aaa : 1}

let b = new Object()

使用函数创建的对象不是纯粹的对象(plain object)

let C = function(){}

let d = new C()

2
你在谈论对象字面量,它是一个文字对象,即 {} 。就像数组字面量使用[]而不是new Array()。这是原型为Object的对象。字符串也是一个对象,但它的原型链看起来像:String -> Object。数组是Array -> Object。它们都是对象。
对象字面量的原型只是一个Object。

2
使用对象文字表示法创建的任何对象在 JavaScript 中被称为纯对象。
function Animal(){
//Some codes
}
var obj = new Animal();

1

在你的问题中,你提到你认为对象字面量和函数都是“对象”。在JS中,函数是一种类型,对象也是一种类型。所以你原来的问题,这两个项目都不是对象...

enter image description here


-2

普通对象(键值对集合,包装在 { } 中)非常适合存储简单数据集。

var lunch={
    sandwich:'furkey',
    drink:'soda',
    chips:true
}

就像在React Redux中,actions是以键/值对的形式编写的。

希望你能理解。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接