Me sorprendieron los resultados descritos en esta respuesta y respaldados por este punto de referencia que compara esa solución (JavaScript nativo) con la que propuse (Lodash) .
También he comparado la solución propuesta:
const obj = { name: undefined, age: 15, school: 'Some school' } const hasOnly = (obj,props) => { var objProps = Object.keys(obj) return objProps.length == props.length && props.every(p => objProps.includes(p)) } console.log(hasOnly(obj,['name','age'])) //return false console.log(hasOnly(obj,['name','age','city'])) //return false console.log(hasOnly(obj,['name','age','school'])) //return truecon uno en el que realmente simplemente cambio de cada función nativa a la función correspondiente en Lodash,
hasOnly = (obj,props) => { const objProps = _.keys(obj) return _.size(objProps) == _.size(props) && _.every(_.includes(objProps), props); }y el resultado sigue siendo decepcionante a favor de la solución nativa .
Ahora, el de arriba puede ser un ejemplo tonto, pero aun así... > ¿90% más lento? Entonces, ¿para qué estoy usando Lodash? Quiero decir, en diferentes escenarios puede mejorar la legibilidad, especialmente cuando las funciones tienen que ser parcialmente aplicadas y pasadas, donde Lodash te ahorra mucho x => x. (ejemplo clásico arrayOfarrays.map(_.map(fOnTheElements)) en lugar de arrayOfarrays.map(arr => arr.map(fOnTheElements)) ), pero si el rendimiento es tan bajo, entonces es un poco difícil hacer que la expresividad sea suficiente para elegir Lodash sobre el código nativo.
Soy nuevo en JavaScript y Lodash (pero no totalmente nuevo en programación funcional), por lo que ni siquiera conozco la confiabilidad de la herramienta de referencia que se usó en la respuesta vinculada, pero no puedo creer que sea tan malo. trabajo que invierte el resultado.
Lodash es solo javascript. No hay magia que pueda hacerlo más rápido que el código nativo en el que está escrito.
En resumen, cada llamada de método tiene una sobrecarga. entonces si lo hago
const len = myArr.lengthy lo hace
const len = _.size(myArr); y asumimos que la implementación de _.size es
function size(arr){ return arr.length }(Hace más que eso, ¡pero quédese conmigo aquí!) Entonces, al menos, tiene una llamada de método adicional que la solución nativa no tiene.
De hecho, _.size hace incluso más que solo verificar la longitud
Obtiene el tamaño de la colección devolviendo su longitud para valores similares a una matriz o el número de propiedades con clave de cadena enumerables propias para los objetos.
Entonces, además de una llamada de método adicional, tiene el código para verificar el "número de propiedades enumerables con clave de cadena". ¿Realmente es de extrañar que una solución nativa sea más rápida?
Entonces, ¿por qué usar una biblioteca como lodash? Porque como su documentación titula:
Lodash facilita JavaScript al eliminar la molestia de trabajar con matrices, números, objetos, cadenas, etc.
Por lo tanto, sacrifica un poco de velocidad por legibilidad y facilidad de uso.