Function.prototype.toString()
åºçº¿
广æ³å¯ç¨
èª 2015å¹´7æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
Function å®ä¾ç toString() æ¹æ³è¿åä¸ä¸ªè¡¨ç¤ºè¯¥å½æ°æºç çå符串ã
å°è¯ä¸ä¸
function sum(a, b) {
return a + b;
}
console.log(sum.toString());
// Expected output: "function sum(a, b) {
// return a + b;
// }"
console.log(Math.abs.toString());
// Expected output: "function abs() { [native code] }"
è¯æ³
toString()
åæ°
æ ã
è¿åå¼
ä¸ä¸ªè¡¨ç¤ºå½æ°æºä»£ç çå符串ã
æè¿°
Function 对象éåäºä» Object ç»§æ¿æ¥ç toString() æ¹æ³ï¼è没æç»§æ¿ toStringã对äºç¨æ·å®ä¹ç Function 对象ï¼toString æ¹æ³è¿åä¸ä¸ªå符串ï¼å
¶ä¸å
å«ç¨äºå®ä¹å½æ°çæºææ¬æ®µã
å½ Function éè¦è¡¨ç¤ºä¸ºææ¬å¼æ¶ï¼JavaScript ä¼èªå¨è°ç¨å½æ°ç toString æ¹æ³ï¼ä¾å¦ï¼å½æ°ä¸ä¸ä¸ªå符串è¿è¡æ¼æ¥ã
è¥ this 䏿¯ Function 对象ï¼å toString() æ¹æ³å°æåº TypeError å¼å¸¸ï¼"Function.prototype.toString called on incompatible object"ï¼ã
Function.prototype.toString.call("foo"); // æåº TypeError
妿å¨å
ç½®å½æ°å¯¹è±¡ä¸è°ç¨ toString() æ¹æ³ï¼æè
å¨ç± Function.prototype.bind() å建ç彿°ä»¥åå¨å
¶ä»é JavaScript 彿°ä¸è°ç¨ toString()ï¼é£ä¹ toString() å°è¿åä¸ä¸ªçèµ·æ¥åå彿°çå符串ï¼ç±»ä¼¼äºï¼
function someName() { [native code] }
对äºå
é¨å¯¹è±¡æ¹æ³å彿°ï¼someName æ¯å½æ°çåå§åç§°ï¼å¦åå
¶å¯è½æ¯å®ç°å®ä¹ï¼implementation-definedï¼çï¼ä½å§ç»ä»¥å±æ§åç§°è¯æ³çå½¢å¼åç°ï¼å¦ï¼[1 + 1]ãsomeName æ 1ã
夿³¨ï¼è¿æå³ç对åç彿°çå符串è°ç¨ eval() å°å§ç»äº§çè¯æ³é误ã
è¥æ¯å¨ç± Function æé 彿°çæç彿°ä¸è°ç¨ toString()ï¼å toString() è¿åå建åç彿°æºç ï¼å
æ¬å½¢åå彿°ä½ï¼å½æ°å为âanonymousâãä¾å¦ï¼å¯¹äº Function("a", "b", "return a + b").toString()ï¼åä¼è¿åï¼
function anonymous(a,b
) {
return a + b
}
ä» ES2018 å¼å§ï¼è§èè¦æ± toString() çè¿åå¼ä¸å£°æçæºä»£ç å®å
¨ç¸åï¼å
æ¬ç©ºæ ¼å注éï¼æè
å æç§åå ï¼ä¸»æºæ²¡ææºä»£ç ï¼åè¦æ±è¿åä¸ä¸ªåç彿°å符串ãåè§å
¼å®¹æ§è¡¨æ ¼ä»¥æ¥è¯¢å¯¹è¿ä¸ä¿®æ¹åçè¡ä¸ºçæ¯ææ
åµã
示ä¾
>æ¯è¾å®é æºä»£ç ä¸ toString çç»æ
function test(fn) {
console.log(fn.toString());
}
function f() {}
class A {
a() {}
}
function* g() {}
test(f); // "function f() {}"
test(A); // "class A { a() {} }"
test(g); // "function* g() {}"
test((a) => a); // "(a) => a"
test({ a() {} }.a); // "a() {}"
test({ *a() {} }.a); // "*a() {}"
test({ [0]() {} }[0]); // "[0]() {}"
test(Object.getOwnPropertyDescriptor({ get a() {} }, "a").get); // "get a() {}"
test(Object.getOwnPropertyDescriptor({ set a(x) {} }, "a").set); // "set a(x) {}"
test(Function.prototype.toString); // "function toString() { [native code] }"
test(function f() {}.bind(0)); // "function () { [native code] }"
test(Function("a", "b")); // function anonymous(a\n) {\nb\n}
注æï¼å¨ Function.prototype.toString() çè¡ä¸ºåæ´åï¼å¨è°ç¨ toString() æ¶ï¼ä¸å
è®¸å¯¹è¯¥æ¹æ³çå®ç°å¨å
¶ä¸æ¯åç彿°çå符串æ¶åæå½æ°çæºç ãæ¹æ³å§ç»è¿ååå»ºå½æ°æ¶ä½¿ç¨çç¡®åçæºä»£ç ââå
æ¬ä»¥ä¸ç¤ºä¾ä¸ç getter å setterãFunction æé 彿°æ¬èº«å
·æåæå½æ°æºä»£ç çè½åï¼å³ï¼ä¸ç§éå¼ç eval() å½¢å¼ï¼ã
è·å彿°çæºææ¬
å¯ä»¥éè¿å°å½æ°å¼ºå¶è½¬æ¢ä¸ºå符串æ¥è·å彿°çæºææ¬ââä¾å¦ï¼éè¿å°å ¶å è£ å¨æ¨¡æ¿å符串ä¸ï¼
function foo() {
return "bar";
}
console.log(`${foo}`);
// function foo() {
// return "bar";
// }
å¾å°çæºææ¬æ¯åç¡®çï¼å æ¬å ¶ä¸ç注éï¼å¦å弿çå é¨è¡¨ç¤ºä¸ä¼åå¨è¿äºæ³¨éï¼ã
function foo /* a comment */() {
return "bar";
}
console.log(foo.toString());
// function foo /* a comment */() {
// return "bar";
// }
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # sec-function.prototype.tostring> |