Traceur has:
function assign(target, source) {
var props = $getOwnPropertyNames(source);
var p, length = props.length;
for (p = 0; p < length; p++) {
target[props[p]] = source[props[p]];
}
return target;
}
Which is correct.
Almost correct ;-)
Exception handling and enumerable checks are missing. And calling
$getOwnPropertyNames() is not fully compatible when compared to
[[OwnKeys]] in some Proxy corner cases [1], but that's difficult to get
right in ES5 code.
[1]
https://github.com/anba/es6draft/blob/master/src/test/scripts/suite/objects/Object/assign.js#L166-L181
A more conformant implementation should be this one:
function assign(target, source) {
function ToObject(o) {
if (o == null) {
throw new TypeError();
}
return Object(o);
}
var to = ToObject(target);
var from = ToObject(source);
var keys = $getOwnPropertyNames(from);
var pendingException = null;
for (var i = 0, length = keys.length; i < length; ++i) {
var nextKey = keys[i];
try {
var desc = $getOwnPropertyDescriptor(from, nextKey);
if (desc !== undefined && desc.enumerable) {
to[nextKey] = from[nextKey];
}
} catch (e) {
if (pendingException !== null) {
pendingException = e;
}
}
}
if (pendingException !== null) {
throw pendingException;
}
return to;
}
- André
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss