# Data Types JavaScript is a weakly (loosely) typed language as opposed to Swift that is a strongly typed language. #### Example of a weakly typed language In this example the type `name` is not strongly tied to forever be a `String`. Re-assigning the data type to be a `Number` does not cause a compile-time error like a language like Swift. This causes the developer to check types when working through various coding logic. ```javascript let name = "Alex"; // name here is a string name = 10; // name is now a number console.log(`${name + 7}`); // name here is a number ``` #### Example of a strongly typed language In this Swift example we would get a compile time error as we cannot re-assign the name data type to an `Int`. ```swift var name = "Alex"; name = 10; // COMPILER ERROR - cannot assign type Int to expected type String print("\(name + 7)") // COMPILER ERROR - cannot convert value Int to expected value String ``` ## Simple Types * Number (float) * String * Boolean * Date * Function * Array * Object ## Special Types * NaN * null * undefined ## Checking Type #### `typeof` Returns a string of the data type primitive. ```javascript typeof('hello'); // string typeof(2); // number typeof(true); // boolean ``` #### `instanceof` Returns a Boolean of if a value matches the data type. ```javascript let str = new String() // new instance of String if (str instanceof String) { console.log('It is a String value') // It is a String value } ``` #### More examples of testing `typeof` and `instanceof` ```javascript const fellows = ['Brian', 'Herb', 'Ashley', 'Kim']; const isFriday = true; const year = 2020; const description = 'Incredible'; const person = { 'firstName': 'Alex', 'lastName': 'Paul' }; function greeting(aPerson) { console.log(`The person\'s first name is ${aPerson.firstName}`); } console.log('----typeof----'); console.log(typeof fellows); // object console.log(typeof isFriday); // boolean console.log(typeof year); // number console.log(typeof description); // string console.log(typeof person); // object console.log(typeof greeting); // function console.log('----instanceof----'); console.log(fellows instanceof Array); // true console.log(isFriday instanceof Boolean); // false console.log(year instanceof Number); // false console.log(description instanceof String); // false console.log(person instanceof Object); // true console.log(greeting instanceof Function); // true ``` > Note: console.log(isFriday instanceof Boolean) returns false since this is a literal declaration and NOT a constructor instance. A constructor instance would be ```javascript let newStringInstance = new String('Hello'); console.log(newStringInstance instanceof String); // true ``` #### Using `typeof` check in a function ```javascript function add(a, b) { if ((typeof a === 'number') && (typeof b === 'number')) { return a + b; } return -1; } console.log(add('alex', 5)); // -1 console.log(add(10, 5)); // 15 ``` ## Equality ```javascript let x = 0 == ''; // true, type coerced (evaluates as the same type) let x = 0 === ''; // false, better usage for equality as it respects the types in the case of `===` ``` > Reminder: Always use the `===` to test types for equality. ## Challenges #### Challenge 1 Fill out the correct data type next to the comments in the code below ```javascript const length = 16; // const lastName = 'Johnson'; // const x = { firstName: 'John', lastName: 'Doe' }; // ```
Solution ```javascript const length = 16; // number const lastName = 'Johnson'; // string const x = { firstName: 'John', lastName: 'Doe' }; // object ```
*** #### Challenge 2 Complete the following data type predictions. ```javascript typeof(15) // Prediction: // Actual: typeof(5.5) // Prediction: // Actual: typeof(NaN) // Prediction: // Actual: typeof("hello") // Prediction: // Actual: typeof(true) // Prediction: // Actual: typeof(1 != 2) // Prediction: // Actual: ```
Solution ```javasctipt typeof(15) // Prediction: number // Actual: number typeof(5.5) // Prediction: number // Actual: number typeof(NaN) // Prediction: number // Actual: number typeof("hello") // Prediction: string // Actual: string typeof(true) // Prediction: boolean // Actual: boolean typeof(1 != 2) // Prediction: boolean // Actual: boolean ```
***