toString () в JavaScript: почему toString () по-прежнему вызывается, поскольку прототип valueOf () для преобразования типов объекта в число - PullRequest
0 голосов
/ 29 марта 2020
let obj = {
    toString() {
        return "2";
    }
};

let n = +obj; 

alert(n);

Поскольку для + obj требуется число, не следует ли использовать прототип valueOf () для преобразования типов, который возвращает объект. Вместо этого он использует метод toString () и оповещения 2. Пожалуйста, почему это так?

Ответы [ 2 ]

2 голосов
/ 29 марта 2020

Поскольку +obj требует число, не следует ли использовать прототип valueOf() для преобразования типов, который возвращает объект.

На самом деле делает вызовите метод valueOf. Но поскольку, как вы говорите, он возвращает объект, а не примитивное значение, он считается бесполезным. Затем альтернатива называется: toString(), которая возвращает , возвращает примитивное значение, которое впоследствии приводится к числу.

Вы можете попробовать

const obj1 = {
    valueOf() { console.log("valueOf 1"); return this; },
    toString() { console.log("toString 1"); return "1"; },
};
console.log(+obj1);

const obj2 = {
    valueOf() { console.log("valueOf 2"); return 2; },
    toString() { console.log("toString 2"); return "2"; },
};
console.log(+obj2);
0 голосов
/ 29 марта 2020

Вы должны изменить функцию de toString () на функцию parseInt (), чтобы получить ответ NaN.

let obj = {
    parseInt() {
        return "2";
    }
};

let n = +obj; 

alert(n);
...