Руководство по Javascript: `Array.prototype.includes ()` против `Array.include ()` - PullRequest
3 голосов
/ 13 октября 2019

Входящий вопрос "noob":

Javascript имеет метод includes для массивов.

Это выглядит так:

Array.includes()

Но когда я иду к Руководство по Javascript Чтобы понять этот метод, заголовок на этой странице (я понимаю, по соответствующей технической причине):

Array.prototype.includes()

Подобные вещи в Руководстве по Javascript заставили меня некак руководство вообще (и увы, я больше полагаюсь на W3Schools, чем руководство).

Однако я действительно очень хочу научиться толковать руководство.

Итак, мой вопрос: Каково значение включения в документацию слова .prototype в Array.prototype.includes(), когда фактическое использование выглядит следующим образом: Array.includes()?

(Кроме того, если у кого-то есть предложения о том, какЯ могу улучшить свое понимание официального руководства по Javascript, буду благодарен за предложения.)

Ответы [ 3 ]

4 голосов
/ 13 октября 2019

Итак, мой вопрос: Каково значение включения в документацию слова .prototype в Array.prototype.includes(), когда фактическое использование выглядит следующим образом: Array.includes()?

Значение заключается в том, что фактическое использование не выглядит как Array.includes():

Array.includes();

Это выдаст TypeError: Array.includes is not a function, потому что Array.includes не существует . Доступ к несуществующему свойству оценивается как undefined, поэтому Array.includes оценивается как undefined и, таким образом, Array.includes() пытается вызвать undefined, как если бы это была функция.

Вы можете увидеть это в действии здесь:

console.log(Array.includes);

undefined();

Метод includes() определен для прототипа глобального Array объекта , так что вы можете вызвать его экземпляров из Array:

[].includes();

Вы можете видеть, что [].includes является функцией:

console.log([].includes);

Сравните это с Array.from, которое определено в конструкторе Array , а не в Array прототип :

console.log(Array.from);

Вы можете использовать его так:

console.log(Array.from({ length: 10 }, (_, num) => num << 2));
3 голосов
/ 13 октября 2019

Если в документации написано Array.includes(), вы бы буквально набрали его следующим образом (пример):

Array.includes(1);

Вместо этого написано Array.prototype.includes(), что означает, что оно не вызывается для самого типа Array. , но на примере этого. Так что в этом случае вы бы написали:

const numbers = [1, 2, 3];
numbers.includes(1);
1 голос
/ 13 октября 2019

JavaScript часто описывается как язык на основе прототипов, прототипы - это просто то, как наследование работает в JavaScript.

Что означает прототип?

Мы оба согласны, что почти все в JavaScript являетсяобъект (я сказал «Почти», потому что примитивы не считаются объектами) круто? Хорошо, теперь у каждого объекта в JS есть внутреннее свойство, называемое [[Prototype]], и под внутренним я имею в виду, что вы не можете получить к нему прямой доступ так же, как и к свойству объекта JS.

Если мы хотимЗная прототип объекта, который мы создали, мы передаем экземпляр нашего объекта в Object.getPrototypeOf или через свойство __proto__ нашего объекта

Например:

let myArray = [1,2,3,4];
console.log(myArray.__proto__)
// Expected output: Array []

Если вы развернете получившийся объект, полученный из небольшого фрагмента кода, приведенного выше, вы обнаружите запрашиваемый метод include и все методы, доступные в любом массиве, который вы создаете в коде JS! Это потому, что myArray и все массивы в JavaScript, как говорят, совместно используют свойства и методы, определенные в Array.prototype!

Теперь, если вы снова посмотрите на методы результирующего объекта, которые у вас есть из фрагмента кода над вамизаметит метод с именем constructor, определенный для Array.prototype точно так же, как include и другие методы

Эта функция вызывается при создании экземпляра объекта JavaScript Array!

Что мы делаемимеется в виду объект Array JavaScript? Это глобальный объект JavaScript, который используется при построении массивов, это Array в Array.prototype.include () (для удобства вы можете назвать его классом, потому что классы buuuuut практически не существовали до выпуска ES6 ... до этогов JS не было такого понятия, как класс)

Поэтому, чтобы упростить его и обернуть его, представьте, что Array - это глобальный объект, экземплярами которого являются все JS-массивы, и представьте Array. proto как его прототип, который оборачивает свойства и методы, которые разделяют все его экземпляры!

А что касается документации, то способность читать документацию и иметь глубокое понимание того, что вы читаете, на самом деле является чем-то хорошим, поэтому я считаю, что у вас все хорошо!

...