Jaak Kütt
Jaak Kütt

Reputation: 2656

How to check if a variable is a blob in JavaScript

As typeof returns "object"..

var MyBlob = new Blob(['test text'], {type : 'text/plain'});
console.log(typeof MyBlob) // "object"

is it too early to ask for a generic solution for checking whether or not a variable is a blob as it is not yet widely supported? Or how should I go about testing for blob type in browsers which already have it implemented?

Upvotes: 75

Views: 73095

Answers (3)

ahmnouira
ahmnouira

Reputation: 3431

This example is a real-world example where I want to fetch a file and check the response.

const data = error.response.data;
if (data instanceof Blob) { 
  const resp = JSON.parse(await data.text());
  if (resp && resp.error) {
    return resp.error;
  }
}

Upvotes: 1

jfriend00
jfriend00

Reputation: 707686

You can test if it is an instanceof Blob like this:

var MyBlob = new Blob(['test text'], {type : 'text/plain'});
document.body.innerHTML = MyBlob instanceof Blob;

This will work for things that inherit from Blob also.

Upvotes: 133

Matthemattics
Matthemattics

Reputation: 9875

Note that instanceof needs to be passed the exact constructor function used to create the object!

This isn't always the case in NodeJS, since it doesn't have a global Blob implementation (so we're dealing with polyfills).

For example, node-fetch uses an internal Blob implementation, but if you're using jest in a test suite (which polyfills Blob), you'll notice that expect(myBlob).toBeInstanceOf(Blob); will throw an exception similar to:

expect(value).toBeInstanceOf(constructor)

Expected constructor: Blob
Received constructor: Blob

In such cases, the best we can do is:

const fetch = require('node-fetch');
fetch(/* some request */).then(res => {
  const myBlob = await res.blob(); // a Blob created by node-fetch
  console.log(myBlob.constructor.name === 'Blob'); // true
});

Upvotes: 8

Related Questions