首页 > 解决方案 > javascript中Object(this)的目的是什么?

问题描述

研究MDN web docs上写的find方法的polyfill,有一段我没有关注,让我分享代码

if (!Array.prototype.find) {
  Object.defineProperty(Array.prototype, 'find', {
    value: function(predicate) {
      if (this == null) {
        throw TypeError('"this" is null or not defined');
      }

      var o = Object(this);

      var len = o.length >>> 0;

      if (typeof predicate !== 'function') {
        throw TypeError('predicate must be a function');
      }

      var thisArg = arguments[1];

      var k = 0;

      while (k < len) {
        var kValue = o[k];
        if (predicate.call(thisArg, kValue, k, o)) {
          return kValue;
        }
        k++;
      }

      return undefined;
    },
    configurable: true,
    writable: true
  });
}

我的问题是表达式var o = Object(this);。这样做而不是这样做的目的是什么var o = this?在两种描述的情况下打印值都会返回相同的对象。

这是一种缩写的调用方式var o = new Object(this);吗?

我已经从方法中删除了注释以缩短文本,这里是 polyfill 实现的链接。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find#Polyfill

谢谢!

标签: javascript

解决方案


在严格模式下,this它并不总是一个对象。Object(this)确保它o是一个对象,而不是一个原语。

this这是一个原始的示例:

"use strict";

Object.defineProperty(String.prototype, "nishCap", {
    writable: true,
    configurable: true,
    value() {
        console.log(typeof this); // "string"
        const o = Object(this);
        console.log(typeof o);    // "object"
        return o.substring(0,1).toUpperCase() + o.substring(1);
    }
});
const capped = "foo".nishCap();

请注意,这甚至适用于数组方法,因为您可以在非数组上调用它们,例如Array.prototype.find.call("foo", ch => ch === "o").

这是一种缩写的调用方式var o = new Object(this);吗?

不,new Object总是创建一个新对象(并且不使用你给它的参数)。当您作为函数调用Object时,它会将其参数强制转换为对象。所以一个原始字符串变成了一个String对象,一个原始数字变成了一个Number对象,等等。

这样做而不是这样做的目的是什么var o = this

该 polyfill 非常严格地遵循规范,它从以下内容开始:

  1. 让 O 成为 ? ToObject(此值)。

在大多数情况下,它并不重要,但如果有一些边缘情况将其排除在外会导致可观察到的行为与规范不一致,我不会感到惊讶。


推荐阅读