не совместимая с браузером неожиданная «неопределенная» строка при использовании уничтожения объекта - PullRequest
0 голосов
/ 29 мая 2018

Когда я пытаюсь использовать синтаксис уничтожения объектов в некоторых браузерных консолях, происходит нечто неожиданное.Сначала я ввел

action = {
      type: "SET_APPS_UI_REVERT",
      device: 23456,
      managedApps: "12345"
    }

, а затем

( { type, status, appsInfo, device,managedApps,appName } = action);

наконец

status

Поэтому и Chrome, и Firefox решили дать мне "undefined", что является строкой, а не неопределенное значение, в то время как край дал бы мне обычный undefined.Однако, когда я набрал

const { type, status, appsInfo, device,managedApps,appName } = action

, а затем

status

по краю, это дает мне "" вместо undefined.

Является ли это результатомкакого-то несоответствия браузера?Или на самом деле некоторые ошибки?

Скриншоты ниже

chrome-66-0-3359-181-no-const.PNG chrome-66-0-3359-181-no-const.PNG

edge-41-16299-402-0-with-edgehtml-16-16299-no-const.PNG edge-41-16299-402-0-with-edgehtml-16-16299-no-const.PNG

edge-41-16299-402-0-with-edgehtml-16-16299-with-const.PNG edge-41-16299-402-0-with-edgehtml-16-16299-with-const.PNG

firefox-60-0-1-no-const.PNG firefox-60-0-1-no-const.PNG

1 Ответ

0 голосов
/ 30 мая 2018

Используя следующий синтаксис:

( { type, status, appsInfo, device,managedApps,appName } = action);

Вы явно говорите "destructure action.status к существующей переменной status.

Если вы не 't уже имеет переменную с именем status в локальной области видимости, тогда он попытается присвоить action.status свойству window.status . Это свойство принимает только строку, поэтому, когда action не имеетstatus свойство, вы фактически сделали это:

window.status = undefined;

Поскольку window.status приводит к строке, когда это считывается, вы получаете window.status === "undefined";.

Даже еслиэто не имеет никакого эффекта на строке состояния в Firefox, оно все еще демонстрирует поведение.

Ваша вторая часть также ожидаемое поведение:

const { type, status, appsInfo, device,managedApps,appName } = action

Отличаетсяиз-за того, что вы объявляете переменную scoped с именем status. В этом и заключается разница между браузерами. В Chrome, когда вы объявляете const status в devtools, devtools считается «областью действия»и вы можете получить к нему доступ после того, как он объявлен.Тем не менее, вы можете объявить const в Dev Tools, но вы никогда не сможете получить доступ к значению. Ссылка .

Итак, в Edge вы получаете такое поведение:

{
    const status = action.status;
    typeof status === "undefined"; // true
}
status; // The value of window.status. const status is out of scope
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...