2017-02-01 6 views
1

Наблюдая странное поведение в моей карте функции:функция Карта возвращения массива с индексом вместо значения строки

let tpl = ({x}, y = `This is ${x}`) => y; 
 
    
 
console.log(tpl({x:5})); //correctly returns 'This is 5' 
 

 
console.log([{x:1}, {x:9}].map(tpl)); //expecting array of strings, instead get [0, 1]

можно «исправить» это, опуская переменную y по умолчанию, и возвращение строка шаблона непосредственно из tpl. Тем не менее, я бы предпочел сделать инициализацию таким образом и не могу понять, почему она не будет работать.

Кажется, странная аномалия для меня, кто-то имеет представление о чем-то, что мне не хватает?

+0

Почему именно вы предпочитаете, чтобы инициализировать его с 'y', когда вы можете просто вернуть шаблон строку непосредственно, как вы сказали? Это потому, что вы иногда передаете в необязательную строку шаблона, чтобы переопределить значение по умолчанию? –

+0

Это своего рода надуманный пример того, что я хочу сделать (например, например, может быть результатом вызова функции), но в основном это касается эстетики; Мне нравится концепция одного символа. – Conqueror

ответ

3

tpl функция предоставляется (value, index, array) по карте JavaScript Метод массива. Вы указали y значение по умолчанию This is ${x}. Но когда вы передаете tpl в качестве обратного вызова map, y не является неопределенным, поэтому значение по умолчанию не используется. map передает индекс вашему параметру y.

let tpl = ({x}, y = `This is ${x}`) => y 
const arr = [ {x:1}, {x:9} ]; 
arr.map(tpl) // [0, 1] 
arr.map((value, index, array) => tpl(value)) // [ 'This is 1', 'This is 9' ] 

Array.prototype.map()

Default parameters

+0

Благодарим вас за это понимание - это прояснило мое замешательство. – Conqueror

+0

Удивительный, без проблем @Conqueror –