Из любопытства я просто хочу знать причину.
Все методы массива, такие как 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);
Есть ли причина в этом?
Почему
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 году, поэтому...)
Если объект не является массивом typeof. В этом случае нам придется добавить метод isArray() ко всем типам данных.
Например, string.isArray() вернет false, object.isArray() вернет false и т.д.
Также, как пояснил он, в комментариях. Попробуйте сделать это с помощью null или undefined. Это невозможно
Лучше иметь его как функцию, которая принимает ввод и проверяет его
In that case we would have to add the method isArray() to all data types
. Попробуйте с null
или undefined
:>
Любой 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
isArray
).