Object.prototype.valueOf()
åºçº¿
广æ³å¯ç¨
èª 2015å¹´7æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
Object å®ä¾ç valueOf() æ¹æ³å° this å¼è½¬æ¢æå¯¹è±¡ãè¯¥æ¹æ³æ¨å¨è¢«æ´¾ç对象éåï¼ä»¥å®ç°èªå®ä¹ç±»å转æ¢é»è¾ã
å°è¯ä¸ä¸
function MyNumberType(n) {
this.number = n;
}
MyNumberType.prototype.valueOf = function () {
return this.number;
};
const object1 = new MyNumberType(4);
console.log(object1 + 3);
// Expected output: 7
è¯æ³
valueOf()
åæ°
æ ã
è¿åå¼
è½¬æ¢æå¯¹è±¡ç this å¼ã
夿³¨ï¼ä¸ºäºä½¿ valueOf å¨ç±»å转æ¢è¿ç¨ä¸æç¨ï¼å®å¿
é¡»è¿åä¸ä¸ªåºæ¬ç±»åå¼ãå 为ææçåºæ¬ç±»å齿èªå·±ç valueOf() æ¹æ³ï¼æä»¥è°ç¨ aPrimitiveValue.valueOf() é常ä¸ä¼è°ç¨ Object.prototype.valueOf()ã
æè¿°
JavaScript è°ç¨ valueOf æ¹æ³æ¥å°å¯¹è±¡è½¬æ¢æåºæ¬ç±»åå¼ãä½ å¾å°éè¦èªå·±è°ç¨ valueOf æ¹æ³ï¼å½éå°éè¦åºæ¬ç±»åå¼ç对象æ¶ï¼JavaScript ä¼èªå¨çè°ç¨è¯¥æ¹æ³ã
å¼ºå¶æ°åç±»å转æ¢å强å¶åºæ¬ç±»å转æ¢ä¼å
ä¼è°ç¨è¯¥æ¹æ³ï¼è强å¶å符串转æ¢ä¼ä¼å
è°ç¨ toString()ï¼å¹¶ä¸ toString() å¾å¯è½è¿åå符串å¼ï¼çè³å¯¹äº Object.prototype.toString() åºæ¬å®ç°ä¹æ¯å¦æ¤ï¼ï¼å æ¤å¨è¿ç§æ
åµä¸ä¸ä¼è°ç¨ valueOf()ã
ä» Object.prototype ç»§æ¿çææå¯¹è±¡ï¼å³ï¼é¤äºnull åå对象ä¹å¤çææå¯¹è±¡ï¼é½ç»§æ¿äº toString() æ¹æ³ãObject.prototype.valueOf() çåºæ¬å®ç°è¢«ææè®¾è®¡ä¸ºæ ç¨çï¼è¿åä¸ä¸ªå¯¹è±¡ï¼å
¶è¿åå¼å°æ°¸è¿ä¸ä¼è¢«ä»»ä½åºæ¬ç±»å转æ¢ç®æ³ä½¿ç¨ã许å¤å
置对象éåæ¤æ¹æ³ä»¥è¿åéå½çåºæ¬ç±»åå¼ãå建èªå®ä¹å¯¹è±¡æ¶ï¼å¯ä»¥éå valueOf() æ¥è°ç¨èªå®ä¹æ¹æ³ï¼ä»¥ä¾¿å°èªå®ä¹å¯¹è±¡è½¬æ¢ä¸ºåºæ¬ç±»åå¼ãé常ï¼valueOf() ç¨äºè¿å对对象å
·ææä¹çå¼ââä¸ toString() ä¸åï¼å®ä¸éè¦å符串ãæè
ï¼ä½ å¯ä»¥æ·»å ä¸ä¸ª [Symbol.toPrimitive]() æ¹æ³ï¼è¯¥æ¹æ³å
许对转æ¢è¿ç¨è¿è¡æ´å¤æ§å¶ï¼å¹¶ä¸å¯¹äºä»»ä½ç±»åç转æ¢ï¼å§ç»ä¼å
äº valueOf æ toStringã
示ä¾
>ä½¿ç¨ valueOf()
åºæ¬ç valueOf() æ¹æ³è¿å this 弿¬èº«ï¼å¦æå°æªè½¬æ¢ä¸ºå¯¹è±¡ï¼åè½¬æ¢æå¯¹è±¡ãå æ¤ï¼ä»»ä½åºæ¬ç±»å转æ¢ç®æ³é½ä¸ä¼ä½¿ç¨å®çè¿åå¼ã
const obj = { foo: 1 };
console.log(obj.valueOf() === obj); // true
console.log(Object.prototype.valueOf.call("primitive"));
// [String: 'primitive']ï¼ä¸ä¸ªå
è£
对象ï¼
éåèªå®ä¹å¯¹è±¡ç valueOf
ä½ å¯ä»¥å建ä¸ä¸ªè¦è°ç¨ç彿°æ¥ä»£æ¿é»è®¤ç valueOf æ¹æ³ãä½ ç彿°ä¸åºè¯¥æ¥åä»»ä½åæ°ï¼å 为å¨ç±»åè½¬æ¢æé´è°ç¨å®æ¶ä¸ä¼ä¼ éä»»ä½åæ°ã
ä¾å¦ï¼ä½ å¯ä»¥å° valueOf æ¹æ³æ·»å å°èªå®ä¹ç±» Box ä¸ã
class Box {
#value;
constructor(value) {
this.#value = value;
}
valueOf() {
return this.#value;
}
}
æäºåé¢ç代ç ï¼ä»»ä½æ¶åå¨å° Box ç±»åçå¯¹è±¡è¡¨ç¤ºä¸ºåºæ¬ç±»åå¼ï¼ä½ä¸æ¯ç¹å®çå符串ï¼çä¸ä¸æä¸ä½¿ç¨æ¶ï¼JavaScript é½ä¼èªå¨è°ç¨åé¢ä»£ç ä¸å®ä¹ç彿°ã
const box = new Box(123);
console.log(box + 456); // 579
console.log(box == 123); // true
对象ç valueOf æ¹æ³éå¸¸ç± JavaScript è°ç¨ï¼ä½ä½ å¯ä»¥æç
§å¦ä¸æ¹å¼èªå·±è°ç¨å®ï¼
box.valueOf();
对对象使ç¨ä¸å å è¿ç®ç¬¦
ä¸å
å ï¼+ï¼å¯¹å
¶æä½æ°è¿è¡å¼ºå¶æ°å转æ¢ï¼å¯¹äºå¤§å¤æ°æ²¡æ [Symbol.toPrimitive]() ç对象ï¼è¿æå³çè°ç¨å
¶ valueOf()ã使¯ï¼å¦æå¯¹è±¡æ²¡æèªå®ä¹ç valueOf() æ¹æ³ï¼ååºæ¬å®ç°å°å¯¼è´å¿½ç¥ valueOf()ï¼èä½¿ç¨ toString() çè¿åå¼ã
+new Date(); // å½åæ¶é´æ³ï¼ä¸ new Date().getTime() ç¸å
+{}; // NaNï¼toString() è¿å "[object Object]"ï¼
+[]; // 0ï¼toString() è¿åä¸ä¸ªç©ºçå符串å表ï¼
+[1]; // 1ï¼toString() è¿å "1"ï¼
+[1, 2]; // NaNï¼toString() è¿å "1,2"ï¼
+new Set([1]); // NaNï¼toString() è¿å "[object Set]"ï¼
+{ valueOf: () => 42 }; // 42
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # sec-object.prototype.valueof> |