JSFiddle - React, Tailwind, and code Playground

by Alexander

JavaScript

console.clear();

/**
 * Примерный алгоритм приведения к примитивам
 */
function typeCast2primitive(arg){
    //Если аргумент уже примитив, возвращаем как есть
    if (typeOfArg(arg) === Primitive)
        return arg;
    
    // Если результат выполнения его метода valueOf() - примитив, то возвращаем результат выполнения valueOf()
    if (arg.valueOf() === Primitive)
        return arg.valueOf();
    
    // Если результат выполнения его метода toString() - примитив, возвращаем результат toString()
    if (arg.toString() === Primitive)
        return arg.toString();   
    
    //Иначе, выбрасываем исключение TypeError
    throw TypeError();
}

/**
 * Примерный алгоритм сложения
 */
function sumOperands(a, b){
    // Если хотя бы один из результатов приведения аргументов к примитивам - строка, сконвертировать оба аргумента в строки и сконкатенировать их
    if (typeof a == "string" || typeof b == "string")
        return String(a) + String(b);

    // Иначе привести оба аргумента к числу и сложить
    return Number(a) + Number(b);
}
//*/

var o = {
    valueOf: function() { return 1 },
    //toString: function() { return "a" }
}

console.log( o + 1 );