为什么{} .toString可以检查数据类型?

时间:2013-02-27 08:50:11

标签: javascript

有人可以解释为什么这些代码可以检查数据类型吗?它们对我没有意义。我无法理解代码背后的代码。提前谢谢!

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 ) ) 

2 个答案:

答案 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方法显示其第一个参数的字符串表示。对于对象,包括调用他们的toStringvalueOf方法,以先支持的方式(section 9.8)。 Function实例(例如{}.toString引用的实例)继承了toString方法,该方法返回函数的实现相关表示(section 15.3.4.2)。

虽然没有类,但[[Class]]的ECMAScript概念与“数据类型”的概念有所不同(请参阅typeofinstanceof)。这些是使用基于原型的继承(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}}指的是您正在调用的方法内部。