Javascript [Symbol.toPrimitive](提示)转换函数

Javascript [Symbol.toPrimitive](hint) to convert function

在JS函数中属于对象类型。可以使用 [Symbol.toPrimitive](hint) 将对象转换为基本类型。这种纯对象转换工作正常:

let obj = {
  [Symbol.toPrimitive](hint) {
    switch(hint) {
      case "string": return "all right";
      case "number": return 100;
      default: return "something else";
    }
  }
};

alert(obj); // all right
alert(+obj); // 100

但是,函数转换出了点问题:

function fun() {
  [Symbol.toPrimitive](hint) { // JS engine starts to complain here
    switch(hint) {
      case "string": return "all right";
      case "number": return 100;
      default: return "something else";
    }
  }
}

alert(fun);
alert(+fun);

我在这里错过了什么?如何将函数转换为原始类型?

function(...){ 之后的 { 块内部只能是函数体。要分配给函数对象的 属性,您必须在 之后 声明函数:

function fun() {
}
fun[Symbol.toPrimitive] = function(hint){ // JS engine starts to complain here
  switch(hint) {
    case "string": return "all right";
    case "number": return 100;
    default: return "something else";
  }
};

console.log(fun);
console.log(+fun);

您需要对函数的Symbol.toPrimitive属性进行寻址,并分配一个函数。

否则你会使用一个带有符号的数组并尝试用它调用一个不存在的函数。

function fun() {
}

fun[Symbol.toPrimitive] = function (hint) {
    switch(hint) {
        case "string": return "all right";
        case "number": return 100;
        default: return "something else";
    }
};

console.log(fun);
console.log(+fun);