Почему `isArray ()` пишется на `Array` вместо` Array prototype`?

1

Из любопытства я просто хочу знать причину.

Все методы массива, такие как map, forEach, reduce, записываются на Array.prototype и поэтому я могу использовать это

let sum = [1,2,3,4,5].reduce( (acc, value) => acc+value, 0);
console.log(sum);

В отличие от всех этих методов использование isArray() похоже на

let isArray = Array.isArray([1,2,3]); // I can't use [1,2,3].isArray(); :(
console.log(isArray);

Есть ли причина в этом?

Теги:
arrays

3 ответа

3
Лучший ответ

Почему isArray() записывается на Array вместо Array prototype?

Если ответ "нет, это не массив":

let obj = {};
let isArray = obj.isArray(); // TypeError: obj.isArray is not a function

Цель isArray - предоставить средство проверки того, является ли массив, который может быть или не быть массивом. Если isArray был в прототипе Array, он не был бы доступен, если бы ответ не был "да, это массив".


Справедливости ради, было бы возможно поместить isArray на Object.prototype и вернуть его false, а затем переопределить его в Array.prototype чтобы вернуть true. Тем не менее, это было бы неудачно для undefined и null:

let x = null;
let isArray = x.isArray(); //  TypeError: Cannot read property 'isArray' of null

... и будет излишне загрязнять список участников всех других типов объектов в стандартной библиотеке. Сделать это статикой, которую вы вызываете с вещью, которую нужно протестировать, в качестве аргумента, просто имеет смысл - в том месте, где был добавлен Array.isArray. (Что, возможно, имело еще большее значение для того, чтобы typeof работал принципиально иначе, чем он, но этот корабль плыл в 1995 году, поэтому...)

  • 0
    но все остальные вызовут ту же ошибку, попробуйте объект .reduce или объект .forEach. Почему это исключение, вы знаете?
  • 0
    @Dellirium: цель состоит в том, чтобы проверить, является ли что-то массивом. Вы используете другие методы для чего-то, что уже известно как массив (возможно, потому что вы сначала проверили с помощью isArray ).
Показать ещё 1 комментарий
2

Если объект не является массивом typeof. В этом случае нам придется добавить метод isArray() ко всем типам данных.

Например, string.isArray() вернет false, object.isArray() вернет false и т.д.

Также, как пояснил он, в комментариях. Попробуйте сделать это с помощью null или undefined. Это невозможно

Лучше иметь его как функцию, которая принимает ввод и проверяет его

  • 0
    In that case we would have to add the method isArray() to all data types . Попробуйте с null или undefined :>
  • 0
    обновил ответ. Это был хороший момент
0

Любой Object может иметь .isArray():

o = { isArray: () => true }
console.log(o.isArray())      // true 

a = []; a.isArray = () => false
console.log(a.isArray())      // false

или .prototype.isArray():

Object.prototype.isArray = () => true
Array.prototype.isArray = () => false
console.log({}.isArray(), [].isArray()) // true false

Обновление неважно..

Array.isArray = () => false
console.log(Array.isArray([]))    // false

но вы все равно можете добавить его:

Object.prototype.isArray = false
Array.prototype.isArray = true

console.log([].isArray, {}.isArray, "".isArray, (0).isArray, (false).isArray) // but doesn't work for null and undefined 

Ещё вопросы

Сообщество Overcoder
Наверх
Меню