newJavaScript中的关键字在第一次遇到时会非常混乱,因为人们倾向于认为JavaScript不是面向对象的编程语言.
在javascript中,这两者有何不同?
var arr = Array();
var arr2 = new Array();
Run Code Online (Sandbox Code Playgroud)
如果根据JS标准它们是相同的,那么是否有任何浏览器以不同方式处理这两种方式?
使用内置的JavaScript对象和构造函数,我注意到有点奇怪的东西.
有时,可以通过调用构造函数来获取新对象new.例如:
> new Array(1,2,3,4)
[1, 2, 3, 4]
> Array(1,2,3,4)
[1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)
但有时这不起作用:
> Date()
"Thu Jun 05 2014 00:28:10 GMT-0600 (CST)"
> new Date()
Date 2014-06-05T06:28:10.876Z
Run Code Online (Sandbox Code Playgroud)
是否在ECMAScript规范中的任何位置定义了非新构造函数内置函数的行为?请注意,此行为实际上很有用; 我可以通过调用来制作一个非稀疏的数组副本Array.apply(arr),但如果它是跨平台的话,我只会觉得这样做很舒服.
从这里:
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)