Я пишу это в машинописи:Машинопись -> ES5 вопрос
const mask = [...Array(10)].map((item) => 0);
В консоли узла он производит массив из 10 нулей:
> [...Array(10)].map((item) => 0);
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]
После transpilied в JavaScript, она производит:
var mask = Array(10).slice().map(function (item) { return 0; });
Но это не эквивалентно:
> Array(10).slice().map(function (item) { return 0; })
[ , , , , , , , , , ]
У меня создалось впечатление, что машинопись должна содержать изофункциональный код. Был ли я неправ? Должен ли я обратить внимание на все, что производит TS?
Я использую узел v7, TSC 1.20150623.0 с этой конфигурацией:
{
"compilerOptions": {
"emitDecoratorMetadata": true,
"module": "commonjs",
"target": "ES5",
"outDir": ".tmp/js",
"rootDir": "js"
}
}
Я могу воспроизвести это, ** но **: ваши TS, копировать и вставить, работает отлично. «Карта» в форме JS терпит неудачу, но этого не должно быть. Что-то смешное происходит. – ssube
@ssube: JS ведет себя так, как ожидалось. Метод '.slice()' игнорирует дыры в массиве, поэтому это точное представление оригинала. См. [22.1.3.22 Array.prototype.slice (начало, конец)] (http://www.ecma-international.org/ecma-262/6.0/#sec-array.prototype.slice), в частности пункт 15 (d), где * kPresent * является результатом * HasProperty * текущего индекса. –
@squint не точно, 'slice' _does_ дает вам тот же массив, который имеет 10 пустых индексов. Однако '.map' будет игнорировать их как« функциональное »семейство методов -' forEach', 'map',' reduce', 'some' и т. Д., Только переходящие значения массива, которые присутствуют. – vlaz