在这个Javascript语句中执行的.call()函数是什么?

Ale*_*lex 12 javascript

我正在积极学习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运算符可能很诱人,但是如果你在跨框架环境中工作,这种方式会导致问题,因为在一个框架上创建的数组对象不会是另一个框架instanceofArray构造函数.

上面的方法可以正常工作,因为该对象将包含其[[Class]]内部属性的值.

也可以看看: