当我这样做时:
var person = new Object();
person.name = "alex";
console.log(person)
输出是:
Object { name="alex"}
但是,请说我放弃“新”字并执行:
var person = Object();
person.name = "alex";
console.log(person)
输出也是:
Object { name="alex"}
为什么?
答案 0 :(得分:4)
因为一些内置函数被定义为以这种方式运行。例如,请参阅ES5 15.2.1.1 for Object
:
15.2.1.1 Object ( [ value ] )
如果调用
Object
函数时没有参数或使用一个参数 value ,则执行以下步骤:
- 如果 value 是
null
,undefined
或未提供,则创建并返回一个新的Object对象,就像调用标准的内置Object构造函数一样相同的论点(15.2.2.1)。- 返回
醇>ToObject(value)
。
他们会测试是否已使用new
调用它们,如果不是,则表示已使用new
调用它们。
并非所有构造函数都像这样工作。例如,Date
在没有new
的情况下调用时会返回一个字符串。
您可以自己实现:
function Foo() {
if(!(this instanceof Foo)) {
return new Foo();
}
// do other init stuff
}
Foo()
和new Foo()
的行为方式相同(尽管变量参数变得更加棘手)。
答案 1 :(得分:0)
由于您的示例是内置函数的对象类型,如上所示,它与该类型相同,因此对于大多数其他内置函数(例如Number()),它的工作方式也不相同。是否使用'new'关键字调用它们时应非常小心。因为默认情况下,带有函数构造函数的'new'关键字返回一个对象,而不是直接返回原始类型。因此,例如,您无法检查两个变量的严格相等性,即其中一个变量是使用new Number()
声明和分配的,而另一个变量是Number()
一个例子是:
var num1 = Number(26);
var num2 = new Number(26);
num1 == num2; // returns true
num1 === num2; // returns false
您可以在控制台日志中查看差异:
console.log(num1);
> 26
console.log(num2);
> Number {26}
> __proto__: Number
> [[PrimitiveValue]]: 26