Что делает Object ([]); делать?

В нескольких примерах polyfill в MDN для некоторых функций прототипа Array существуют следующие две строки (например: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find):

var list = Object(this);
var length = list.length >>> 0;

Я предполагаю, что первым примером является autoboxing (?). Но какова его цель в любом случае, если this всегда будет массивом?

И строка 2, как это отличается от:

var length = list.length || 0;

Спасибо!

Ответ 1

Это позволяет вызвать функцию (используя call или apply) в строгом режиме на том, что не является массивом при выполнении спецификации.

Если это экземпляр Array или объект, похожий на массив, он ничего не меняет.

Но здесь, поскольку эта строка, гарантирующая list, является объектом, следует, что this не является ни null, либо undefined, а поскольку другие значения не будут приводить к отказу следующих обращений (кроме особых случаев что Object(this) не решит, например, сбойщики доступа), я не уверен, что на самом деле есть точка. Возможно, он был установлен перед проверкой, или, может быть, здесь, только в случае особых собственных объектов. Другая возможность заключается в том, что он (тоже?) Строго следует за спецификацией шаг за шагом и хочет применить toObject.

list.length >>> 0 лучше, чем || 0 в том, что он округляется до ближайшего более низкого положительного целого (в 32-битном диапазоне). Я не уверен, почему >> здесь не использовался, так как кажется, что лучше повторять итерацию до 4294967295, а не до -1 (т.е. Не терять время).