为什么Array().切片没有"新"工作?

rip*_*234 3 javascript

从这里:

function highest(){ 
  return makeArray(arguments).sort(function(a,b){ 
    return b - a; 
  }); 
} 

function makeArray(array){ 
  return Array().slice.call( array ); 
} 

assert(highest(1, 1, 2, 3)[0] == 3, "Get the highest value."); 
assert(highest(3, 1, 2, 3, 4, 5)[1] == 4, "Verify the results.");
Run Code Online (Sandbox Code Playgroud)

现在,为什么Array()甚至在没有new操作员的情况下返回有意义的东西 我在JS中看到的大多数"类"定义undefined如果没有调用则返回new:

function User(name) {
  this.name = name;
  this.jump = function() {
    console.log(name + " is jumping!");
  }
}

assert(typeof(User("no New")) == 'undefined');
Run Code Online (Sandbox Code Playgroud)

pim*_*vdb 6

规范明确规定如下:

Array作为函数而不是构造函数调用时,它会创建并初始化一个新Array对象.因此,函数调用Array(…)等效于new Array(…)具有相同参数的对象创建表达式.

内部如何完成取决于实现,但对于自定义构造函数,您可以使用以下技巧:

if(!(this instanceof User)) return new User(name);
Run Code Online (Sandbox Code Playgroud)

...因为new User(...)设置this为创建的User实例,而User(...)将其设置为全局对象.(所以你实际上是在最后一个片段中设置全局变量.)