I believe #5744 introduced a behavioral difference between development and production versions of React. We released it as a part of 15.0, and this difference still exists.

The production behavior hasn’t changed. However the development behavior diverged after this change.

``` js
var el = React.createElement('div', { key: undefined })
document.body.innerHTML = (typeof el.key) + ' ' + el.key
```

What do you expect to appear?
### 0.14.x
- Development (https://jsfiddle.net/sjLcmnq6/1/): `object null`
- Production (https://jsfiddle.net/qro1wck0/1/): `object null`
## 15.x
- Development (https://jsfiddle.net/69z2wepo/43538/):  **`string undefined`**
- Production (https://jsfiddle.net/rakg6uwy/1/): `object null`

The 15.x dev behavior is different because [dev code path only checks the existence of a property but not whether it’s undefined](https://github.com/alitaheri/react/blob/c3980a6d08257d39a08bed8b116d53a56344166b/src/isomorphic/classic/element/ReactElement.js#L130-L133) whereas the [prod code path checks for undefined explicitly](https://github.com/alitaheri/react/blob/c3980a6d08257d39a08bed8b116d53a56344166b/src/isomorphic/classic/element/ReactElement.js#L135-L136).

`React.cloneElement()` is not affected because it doesn’t include those warnings.

---

This doesn’t seem like a major problem (nobody noticed it!) in the real world, but I think we should fix this.
I have a related fix in the works so I’ll add some more tests and include it.

key = !hasOwnProperty.call(config, 'key') ||
        Object.getOwnPropertyDescriptor(config, 'key').get ? null : '' + config.key;
    } else {
      ref = config.ref === undefined ? null : config.ref;
      key = config.key === undefined ? null : '' + config.key;
    }
    self = config.__self === undefined ? null : config.__self;
    source = config.__source === undefined ? null : config.__source;
    
    for (propName in config) {
      if (hasOwnProperty.call(config, propName) &&
          !RESERVED_PROPS.hasOwnProperty(propName)) {
        props[propName] = config[propName];
      }
    }
  }
  
  
  var childrenLength = arguments.length - 2;
  if (childrenLength === 1) {
    props.children = children;
  } else if (childrenLength > 1) {
    var childArray = Array(childrenLength);
    for (var i = 0; i < childrenLength; i++) {
      childArray[i] = arguments[i + 2];
    }
    props.children = childArray;
  }
  
  if (type && type.defaultProps) {