Estoy tratando de entender por qué esta función enlazada se comporta de manera diferente cuando se llama de estas diferentes maneras. Aquí está el ejemplo.
var str = 'sss'; var f = str.endsWith.bind(str); // false? console.log(['s', 'q', 'r'].some(f)) // true console.log(['s', 'q', 'r'].some(value => f(value))) // true console.log(f('s'))¿Qué me estoy perdiendo? ¿Por qué la primera llamada no es verdadera?
Array.some() pasa 3 argumentos a la función de devolución de llamada: el elemento de matriz actual, su índice y la matriz.
String.endswith() toma un segundo argumento opcional, que se usa como la longitud de la cadena en lugar de su longitud real.
Así que la primera iteración llama
f('s', 0, ['s', 'q', 'q'])que es equivalente a
"sss".endsWith('s', 0) Si usa 0 como la longitud de la cadena, no termina con s , por lo que devuelve false .
Cuando usa su función value => f(value) , los argumentos adicionales se descartan, por lo que se usa la longitud predeterminada y la función funciona como se esperaba.