C'est parce que JSX
est un sucre syntaxique pour React.createElement(component, props, ...children)
Il ignorera ces types (voir DOCS ):
Je viens de réaliser que cela n'arrive que sur certains éditeurs comme codepen car ils exécutent le code dans le contexte global et window.name sera toujours une chaîne de caractères .
window.name convertira toutes les valeurs en leur représentation sous forme de chaîne en utilisant la méthode toString.
Si vous changez la variable en quelque chose d'autre, par exemple name1
il se comporte comme prévu.
const name1 = undefined;
const myFunc = function(){return undefined};
let template = (
<div>
{name1}
{undefined}
{myFunc()}
</div>
);
D'ailleurs, les stack-snippets se comportent de la même manière :
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>
D'autres éditeurs comme codesandbox
o jsfiddle
enveloppera le code dans une fonction, il n'y a donc pas de conflit avec l'option window.name
.