我正在积极学习javascript,我发现了以下声明:
Object.prototype.toString.call([]);
Run Code Online (Sandbox Code Playgroud)
我不知道它意味着什么或它做了什么.
我有一个模糊的理解.call,因为它允许你在一个不同的对象(我认为)的上下文中调用一个方法,但我很难理解.call()函数在上面的语句中扮演的角色.所以我想知道是否有人能解释.call()这里做了什么?
谢谢!!
CMS*_*CMS 27
该call方法将this调用函数的值设置为作为第一个参数传递的对象,在您的示例中,您正在Object.prototype.toString对Array对象执行该方法.
数组对象有自己的toString方法(Array.prototype.toString)Object.prototype,如果你调用[].toString();方法Array.prototype就会调用它.
例如:
function test() {
alert(this);
}
test.call("Hello"); // alerts "Hello"
Run Code Online (Sandbox Code Playgroud)
另一个例子:
var alice = {
firstName: 'Alice',
lastName: 'Foo',
getName: function () {
return this.firstName + ' ' + this.lastName;
}
};
var bob = {
firstName: 'Bob',
lastName: 'Bar',
};
alice.getName.call(bob); // "Bob Bar"
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,我们getName在Bob的对象上使用Alice的方法,this值指向bob,因此该方法就像在第二个对象上定义一样.
现在让我们来谈谈这个Object.prototype.toString方法.JavaScript中的所有本机对象都包含一个名为this属性的内部属性,[[Class]]该属性包含一个字符串值,表示对象的规范定义分类,本机对象的可能值为:
"Object""Array""Function""Date""RegExp""String""Number""Boolean""Error"为错误的对象,如实例ReferenceError,TypeError,SyntaxError,Error,等"Math"对于全球Math对象"JSON"对于ECMAScript 5th Ed上定义的全局JSON对象.规范."Arguments"为arguments对象(也介绍了关于ES5规格)"null"(几天前在ES5勘误表中介绍)"undefined"正如我之前所说的那样,属性是内部的,没有办法改变它,规范没有提供任何操作符或内置函数来执行它,并且可以通过该方法访问其值的唯一Object.prototype.toString方法.
此方法返回由以下形式形成的字符串
"[object " + this.[[Class]] + "]"
Run Code Online (Sandbox Code Playgroud)
仅用于说明目的,因为[[Class]]无法直接访问.
例如:
Object.prototype.toString.call([]); // "[object Array]"
Object.prototype.toString.call(/foo/); // "[object RegExp]"
Object.prototype.toString.call({}); // "[object Object]"
Object.prototype.toString.call(new Date); // "[object Date]"
// etc...
Run Code Online (Sandbox Code Playgroud)
这对于以安全的方式检测对象的类型非常有用,对于检测数组对象,它是最广泛使用的技术:
function isArray(obj) {
return Object.prototype.toString.call(obj) == '[object Array]';
}
Run Code Online (Sandbox Code Playgroud)
使用instanceof运算符可能很诱人,但是如果你在跨框架环境中工作,这种方式会导致问题,因为在一个框架上创建的数组对象不会是另一个框架instanceof的Array构造函数.
上面的方法可以正常工作,因为该对象将包含其[[Class]]内部属性的值.
也可以看看:
| 归档时间: |
|
| 查看次数: |
1664 次 |
| 最近记录: |