Позвольте мне добавить этот совет:
Если вы сомневаетесь, прочитайте спецификацию !
ECMA-262 - это спецификация языка сценариев, на котором JavaScript является диалектом. Конечно, на практике важно, как ведут себя самые важные браузеры, чем эзотерическое определение того, как что-то должно обрабатываться. Но полезно понять, почему новый String («a»)! == «a».
Пожалуйста, дайте мне пояснить, как прочитать спецификацию, чтобы прояснить этот вопрос. Я вижу, что в этой очень старой теме никто не получил ответа за очень странный эффект. Итак, если вы можете прочитать спецификацию, это очень поможет вам в вашей профессии. Это приобретенное умение. Итак, давайте продолжим.
Поиск файла PDF для === приводит меня на страницу 56 спецификации: 11.9.4. Оператор Strict Equals (===), и после прохождения через спецификацию я нахожу:
11.9.6 Алгоритм сравнения строгих равенств Сравнение x === y, где x и y являются значения, возвращает true или false. Такое сравнение выполняется следующим образом: & nbsp; 1. Если Type (x) отличается от Type (y), верните false. & NBSP; & NBSP; 2. Если Type (x) Undefined, верните true. & NBSP; & NBSP; 3. Если Type (x) - Null, верните true. & NBSP; & NBSP; 4. Если Type (x) не является числом, перейдите к шагу 11. & nbsp; & nbsp; 5. Если x является NaN, верните false. & NBSP; & NBSP; 6. Если y является NaN, верните false. & NBSP; & NBSP; 7. Если x - это то же числовое значение, что и y, верните true. & NBSP; & NBSP; 8. Если x равно +0, а y равно -0, верните true. & NBSP; & NBSP; 9. Если x равно -0 и y равно +0, верните true. & NBSP; & NBSP; 10. Вернуть false. & NBSP; & NBSP; 11. Если Type (x) - String, то верните true, если x и y - это точно такая же последовательность символов (одинаковая длина и одинаковые символы в соответствующих позициях); в противном случае верните false. & NBSP; & NBSP; 12. Если Type (x) является логическим, верните true, если x и y оба true или оба false; в противном случае верните false. & NBSP; & NBSP; 13. Верните true, если x и y относятся к одному и тому же объекту или относятся к объектам, соединенным друг с другом (см. 13.1.2). В противном случае верните false.
Интересным является этап 11. Да, строки рассматриваются как типы значений. Но это не объясняет, почему новый String («a»)! == «a».
Не так быстро!
Давайте проверим типы операндов. Попробуйте сами, обернув их в typeof (). Я обнаружил, что новый String («a») является объектом, и используется шаг 1: return false, если типы разные.
Если вам интересно, почему новая строка («a») не возвращает строка, как насчет некоторых упражнений, читающих спецификацию? Получите удовольствие!
Aidiakapi написал это в комментарии ниже:
Из спецификации
11.2.2 Новый оператор:
Если тип (конструктор) не является объектом, вызовите исключение TypeError.
Другими словами, если String не будет иметь тип Object, он не может использоваться с новым оператором.
new всегда возвращает объект, даже для конструкторов String. И увы! Семантика значения для строк (см. Шаг 11) потеряна.
И это, наконец, означает: новый String ("a")! == "a".
Я совершил небольшую ошибку. Тип контента был закодирован в URL, но я отправлял данные JSON. Спасибо @ADyson, который идентифицировал isue.
Вот правильный код.
var data = this.state;
var bodyData =
"username=" +
data.username +
"&password=" +
data.password +
"&grant_type=password";
const response = axios({
url: "http://localhost:56885/Token",
method: "post",
headers: {
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
},
data: bodyData
});
console.log(response);