isblob.mjs

/**
 * 判斷是否為Blob或其子型別(File)
 *
 * File繼承自Blob,具備Blob全部方法,由input type=file取得者皆為File,故一併視為Blob;若須區分File請用isfile。瀏覽器與NodeJS(18以上)皆有Blob,NodeJS 20以上有File
 *
 * Unit Test: {@link https://github.com/yuda-lyu/wsemi/blob/master/test/isblob.test.mjs Github}
 * @memberOf wsemi
 * @param {*} v 輸入任意資料
 * @returns {Boolean} 回傳判斷布林值
 * @example
 *
 * let bb = new Blob([new Uint8Array([66, 97, 115])])
 * console.log(isblob(bb))
 * // => true
 *
 * let fl = new File([new Uint8Array([66, 97, 115])], 'a.txt')
 * console.log(isblob(fl))
 * // => true
 *
 */
function isblob(v) {

    //以標籤判定, 跨iframe等不同realm時instanceof會失效而標籤仍有效; File之標籤為[object File]而非[object Blob], 須一併列入
    let c = Object.prototype.toString.call(v)
    if (c === '[object Blob]' || c === '[object File]') {
        return true
    }

    //其他Blob子型別以instanceof判定, 無Blob之環境須先確認其存在
    try {
        if (typeof Blob !== 'undefined' && v instanceof Blob) {
            return true
        }
    }
    catch (err) {}

    return false
}


export default isblob