Сравнение строки объекта, оператора идентификации stringify и строки - PullRequest
2 голосов
/ 11 мая 2019

Я работаю над компонентом реагией, и мой коллега столкнулся с этой проблемой с операторами идентификации и JSON.stringify (). Я не уверен, почему он использовал stringify в коде - но я был озадачен, почему эти блоки if / else не работали.

Почему некоторые из этих сравнений не работают, хотя оба имеют одинаковый тип?

Так что, если данные были сохранены в локальном хранилище, и они должны были выполнить JSON.stringify - каков следующий шаг, чтобы очистить данные, чтобы получить совпадение?

https://jsfiddle.net/g8x761y2/6/

const objOne = {
  fruit: 'strawberry',
  nutrients: {
    minerals: {
      name: 'calcium'
    }
  }
};

const objTwo = {
  fruit: 'strawberry',
  nutrients: {
    minerals: {
      name: 'calcium'
    }
  }
};

const fruit = "strawberry"


console.log("obj fruit", objOne.fruit)
console.log("string fruite", fruit)

console.log("obj fruit type", typeof(objOne.fruit))
console.log("string fruit type", typeof(fruit))

console.log("obj fruit stringify type", typeof(JSON.stringify(objOne.fruit)))

console.log("isMatch with two stringify", JSON.stringify(objOne.fruit) === JSON.stringify(fruit))
console.log("isMatch with just one stringify", JSON.stringify(objOne.fruit) === fruit)


if (JSON.stringify(objOne.fruit) === "strawberry") {
  console.log("1")
}

if (objOne.fruit === "strawberry") {
  console.log("2")
}

if (JSON.stringify(objOne.fruit) === "strawberry" && JSON.stringify(fruit) === "strawberry") {
  console.log("3")
}

if (objOne.fruit === "strawberry" && fruit === "strawberry") {
  console.log("4")
}

if (JSON.stringify(objOne.fruit) === "strawberry" && fruit === "strawberry") {
  console.log("5")
}

1 Ответ

2 голосов
/ 11 мая 2019

При использовании JSON.stringify на примитивах процесс строковой классификации должен быть в состоянии отразить тип примитива, которым он был изначально, так что десериализация с использованием JSON.parse приводит к идентичнойкопия.Так, когда JSON.stringify строка, вокруг строки помещаются двойные кавычки:

console.log(JSON.stringify('foo'));

Это должно отличать, например, строковую строку false от строкового логического из false (или строковой строки'23' из строкового числа из 23).

Таким образом, ваши тесты

JSON.stringify(objOne.fruit) === "strawberry"

не оцениваются в true, потому что этопроверка того, содержат ли

'"strawberry"' === "strawberry"

строки при строковом преобразовании разделители в их первом и последнем указателях, тогда как исходные строки не имеют этих разделителей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...