Skip to content

Instantly share code, notes, and snippets.

@iwill
Last active September 6, 2022 07:53
Show Gist options
  • Save iwill/5440541 to your computer and use it in GitHub Desktop.
Save iwill/5440541 to your computer and use it in GitHub Desktop.
isNumber(aNorNaN) === !isNaN(aNorNaN)
function isNumber(x, object, bigint, string) {
let type = typeof x;
if (object && type == "object") {
x = x instanceof Number ? x.valueOf() : NaN;
type = typeof x;
}
else if (bigint && type == "bigint") {
x = x >= Number.MIN_SAFE_INTEGER && x <= Number.MAX_SAFE_INTEGER ? Number(x) : NaN;
type = typeof x;
}
else if (string && type == "string") {
x = x ? Number(x) : NaN;
type = typeof x;
}
return type == "number" && !isNaN(x);
};
@iwill
Copy link
Author

iwill commented Sep 6, 2022

[
    // number: NaN, Infinity, -Infinity and numbers
    NaN,            // number: NaN - NOT
    Infinity,       // number: Infinity
    -Infinity,      // number: -Infinity
    0,              // number: √
    -0,             // number: √
    1,              // number: √
    -1,             // number: √
    // number object: NaN, Infinity, -Infinity and numbers
    new Number(NaN),        // object: x.valueOf() -> number: NaN - NOT
    new Number(Infinity),   // object: x.valueOf() -> number: Infinity
    new Number(-Infinity),  // object: x.valueOf() -> number: -Infinity
    new Number(0),          // object: x.valueOf() -> number: √
    new Number(-0),         // object: x.valueOf() -> number: √
    new Number(1),          // object: x.valueOf() -> number: √
    new Number(-1),         // object: x.valueOf() -> number: √
    // bigint: Number(x)
    0n,             // bigint: Number(x) -> number: √
    1n,             // bigint: Number(x) -> number: √
    BigInt(Number.MIN_SAFE_INTEGER) - 1n, // bigint: Number(x) -> number: NaN - NOT
    BigInt(Number.MAX_SAFE_INTEGER) + 1n, // bigint: Number(x) -> number: NaN - NOT
    // string: 
    "",             // string: Number(x) -> number: 0 - NOT
    '',             // string: Number(x) -> number: 0 - NOT
    ``,             // string: Number(x) -> number: 0 - NOT
    "NaN",          // string: Number(x) -> number: NaN - NOT
    "Infinity",     // string: Number(x) -> number: Infinity
    "-Infinity",    // string: Number(x) -> number: -Infinity
    "0",            // string: Number(x) -> number: √
    "-0",           // string: Number(x) -> number: √
    "1",            // string: Number(x) -> number: √
    "-1",           // string: Number(x) -> number: √
    "x",            // string: Number(x) -> number: NaN - NOT
    // falsy
    undefined,      // undefined: undefined - NOT
    null,           // object: null - NOT
    // boolean
    false,          // boolean: false - NOT
    true,           // boolean: true - NOT
    // array
    [],             // object: x
    [1],            // object: x
    [1, 2],         // object: x
    // object
    {},             // object: x
    {a: 1},         // object: x
    {a: 1, b: 2},   // object: x
    new RegExp()    // object: x
]
// .map((a) => `|${a}|: ${typeof a}`);
// .map((a) => `|${a}|: ${isNumber(a)}`);
// .map((a) => `|${a}|: ${isNumber(a, true,  false, false)}`);
// .map((a) => `|${a}|: ${isNumber(a, false, true,  false)}`);
// .map((a) => `|${a}|: ${isNumber(a, false, false, true)}`);
.map((a) => `|${a}|: ${isNumber(a, true,  true,  true)}`);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment