有人可以解释为什么这些代码可以检查数据类型吗?它们对我没有意义。我无法理解代码背后的代码。提前谢谢!
var toClass = {}.toString // {} is for what? toString is a method?
alert(toClass); // alert it I get a function? = > function toString() {[native code]}
alert( toClass.call( [1,2] ) )
alert( toClass.call( new Date ) )
答案 0 :(得分:5)
var toClass = {}.toString;
相当于
var toClass = Object.prototype.toString;
,因为
{}
作为表达式(Object
初始化)等同于
new Object()
其中Object
是“具有该名称的标准内置构造函数”(ECMAScript Language Specification, 5.1 Edition, section 11.1.5;以及早期版本)。
因此{}
代表对新Object
实例的引用。默认情况下,Object
个实例从Object.prototype
最初由原型链(section 15.2.5)引用的对象继承属性,包括内置属性Object.prototype.toString
。属性值最初是对Function
实例的引用,即属性是您可以调用的方法(section 15.2.4.2)。
alert
实际上是window.alert
(应该这样写)。 window
是ECMAScript全局对象的属性;该属性引用的对象是范围链中具有alert
方法的主机对象。这些都没有在ECMAScript中指定,但它们是provided by some host environments(通常是浏览器),如规范所允许的那样(section 15.1)。
因为它旨在显示警报消息,所以alert
host方法显示其第一个参数的字符串表示。对于对象,包括调用他们的toString
或valueOf
方法,以先支持的方式(section 9.8)。 Function
实例(例如{}.toString
引用的实例)继承了toString
方法,该方法返回函数的实现相关表示(section 15.3.4.2)。
虽然没有类,但[[Class]]
的ECMAScript概念与“数据类型”的概念有所不同(请参阅typeof
和instanceof
)。这些是使用基于原型的继承(section 4.2.1)的语言。
答案 1 :(得分:1)
这相当于:
Object.prototype.toString.call([1, 2]);
Object.prototype.toString.call(new Date);
此处,Object.prototype.toString
是默认情况下所有对象都继承的默认toString
方法。调用时,它会输出如下内容:
[object XXX]
{}.toString
与此类似,因为{}
是new Object()
的缩写。
派生对象可以自由地覆盖toString
方法以满足他们的需要,例如:
> [1, 2].toString()
"1,2"
> (new Date).toString()
"Wed Feb 27 2013 17:03:42 GMT+0800 (Malay Peninsula Standard Time)"
但是,您仍然可以在.call()
或Object.prototype.toString
上使用{}.toString
来使用“原始”方法,其中.call()
的第一个参数用于定义{ {1}}指的是您正在调用的方法内部。