Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么Array().slice不带;新";工作_Javascript - Fatal编程技术网

Javascript 为什么Array().slice不带;新";工作

Javascript 为什么Array().slice不带;新";工作,javascript,Javascript,: 现在,为什么Array()甚至返回有意义的内容,而没有新的操作符?我在JS中看到的大多数“类”定义如果在没有new的情况下调用,则返回undefined: function User(name) { this.name = name; this.jump = function() { console.log(name + " is jumping!"); } } assert(typeof(User("no New")) == 'undefined'); 《公约》明确

:

现在,为什么
Array()
甚至返回有意义的内容,而没有
新的
操作符?我在JS中看到的大多数“类”定义如果在没有
new
的情况下调用,则返回
undefined

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

assert(typeof(User("no New")) == 'undefined');
《公约》明确规定:

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

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

if(!(this instanceof User)) return new User(name);

。。。因为
newuser(…)
this
设置为创建的
User
实例,而
User(…)
将其设置为全局对象。(因此,您实际上在上一个代码片段中设置了全局变量。)

基于Chrome的调试面板,
Array()
以与new
Array()
[]
相同的方式返回新数组。我的猜测是,它要么是为了语言的易用性,要么是与
[]
语法相关(当然不需要新的语法)

实际上,使用您自己的函数可以选择需要新的:

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

​

然后用户('blah')和新用户('blah')都起作用。

与其说是“为什么.slice()起作用?”不如说是“为什么
Array()
似乎做了与
newarray()
相同的事情?”——答案可以总结为“因为规范这么说”。请参阅。@nnnnnn-赞成,表决通过以dup结束,谢谢。
function User(name) {
    if (!(this instanceof User)) {
        return new User(name);
    }
    this.name = name;
    this.jump = function() {
        console.log(name + " is jumping!");
    };
}

​