没有new关键字或.create方法的Object()

时间:2016-10-04 17:52:20

标签: javascript object

我在MDN上寻找Array.prototype.includes()的polyfill,我遇到了下面的Object()语法:

if (!Array.prototype.includes) {
   Array.prototype.includes = function(searchElement /*, fromIndex*/) {
'use strict';
if (this == null) {
  throw new TypeError('Array.prototype.includes called on null or undefined');
}
//This is the line in question
var O = Object(this);
var len = parseInt(O.length, 10) || 0;
if (len === 0) {
  return false;
}
var n = parseInt(arguments[1], 10) || 0;
var k;
if (n >= 0) {
  k = n;
} else {
  k = len + n;
  if (k < 0) {k = 0;}
}
var currentElement;
while (k < len) {
  currentElement = O[k];
  if (searchElement === currentElement ||
     (searchElement !== searchElement && currentElement !== currentElement)) { // NaN !== NaN
    return true;
  }
  k++;
}
  return false;
  };
}

Object(this)在做什么,在这种情况下这是什么目的?

1 个答案:

答案 0 :(得分:0)

Object(...)将传递的值转换为对象。如果值已经是对象,它只返回值本身,否则将创建一个新对象并返回该值。

来自spec

  

当Object作为函数而不是构造函数调用时,它会执行类型转换。

示例:

var obj = Object("foo");
// same as 
// var obj = new String("foo");
  

在这种情况下,这个目的是什么?

它确保值是对象,而不是基元。实现紧跟spec

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