Это потому, что JSX
является синтаксическим сахаром для React.createElement(component, props, ...children)
Он будет игнорировать эти типы (см. DOCS ):
Я только что понял, что это происходит только в некоторых редакторах, таких как codepen, потому что они запускают код в глобальном контексте и в окне .имя всегда будет строкой .
window.name преобразует все значения в их строковые представления с помощью метода toString.
Если вы измените переменную на что-то другое, скажем, name1
itведет себя как ожидалось.
const name1 = undefined;
const myFunc = function(){return undefined};
let template = (
<div>
{name1}
{undefined}
{myFunc()}
</div>
);
Кстати, фрагменты стека ведут себя одинаково:
console.log('name is ', name);
const name = undefined;
console.log('and now name is ', name);
const name1 = undefined;
const myFunc = function(){return undefined};
let template = (
<div>
{name}
{name1}
{undefined}
{myFunc()}
</div>
);
ReactDOM.render(template, document.querySelector("#root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>
Другие редакторы, такие как codesandbox
или jsfiddle
, будут переносить код в функцию, следовательно, нет конфликта с window.name
.