Как узнать, является ли объект Javascript файлом?

У меня есть функция, которая манипулирует объектом, содержащим член "загрузки" типа File. Я хотел бы обнаружить этот факт, чтобы я мог игнорировать его и пропустить все объекты этого типа.

Я пробовал кучу вещей в консоли, но ничего не возвращает "true". Вот стенограмма моих тщетных попыток из точки останова консоли:

> values.avatar
{upload: File}
> values.avatar.upload
File {name: "29_Drawing Hands by Escher.jpg", lastModified: 1446580115000, lastModifiedDate: Tue Nov 03 2015 14:48:35 GMT-0500 (Eastern Standard Time), webkitRelativePath: "", size: 1314300, …}
> values.avatar.upload.isPrototypeOf(File)
false
> File
ƒ File() { [native code] }
> File.prototype
File {constructor: ƒ, …}
values.avatar.upload.isPrototypeOf(File.prototype)
false
> values.avatar.upload.prototype 
undefined
> File.isPrototypeOf
ƒ isPrototypeOf() { [native code] }
> File
ƒ File() { [native code] }
> values.avatar
{upload: File}
> File
ƒ File() { [native code] }
> File.__proto__
ƒ Blob() { [native code] }
> values.avatar.upload.__proto__
File {constructor: ƒ, …}
values.avatar.upload.isPrototypeOf(File.__proto__)
false
> values.avatar.upload.isPrototypeOf(Blob.__proto__)
false

Очевидно, мне не хватает фундаментального понимания того, как нативные типы и прототипы работают в Javascript.

Попробуйте values.avatar.upload instanceof File

pushkin 03.03.2019 19:23
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
5
1
2 747
3

Ответы 3

Вы можете проверить это, используя ключевое слово instanceof.

if (values.avatar.upload instanceof File)
  // yes, it's a File type.
else
  // no, it's not.

чек об оплате

values.avatar.upload instanceof File 

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

if (values.avatar.upload.prototype === File.prototype) {
  // true
} else {
 // false
}

Например, вы можете использовать:

File.prototype.isPrototypeOf(values.avatar.upload)

Например. следующее вернет true:

var file = new File([""], 'text.txt');
console.info(File.prototype.isPrototypeOf(file));

экземпляры не имеют свойства prototype. Это совершенно неправильно.

Patrick Roberts 03.03.2019 19:39

Я не вижу экземпляра OP.

Bhojendra Rauniyar 03.03.2019 19:40

Второй фрагмент функционально не эквивалентен первому фрагменту, но более каноничным ответом является values.avatar.upload instanceof File

Patrick Roberts 03.03.2019 19:58

второй, например, как вы прокомментировали.

Bhojendra Rauniyar 03.03.2019 19:59
...but the more canonical answer is - Я пытался придерживаться ОП.
Bhojendra Rauniyar 03.03.2019 20:03

Позвольте мне сделать это как можно более ясным для вас. File.prototype.isPrototypeOf(values.avatar.upload) правильно. Это эквивалентно values.avatar.upload instanceof File, что намного легче понять. values.avatar.upload.prototype === File.prototype это неправильно. Нет смысла даже оставлять это в вашем ответе.

Patrick Roberts 03.03.2019 20:06

Извините, но мне непонятно ваше утверждение. Оба помещены в мой ответ для разных вариантов использования. Первый предназначен для простого объекта, а другой, например.

Bhojendra Rauniyar 03.03.2019 20:07

Давайте продолжить обсуждение в чате.

Bhojendra Rauniyar 03.03.2019 20:09

Другие вопросы по теме