Lesson 30-In-Depth Analysis of JavaScript Type System and Data Structures

Comprehensive Analysis of JavaScript Type System

Basic Concepts of JavaScript Type System

JavaScript is a dynamically typed language, meaning variables do not require type declarations, and types are determined at runtime. The JavaScript type system is divided into two main categories: Primitive Types and Object Types.

// Primitive types example
let name = 'John'; // string
let age = 30;      // number
let isStudent = true; // boolean
let nothing = null; // null
let notDefined;    // undefined
let symbolValue = Symbol('unique'); // Symbol
let bigIntValue = 9007199254740991n; // BigInt

// Object types example
let person = { name: 'John', age: 30 }; // Object
let numbers = [1, 2, 3]; // Array
let func = function() { console.log('Hello'); }; // Function

In-Depth Analysis of Primitive Types

JavaScript has seven primitive types, each with unique characteristics and behaviors:

  1. String: Represents textual data.
  2. Number: Represents numeric values (integers and floating-point numbers).
  3. Boolean: Represents logical values true and false.
  4. Null: Represents an intentional absence of value.
  5. Undefined: Represents an uninitialized variable.
  6. Symbol: Represents unique, immutable values (introduced in ES6).
  7. BigInt: Represents integers of arbitrary precision (introduced in ES2020).
// String type in-depth
let str1 = 'Hello';
let str2 = "World";
let str3 = `Template ${str1} ${str2}`; // Template literal

// Number type in-depth
let intNum = 42;
let floatNum = 3.14;
let inf = Infinity;
let nan = NaN; // Not a Number

// Boolean type in-depth
let boolTrue = true;
let boolFalse = false;

// Null and Undefined
let nullValue = null;
let undefinedValue; // Unassigned variable

// Symbol type in-depth
let sym1 = Symbol('description');
let sym2 = Symbol('description');
console.log(sym1 === sym2); // false, each Symbol is unique

// BigInt type in-depth
let bigIntNum = 9007199254740991n; // Value exceeding Number safe integer range

Type Detection and Type Conversion

JavaScript provides multiple methods for type detection and conversion:

// Type detection
typeof 'hello'; // 'string'
typeof 42;      // 'number'
typeof true;    // 'boolean'
typeof null;    // 'object' (historical bug)
typeof undefined; // 'undefined'
typeof Symbol('sym'); // 'symbol'
typeof 9007199254740991n; // 'bigint'
typeof {};      // 'object'
typeof [];      // 'object'
typeof function() {}; // 'function'

// More precise type detection
Object.prototype.toString.call(null); // '[object Null]'
Object.prototype.toString.call(undefined); // '[object Undefined]'
Object.prototype.toString.call([]); // '[object Array]'
Object.prototype.toString.call({}); // '[object Object]'

// Type conversion
Number('123'); // 123
String(123);   // '123'
Boolean(0);    // false
Boolean('');   // false

// Implicit type conversion
'5' + 2;       // '52' (string concatenation)
'5' - 2;       // 3 (numeric subtraction)
'5' * '2';     // 10 (numeric multiplication)
'5' / '2';     // 2.5 (numeric division)

JavaScript Object Type System

Overview of Object Types

Objects in JavaScript are collections of properties, each a key-value pair. Objects are the most complex data type and form the basis for object-oriented programming.

// Basic object
let person = {
  name: 'John',
  age: 30,
  greet: function() {
    console.log(`Hello, my name is ${this.name}`);
  }
};

// Accessing object properties
person.name;     // 'John'
person['age'];   // 30
person.greet();  // Call method

Built-in Object Types

JavaScript provides several built-in object types, each serving specific purposes:

  1. Array: Ordered collection of data.
  2. Function: Executable code block.
  3. Date: Represents dates and times.
  4. RegExp: Regular expression.
  5. Map: Key-value pair collection (introduced in ES6).
  6. Set: Collection of unique values (introduced in ES6).
  7. Promise: Represents asynchronous operations (introduced in ES6).
  8. Error: Represents errors.
// Array example
let numbers = [1, 2, 3];
numbers.push(4); // Add element
numbers.pop();   // Remove last element

// Function example
function add(a, b) {
  return a + b;
}
const arrowAdd = (a, b) => a + b;

// Date example
let now = new Date();
let specificDate = new Date(2023, 0, 1); // January 1, 2023

// RegExp example
let pattern = /hello/i;
pattern.test('Hello world'); // true

// Map example
let map = new Map();
map.set('key', 'value');
map.get('key'); // 'value'

// Set example
let set = new Set();
set.add(1);
set.add(2);
set.has(1); // true

// Promise example
let promise = new Promise((resolve, reject) => {
  setTimeout(() => resolve('Done'), 1000);
});
promise.then(result => console.log(result));

// Error example
try {
  throw new Error('Something went wrong');
} catch (err) {
  console.error(err.message);
}

Object Prototypes and Inheritance

JavaScript uses prototype chains for inheritance, a core mechanism for object-oriented programming.

// Prototype chain basics
function Animal(name) {
  this.name = name;
}

Animal.prototype.speak = function() {
  console.log(`${this.name} makes a noise.`);
};

function Dog(name) {
  Animal.call(this, name); // Call parent constructor
}

// Set prototype chain
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;

// Add subclass method
Dog.prototype.bark = function() {
  console.log(`${this.name} barks.`);
};

const dog = new Dog('Rex');
dog.speak(); // Inherited from Animal
dog.bark();  // Dog's own method

// ES6 class syntax (syntactic sugar, still prototype-based)
class AnimalClass {
  constructor(name) {
    this.name = name;
  }

  speak() {
    console.log(`${this.name} makes a noise.`);
  }
}

class DogClass extends AnimalClass {
  constructor(name) {
    super(name); // Call parent constructor
  }

  bark() {
    console.log(`${this.name} barks.`);
  }
}

const dogClass = new DogClass('Buddy');
dogClass.speak();
dogClass.bark();

Membership Required

You must be a member to access this content.

View Membership Levels

Already a member? Log in here

Share your love