gpt4 book ai didi

javascript - 这条 Javascript 语句中的 .call() 函数在做什么?

转载 作者:可可西里 更新时间:2023-11-01 01:58:02 25 4
gpt4 key购买 nike

我正在积极学习 javascript,我遇到了以下语句:

Object.prototype.toString.call([]); 

而且我不知道它的含义或作用。

我对 .call 有一个模糊的理解,因为它允许你在不同对象的上下文中调用一个方法(我认为),但我很难理解它的作用.call() 函数在上面的语句中播放。所以我想知道是否有人可以解释 .call() 在这里做什么?

谢谢!!

最佳答案

call 方法将调用函数的 this 值设置为作为第一个参数传递的对象,在您的示例中,您正在执行 Object.prototype .toString Array 对象上的方法。

数组对象,有它们自己的 toString 方法 (Array.prototype.toString),如果你调用 [].toString(); 将调用 Array.prototype 上的方法。

例如:

function test() {
alert(this);
}
test.call("Hello"); // alerts "Hello"

另一个例子:

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"

在上面的例子中,我们在Bob的对象上使用Alice的getName方法,this的值指向bob,所以方法就像它是在第二个对象上定义的一样工作。

现在我们来谈谈Object.prototype.toString 方法。 JavaScript 中的所有 native 对象都包含一个名为 [[Class]]内部属性,此属性包含一个字符串值,表示规范定义的分类对象,native 对象的可能值为:

  • “对象”
  • “数组”
  • “函数”
  • “日期”
  • “正则表达式”
  • “字符串”
  • “数字”
  • “ bool ”
  • "Error" 用于错误对象,例如 ReferenceErrorTypeErrorSyntaxError错误
  • "Math" 用于全局 Math 对象
  • "JSON" 用于在 ECMAScript 5th Ed 上定义的全局 JSON 对象。规范。
  • "Arguments" 用于 arguments 对象(也在 ES5 规范中引入。)
  • “null”(几天前在 ES5 errata 中引入)
  • “未定义”

正如我之前所说,该属性是内部,无法更改它,规范不提供任何运算符或内置函数来执行此操作,唯一您可以访问其值的方法是通过 Object.prototype.toString 方法。

此方法返回由以下内容组成的字符串:

"[object " + this.[[Class]] + "]"

仅用于说明目的,因为无法直接访问 [[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...

这对于以安全的方式检测对象的种类非常有用,对于检测数组对象,它是使用最广泛的技术:

function isArray(obj) {
return Object.prototype.toString.call(obj) == '[object Array]';
}

使用 instanceof 运算符可能很诱人,但如果您在跨框架 环境中工作,这种方式会导致问题,因为一个数组对象创建在一个frame, 不会是另一个的 instanceofArray 构造函数。

上述方法将毫无问题地工作,因为该对象将完整地包含其[[Class]] 内部属性的值。

另见:

关于javascript - 这条 Javascript 语句中的 .call() 函数在做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3250379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com