Function.prototype.toString()
Baseline
åºãå©ç¨å¯è½
ãã®æ©è½ã¯åºãå®è£ ããã¦ãããå¤ãã®ãã¼ã¸ã§ã³ã®ç«¯æ«ããã©ã¦ã¶ã¼ã§åä½ãã¾ãã2015å¹´7æä»¥éããã¹ã¦ã®ãã©ã¦ã¶ã¼ã§å©ç¨å¯è½ã§ãã
toString() 㯠Function ã¤ã³ã¹ã¿ã³ã¹ã®ã¡ã½ããã§ã颿°ã®ã½ã¼ã¹ã³ã¼ãã表ãæååãè¿ãã¾ãã
試ãã¦ã¿ã¾ããã
function sum(a, b) {
return a + b;
}
console.log(sum.toString());
// æå¾
ãããåºå: "function sum(a, b) {
// return a + b;
// }"
console.log(Math.abs.toString());
// æå¾
ãããåºå: "function abs() { [native code] }"
æ§æ
toString()
弿°
ãªãã
è¿å¤
颿°ã®ã½ã¼ã¹ã³ã¼ãã表ãæååã§ãã
解説
Function ãªãã¸ã§ã¯ãã¯ã Object ããç¶æ¿ãã toString ã¡ã½ããããªã¼ãã¼ã©ã¤ããã¾ããã¤ã¾ãã Object.prototype.toString ãç¶æ¿ãã¾ãããã¦ã¼ã¶ã¼å®ç¾©ã® Function ãªãã¸ã§ã¯ãã®å ´åãtoString ã¡ã½ããã¯é¢æ°ãå®ç¾©ããéã«ä½¿ç¨ããã½ã¼ã¹ããã¹ãã®ç¯å²ãå«ãæååãè¿ãã¾ãã
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() ã¯ã次ã®ãããªãã¤ãã£ã颿°æååãè¿ãã¾ãã
function someName() { [native code] }
ãªãã¸ã§ã¯ãã®ã¡ã½ããã颿°ã«ã¤ãã¦ã¯ã someName ã¯é¢æ°ã®åæåã§ãããã以å¤ã®å ´åãã³ã³ãã³ãã¯å®è£
ã«ãã£ã¦å®ç¾©ãããå ´åãããã¾ããã常ã«ããããã£åã®æ§æãä¾ãã°ã[1 + 1]ãsomeNameã1 ãªã©ã¨ãªãã¾ãã
ã¡ã¢:
ããã¯ããã¤ãã£ã颿°æååã§ eval() ã使ç¨ãããã¨ã¯ãæ§æã¨ã©ã¼ã§ãããã¨ãä¿è¨¼ããã¦ããã¨ãããã¨ãæå³ãã¦ãã¾ãã
toString() ã¡ã½ããã Function ã³ã³ã¹ãã©ã¯ã¿ã¼ã«ãã£ã¦ä½æããã颿°ã«å¯¾ãã¦å¼ã³åºãããã¨ã 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() ãå¼ã³åºãããå ´åãå®è£
ã§ã¯ãã¤ãã£ã颿°æååã§ã¯ãªã颿°ã®ã½ã¼ã¹ãåæãããã¨ã¯æ±ºãã¦è¨±å¯ãããªããã¨ã«æ³¨æãã¦ãã ããããã®ã¡ã½ããã¯å¸¸ã«ã颿°ã使ããããã«ä½¿ç¨ãããæ£ç¢ºãªã½ã¼ã¹ã³ã¼ããè¿ãã¾ããä¾ãã°ãã²ãã¿ã¼ãã»ãã¿ã¼ã®ä¾ãå«ã¾ãã¾ãã 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 > |