如何从字符串中解构默认值

时间:2019-06-01 10:35:01

标签: javascript string destructuring

我想知道如何从字符串中解构默认值。例如,采用以下代码:

function f({length, valueOf}) {
  console.log("The length is:", length);
  console.log("The string is:", valueOf()); // Expected: "The string is: foo"
}

f("foo");

上面,我试图获取传入的字符串的length以及字符串本身(即:通过调用valueOf),但是,我得到了一个错误:

  

未捕获的TypeError:String.prototype.valueOf要求'this'是一个   字符串

我当时以为这是因为我无法从对象中分解方法,但是我的测试却告诉我:

const obj = {
  id: 1,
  foo: function() {
    return "bar";
  }
}

const {id, foo} = obj;
console.log(id, foo());

所以,我想知道两件事:

  • 如何在破坏其参数的同时将原始字符串传递到函数f中(甚至可能吗?)

  • 为什么我的第一部分代码出现错误,而其他却没有?

2 个答案:

答案 0 :(得分:3)

不可能。从对象解构方法后,只剩下对基本函数的引用,而没有原始对象(或者,在这种情况下,是原始字符串)的引用-无需提取this valueOf方法中的值将不可调用。

出于类似的原因,如果您的foo试图从obj提取值,则将无法正常工作:

const obj = {
  id: 1,
  foo: function() {
    return this.id;
  }
}

const { foo } = obj;
// at this point, without referencing `foo` again, it's impossible to get the `id` of 1
console.log(foo());

您的原始foo之所以有效,是因为它不依赖于任何调用上下文-它也可能仅仅是一个独立的函数。

请注意,如果您将字符串作为属性传递了 object ,则有可能,尽管您必须将字符串放入独立变量中,所以您可以认为它是作弊:

function f({str: { length, valueOf}, str}) {
  console.log("The length is:", length);
  console.log("The string is:", valueOf.call(str)); // Expected: "The string is: foo"
}

f({ str: "foo" });

答案 1 :(得分:3)

这与销毁无关,销毁只是围绕变量分配的糖:

  const valueOf = "foo".valueOf;
  valueOf(); // same error

  valueOf.call("other"); // works