最近,我对{}
和Object
之间的区别感到困惑。有时,{}
会解决我的问题,有时候,它无法解决我的问题,而我会使用Object
切换。我真的不知道为什么。
我做了一些测试,希望它可以给你一些提示。
const t: Array<{label: string}> = [{label:'1'}];
const arr: Array<{}> = t; //error
const arr2: Array<Object> = t; //pass
答案 0 :(得分:2)
{}
是new Object()
的别名。
因此,您可以说Object
是class
而{}
是该类的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
类型是所有对象的supertype
和subtype
。这意味着Object
不是本机/内置对象类型的严格等价物,但更类似于any
。
@Tushar Acharekar和@Ayush Gupta,谢谢你的回答。
答案 2 :(得分:0)
我没有使用Flow,但我在这里尝试了您的代码:https://flow.org/try/,我收到此消息:Type argument 'T' is incompatible
。然后它添加变量Property 'label' is incompatible
和Property not found
。
我猜是因为t
是Sealed Objects的数组,但arr
是Unsealed 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