{}和Object之间有什么区别?

时间:2018-01-11 07:20:39

标签: javascript flowtype

最近,我对{}Object之间的区别感到困惑。有时,{}会解决我的问题,有时候,它无法解决我的问题,而我会使用Object切换。我真的不知道为什么。

我做了一些测试,希望它可以给你一些提示。

const t: Array<{label: string}> = [{label:'1'}];
const arr: Array<{}> = t; //error
const arr2: Array<Object> = t; //pass

4 个答案:

答案 0 :(得分:2)

{}new Object()的别名。

因此,您可以说Objectclass{}是该类的instance

你可以在这里看到:

console.log(JSON.stringify(new Object()) == JSON.stringify({}))

console.log({} instanceof Object)

答案 1 :(得分:2)

我认为这个答案更合理Github link:[mixed type] Supertype bug

  

数组在Flow

中是不变的
class A {}
class B extends A {}
var bs: Array<B> = [];
var as: Array<A> = bs;
as.push(new A); // this would be bad!
  

如果Array<B>Array<A>的超类型,我断言A应该是A的子类型,   不是

Object是个例外,

  

Object类型是所有对象的supertypesubtype。这意味着Object不是本机/内置对象类型的严格等价物,但更类似于any

@Tushar Acharekar和@Ayush Gupta,谢谢你的回答。

答案 2 :(得分:0)

我没有使用Flow,但我在这里尝试了您的代码:https://flow.org/try/,我收到此消息:Type argument 'T' is incompatible。然后它添加变量Property 'label' is incompatibleProperty not found

我猜是因为tSealed Objects的数组,但arrUnsealed Objects的数组。

现在,当您将t分配给arr2时,它会起作用,因为arr2只是(普通Javascript)对象的数组。您也可以将一个未密封的对象数组分配给arr2。或者推送到arr2混合密封和未密封的物体。

请注意这些通行证:

const t: Array<{label: string}> = [{label:'1'}];
const t1: {label: string} = {label: `1`};
const w: Array<{label: string}> = [t1];
const t2: {label: string} = {label: `2`};
w.push(t2);

但这传递:

let w: Array<{label: string}> = [];
const t3: {} = {};
w.push(t3);

但这些将通过:

const u: Array<Object> = [{label:'1'}];
const arr: Array<{}> = u;   

const v: Array<{}> = [{label:'1'}];
const arr2: Array<Object> = v;  

const t3: {foo: number} = {foo:1};
arr2.push(t3);

答案 3 :(得分:0)

对象是属性的集合,属性是名称(或键)与值之间的关联。属性的值可以是函数,在这种情况下,属性称为方法。

  • 我希望在生成{} paire数据的情况下使用key:value
  • 我更喜欢使用new Object()来创建像Method1, Method2
  • 这样的复杂对象

请参阅以下示例

var d = new Object();           //This is the simplest way to create an empty object.
var a = Object.create(null);    //This method creates a new object extending the prototype object passed as a parameter.
var b = {};                     //This is equivalent to Object.create(null) method, using a null prototype as an argument.

方法1:

var Animal = {
  type: 'Invertebrates',  // Default value of properties
  displayType: function() {  // Method which will display type of Animal
    console.log(this.type);
  }
};
var animalObject = Object.create(Animal);
animalObject.displayType();         // Output:Invertebrates
var fish = Object.create(Animal);
fish.type = 'Fishes';
fish.displayType();                 // Output:Fishes

方法2:

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

Dicoverign Javascript是了解javascript prototype

的最佳视频