Object.prototype.toString()
åºçº¿
广æ³å¯ç¨
èª 2015å¹´7æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
toString() æ¹æ³è¿åä¸ä¸ªè¡¨ç¤ºè¯¥å¯¹è±¡çå符串ãè¯¥æ¹æ³æ¨å¨éåï¼èªå®ä¹ï¼æ´¾ç类对象çç±»å转æ¢çé»è¾ã
å°è¯ä¸ä¸
function Dog(name) {
this.name = name;
}
const dog1 = new Dog("Gabby");
Dog.prototype.toString = function dogToString() {
return `${this.name}`;
};
console.log(dog1.toString());
// Expected output: "Gabby"
è¯æ³
toString()
åæ°
é»è®¤æ
åµä¸ï¼toString() 䏿¥åä»»ä½åæ°ãç¶èï¼ç»§æ¿èª Object ç对象å¯è½ç¨å®ä»¬èªå·±çå®ç°éåå®ï¼è¿äºå®ç°å¯ä»¥æ¥ååæ°ãä¾å¦ï¼Number.prototype.toString() å BigInt.prototype.toString() æ¹æ³æ¥åä¸ä¸ªå¯éç radix åæ°ã
è¿åå¼
ä¸ä¸ªè¡¨ç¤ºè¯¥å¯¹è±¡çå符串ã
æè¿°
JavaScript è°ç¨ toString æ¹æ³å°å¯¹è±¡è½¬æ¢ä¸ºä¸ä¸ªåå§å¼ãä½ å¾å°éè¦èªå·±å»è°ç¨ toString æ¹æ³ï¼å½éå°éè¦åå§å¼ç对象æ¶ï¼JavaScript ä¼èªå·±è°ç¨å®ã
è¯¥æ¹æ³ç±å符串转æ¢ä¼å
è°ç¨ï¼ä½æ¯æ°åç强å¶è½¬æ¢ååå§å¼ç强å¶è½¬æ¢ä¼ä¼å
è°ç¨ valueOf()ãç¶èï¼å ä¸ºåºæ¬ç valueOf() æ¹æ³è¿åä¸ä¸ªå¯¹è±¡ï¼toString() æ¹æ³é常å¨ç»ææ¶è°ç¨ï¼é¤é对象éåäº valueOf()ãä¾å¦ï¼+[1] è¿å 1ï¼å 为å®ç toString() æ¹æ³è¿å "1"ï¼ç¶åå°å
¶è½¬æ¢ä¸ºæ°åã
ææç»§æ¿èª Object.prototype ç对象ï¼å³ï¼é¤äº null-prototype 对象ä¹å¤ç对象ï¼é½ç»§æ¿ toString() æ¹æ³ãå½ä½ å建ä¸ä¸ªèªå®ä¹å¯¹è±¡æ¶ï¼ä½ å¯ä»¥éå toString() 以è°ç¨èªå®ä¹æ¹æ³ï¼ä»¥ä¾¿å°èªå®ä¹å¯¹è±¡è½¬æ¢ä¸ºä¸ä¸ªå符串ãæè
ï¼ä½ å¯ä»¥å¢å ä¸ä¸ª [Symbol.toPrimitive]() æ¹æ³ï¼è¯¥æ¹æ³å
许对转æ¢è¿ç¨ææ´å¤çæ§å¶ï¼å¹¶ä¸å¯¹äºä»»æçç±»å转æ¢ï¼ä¸æ»æ¯ä¼å
äº valueOf æ toStringã
è¦å°åºæ¬ç Object.prototype.toString() ç¨äºéåçå¯¹è±¡ï¼æè
å¨ null æ undefined ä¸è°ç¨å®ï¼ï¼ä½ éè¦å¨å®ä¸é¢è°ç¨ Function.prototype.call() æè
Function.prototype.apply()ï¼å°è¦æ£æ¥ç对象ä½ä¸ºç¬¬ä¸ä¸ªåæ°ä¼ éï¼ç§°ä¸º thisArgï¼ã
const arr = [1, 2, 3];
arr.toString(); // "1,2,3"
Object.prototype.toString.call(arr); // "[object Array]"
Object.prototype.toString() è¿å "[object Type]"ï¼è¿éç Type æ¯å¯¹è±¡çç±»åãå¦æå¯¹è±¡æ Symbol.toStringTag 屿§ï¼å
¶å¼æ¯ä¸ä¸ªå符串ï¼åå®çå¼å°è¢«ç¨ä½ Typeã许å¤å
ç½®ç对象ï¼å
æ¬ Map å Symbolï¼é½æ Symbol.toStringTagãä¸äºæ©äº ES6 ç对象没æ Symbol.toStringTagï¼ä½ä»ç¶æä¸ä¸ªç¹æ®çæ ç¾ãå®ä»¬å
æ¬ï¼æ ç¾ä¸ä¸é¢ç»åºçç±»ååç¸åï¼ï¼
arguments 对象è¿å "[object Arguments]"ãå
¶ä»ææå
容ï¼å
æ¬ç¨æ·èªå®ä¹çç±»ï¼é¤éæä¸ä¸ªèªå®ä¹ç Symbol.toStringTagï¼å¦åé½å°è¿å "[object Object]"ã
å¨ null å undefined ä¸è°ç¨ Object.prototype.toString() åå«è¿å [object Null] å [object Undefined]ã
示ä¾
>为èªå®ä¹å¯¹è±¡éå toString
ä½ å¯ä»¥å建ä¸ä¸ªè¦è°ç¨ç彿°æ¥ä»£æ¿é»è®¤ç toString() æ¹æ³ãä½ å建ç toString() 彿°åºè¯¥è¿åä¸ä¸ªå符串å¼ã妿å®è¿åä¸ä¸ªå¯¹è±¡ï¼å¹¶ä¸å¨ç±»åè½¬æ¢æé´éå¼è°ç¨å®ï¼é£ä¹å¿½ç¥å®çç»æï¼å¹¶ä½¿ç¨ç¸å
³æ¹æ³ valueOf() çå¼ï¼æè
è¿äºæ¹æ³é½ä¸è¿ååå§å¼ï¼åæåº TypeErrorã
以ä¸ä»£ç å®ä¹äº Dog ç±»ã
class Dog {
constructor(name, breed, color, sex) {
this.name = name;
this.breed = breed;
this.color = color;
this.sex = sex;
}
}
å¦æä½ å¨ Dog å®ä¾ä¸æ¾ç¤ºæè
éå¼çè°ç¨ toString() æ¹æ³ï¼å®å°è¿åä» Object ç»§æ¿çé»è®¤å¼ï¼
const theDog = new Dog("Gabby", "Lab", "chocolate", "female");
theDog.toString(); // "[object Object]"
`${theDog}`; // "[object Object]"
以ä¸ä»£ç éåäºé»è®¤ç toString() æ¹æ³ãè¿ä¸ªæ¹æ³çæä¸ä¸ªå
å«è¯¥å¯¹è±¡ç nameãbreedãcolor å sex çå符串ã
class Dog {
constructor(name, breed, color, sex) {
this.name = name;
this.breed = breed;
this.color = color;
this.sex = sex;
}
toString() {
return `Dog ${this.name} is a ${this.sex} ${this.color} ${this.breed}`;
}
}
æäºåé¢ç代ç ï¼æ¯å½ Dog å®ä¾å¨å符串çä¸ä¸æä¸ä½¿ç¨ï¼JavaScript ä¼èªå¨è°ç¨ toString() æ¹æ³ã
const theDog = new Dog("Gabby", "Lab", "chocolate", "female");
`${theDog}`; // "Dog Gabby is a female chocolate Lab"
ä½¿ç¨ toString() 廿£æ¥å¯¹è±¡ç±»
toString() å¯ä»¥ä¸æ¯ä¸ªå¯¹è±¡ä¸èµ·ä½¿ç¨ï¼å¹¶ä¸ï¼é»è®¤æ
åµä¸ï¼å
è®¸ä½ è·å¾å®çç±»ã
const toString = Object.prototype.toString;
toString.call(new Date()); // [object Date]
toString.call(new String()); // [object String]
// Math has its Symbol.toStringTag
toString.call(Math); // [object Math]
toString.call(undefined); // [object Undefined]
toString.call(null); // [object Null]
以è¿ç§æ¹å¼ä½¿ç¨ toString() æ¯ä¸å¯é çï¼å¯¹è±¡å¯ä»¥éè¿å®ä¹ Symbol.toStringTag 屿§æ¥æ´æ¹ Object.prototype.toString() çè¡ä¸ºï¼ä»èå¯¼è´ææ³ä¸å°çç»æãä¾å¦ï¼
const myDate = new Date();
Object.prototype.toString.call(myDate); // [object Date]
myDate[Symbol.toStringTag] = "myDate";
Object.prototype.toString.call(myDate); // [object myDate]
Date.prototype[Symbol.toStringTag] = "prototype polluted";
Object.prototype.toString.call(new Date()); // [object prototype polluted]
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # sec-object.prototype.tostring> |