No soy un desarrollador de JavaScript, pero solo quiero saber la forma correcta de verificar que una variable contenga un número o no. Después de un par de análisis, llegué a la siguiente solución. ¿Es la forma correcta?
function calculation(n1,n2 , ...numbers) { let validateNumber = (num) => { if(num !== num) return 0; else return typeof num === 'number' ? num : 0; } let sum =0; for(n of numbers){ sum += validateNumber(n); } console.log(sum); } calculation(5,6,7,'gg','',null, NaN, undefined, null,8,9,5.4,10);Verifique la función de flecha 'validateNumber'.
Primera versión =>
-- simplemente use isNaN() : sum+(isNaN(val)?0:Number(val)
Segunda versión (preguntada en el comentario aquí) =>
-- simplemente use una comparación estricta. para obtener solo valores de tipo numérico.
const calculation =(...numbers)=> // (n1,n2 , ...numbers)=> numbers.reduce((sum,val)=> sum + (Number(val)===val ? val : 0) // sum+(isNaN(val)?0:Number(val)) , 0); console.log( calculation(5,6,7,'gg','',null, NaN, undefined, null,8,9,5.4,'10') )Para mayor claridad, aquí hay una tabla que muestra la ejecución de la prueba según los diferentes tipos posibles
const testFunction = val => Number(val)===val , values = [ { v: 123, display: `123`, expected: true } , { v: '123', display: `"123"`, expected: false } , { v: NaN, display: `NaN`, expected: false } , { v: undefined, display: `undefined`, expected: false } , { v: null, display: `null`, expected: false } ] , tBody = document.querySelector('table > tbody') ; let score = 0 ; for (let {v, display, expected} of values) { let TR = tBody.insertRow() , res = testFunction(v) ; score += expected===res ? 1 : 0 TR.insertCell().textContent = display TR.insertCell().textContent = expected TR.insertCell().textContent = res TR.insertCell().className = expected===res ? 'ok' : 'bad' } document.querySelector('table >tfoot td:nth-of-type(2)') .textContent = `${score} / ${values.length}` table { font-family: Arial, Helvetica, sans-serif;border-collapse: collapse;margin: 0 1em; } td { padding: .2em .8em;border: 1px solid darkblue; } thead,tfoot { background-color: #84a4ce;text-transform: capitalize; } caption { padding: .3em;caption-side: bottom;font-size: .8em; } .ok:before,.bad:before { font-weight: bold;font-size: 1.2em; } .ok:before { color: green;content: '\2713'; } .bad:before { color: red; content: '\2718'; } <table> <caption>( Number(val)===val ) ?</caption> <thead> <tr> <td>val</td><td>expected</td><td colspan="2">result</td> </tr> </thead> <tbody></tbody> <tfoot> <tr> <td colspan="3">score</td><td>0/0</td> </tr> </tfoot> </table>Sí, hay una función integrada en JavaScript para verificar si un cierto valor es un número o no, que es isNaN()
Si desea obtener la suma de todos los números en la matriz, puede intentar usar reduce() de la siguiente manera:
var data = [5,6,7,'gg','',null, NaN, undefined, null,8,9,5.4,10]; var sum = data.reduce((a,c) =>{ if(!isNaN(c)){ a = a + Number(c); //convert the '' and null to 0 with Number() } return a; },0); console.log(sum)Sí, también es de una sola línea.
export const isNum = n => Number(n) === Number(n); Primero analice para numerar qué parámetro de Eva obtiene para compararlo consigo mismo. Uno de ellos, what the hell's viene con JavaScript es que NaN !== NaN , por lo que si el valor que obtienes después de forzarlo a ser un número se convierte en sa Nan, será diferente de sí mismo.