Как деструктурировать значения по умолчанию из строки - PullRequest
0 голосов
/ 01 июня 2019

Мне интересно, как я могу деструктурировать значения по умолчанию из строки.Например, возьмите следующий код:

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), однако,Я получаю сообщение об ошибке:

Uncaught TypeError: String.prototype.valueOf требует, чтобы 'this' было строкой

Я думал, что это потому, что я не могудеструктурировать методы из объектов, но мое тестирование говорит мне иначе:

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

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

Итак, я хотел бы знать две вещи:

  • Как мне передать исходную строку в мою функцию f Разрушая свои аргументы (возможно ли это?)

  • Почему я получаю сообщение об ошибке с моим первым битом кода, но не с другим?

Ответы [ 2 ]

3 голосов
/ 01 июня 2019

Это не имеет ничего общего с деструктуризацией, деструктурирование - просто сахар вокруг переменных назначений:

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

  valueOf.call("other"); // works
3 голосов
/ 01 июня 2019

Это невозможно. После деструктуризации метода из объекта у вас остается только ссылка на базовую функцию, но не исходный объект (или, в данном случае, исходная строка) - без this для извлечения значения from, метод 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 работает, потому что он не зависит от какого-либо вызывающего контекста - он также может быть просто автономной функцией.

Обратите внимание, что если вы передаете объект со строкой в ​​качестве свойства, это будет возможно, хотя вам придется поместить строку в отдельную переменную, поэтому вы можете считать ее обманом :

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" });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...