Skip to content Skip to footer

Unraveling the Mystery of .has in JavaScript: A Deep Dive with Code Samples

JavaScript, our beloved language for making web magic happen, has evolved over the years, and with it, a plethora of methods have emerged to simplify our coding lives. Today, we’re peeling back the layers of the .has method. No, not the .hasOwnProperty you might be thinking of, but the .has that’s often seen hanging out with data structures like Set and Map. Let’s dive in and explore how this method works across different frameworks.

.has in Vanilla JavaScript

In plain old JavaScript, .has is a method available on Set and Map objects. It’s used to check for the presence of an element in a Set or a key in a Map. Here’s a quick look at how it works.

Checking Elements in a Set

const bandMembers = new Set(['Vocals', 'Guitar', 'Bass', 'Drums']);

// Check if 'Guitar' is part of the set
console.log(bandMembers.has('Guitar')); // true

// What about 'Keyboard'?
console.log(bandMembers.has('Keyboard')); // false

It’s pretty straightforward, right? A Set is like a group of unique items at a party, and .has is like asking if someone is on the guest list.

Verifying Keys in a Map

const albumReleaseYears = new Map([
  ['Nevermind', 1991],
  ['Ten', 1991],
  ['Dookie', 1994]
]);

// Is 'Ten' in our music Map?
console.log(albumReleaseYears.has('Ten')); // true

// How about 'The Dark Side of the Moon'?
console.log(albumReleaseYears.has('The Dark Side of the Moon')); // false

.has with Lodash

When you’re dealing with objects and arrays, Lodash, a utility library that provides clean methods for common tasks, can be a lifesaver. Lodash doesn’t have a .has method per se, but it does have .hasIn for checking if path exists in an object.

Peeking into Objects with .hasIn

const _ = require('lodash');

const user = {
  name: 'Eddie Vedder',
  band: {
    name: 'Pearl Jam',
    members: 5
  }
};

// Check if 'band.members' path exists
console.log(_.hasIn(user, 'band.members')); // true

// Does our user have a 'soloAlbum' property?
console.log(_.hasIn(user, 'soloAlbum')); // false

For this to work, you’ll need to grab Lodash from NPM or include it from a CDN.

.has in jQuery

Ah, jQuery, the library that was once the Swiss Army knife for web developers. While jQuery doesn’t have a .has method that directly correlates with the JavaScript Set and Map .has, it does offer a .has() method that can be used to filter elements.

Filtering DOM Elements

// Let's say we have a list of bands, and some list items have nested <span> elements
$('li').has('span').addClass('highlight');

// This will add the 'highlight' class to every <li> that contains a <span>

This is handy for DOM manipulation, and if you’ve ever wrestled with vanilla JS to do this, you’ll appreciate the simplicity here.

.has in React

React, the popular front-end library developed by Facebook, doesn’t include a .has method out of the box. However, when you’re managing state, you might need to check if a property exists in an object or if a value is in an array within your state.

Stateful Check with Hooks

import React, { useState } from 'react';

const BandComponent = () => {
  const [bands, setBands] = useState(['Nirvana', 'Pearl Jam', 'Green Day']);

  const hasBand = (bandName) => {
    return bands.includes(bandName);
  };

  return (
    <div>
      {hasBand('Nirvana') && <p>Rock on! Nirvana is in the list.</p>}
      {!hasBand('Soundgarden') && <p>Soundgarden is not in the list.</p>}
    </div>
  );
};

In React, we often use .includes for arrays to achieve a similar effect to .has. It’s not quite the same, but it gets the job done.

.has in Angular

Angular, the full-blown front-end framework by Google, is all about structure and TypeScript. When you need to perform a check similar to .has, you might end up using TypeScript’s type checking or simple JavaScript methods within your Angular components.

TypeScript Approach in Angular Components

import { Component } from '@angular/core';

@Component({
  selector: 'app-band-checker',
  template: `
    <p *ngIf="hasBand('Radiohead')">Radiohead is in the hall of fame!</p>
    <p *ngIf="!hasBand('The Beatles')">The Beatles are missing from our list!</p>
  `
})
export class BandCheckerComponent {
  bands: string[] = ['Radiohead', 'Pink Floyd', 'Led Zeppelin'];

  hasBand(bandName: string): boolean {
    return this.bands.includes(bandName);
  }
}

Here, we’re using Angular’s structural directives along with a TypeScript method to check for a band’s presence in an array.

.has in Vue.js

Vue.js, the progressive JavaScript framework that’s all about the view layer, doesn’t have a .has method directly. But, similar to React, you can create computed properties or methods to check for the existence of a property or value.

Computed Properties for Reactive .has Checks

<template>
  <div>
    <p v-if="hasBand('Linkin Park')">Linkin Park is on the list!</p>
    <p v-if="!hasBand('My Chemical Romance')">My Chemical Romance is missing!</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      bands: ['Linkin Park', 'Red Hot Chili Peppers', 'Foo Fighters']
    };
  },
  methods: {
    hasBand(bandName) {
      return this.bands.includes(bandName);
    }
  }
};
</script>

In Vue.js, the reactivity system makes the UI updates a breeze when the state changes. Our method hasBand acts similarly to the .has method by checking the presence of a band in the bands array.

.has in Node.js

Node.js, the JavaScript runtime that lets us run JavaScript on the server, is a different beast. There’s no DOM to manipulate or components to render, but you might still need to check if an object contains a certain key.

Checking Object Keys in Node.js

const http = require('http');

// Let's pretend we have some configuration object
const config = {
  port: 3000,
  hostname: 'localhost',
  routes: {
    '/': 'home',
    '/about': 'about'
  }
};

http.createServer((req, res) => {
  // Check if the requested URL is a key in the routes object
  if (Object.hasOwn(config.routes, req.url)) {
    res.end(`Navigated to ${config.routes[req.url]}`);
  } else {
    res.end('404 Not Found');
  }
}).listen(config.port, config.hostname, () => {
  console.log(`Server running at http://${config.hostname}:${config.port}/`);
});

In Node.js, we often revert to the classic Object.hasOwn method to check for the existence of object keys, which is part of the ECMAScript 2022 standard and is the modern replacement for Object.hasOwnProperty.

.has with TypeScript

TypeScript, the superset of JavaScript that adds static types, doesn’t have a built-in .has method, but it provides interfaces and type checking that can be used to ensure properties exist.

Interface Checking with TypeScript

interface Band {
  name: string;
  albums: number;
}

function hasAlbums(band: Band): boolean {
  return 'albums' in band;
}

const nirvana: Band = { name: 'Nirvana', albums: 3 };
console.log(hasAlbums(nirvana)); // true

const unknownBand: Band = { name: 'Unknown' };
console.log(hasAlbums(unknownBand)); // false, since 'albums' property is missing

TypeScript’s in operator is a type-safe way to check if a property exists on an object that matches a certain interface.

Conclusion

The .has method and its equivalents are like the bouncers of the JavaScript world, keeping tabs on who’s in and who’s out. Whether you’re working with sets, maps, or simply checking for the existence of a property, .has provides a straightforward way to perform these checks.

Across different frameworks and environments, the concept of .has might take different forms, but the underlying principle remains the same: checking for the presence of an element or key. By understanding how to implement these checks in various contexts, you can write more robust and maintainable code that gracefully handles the dynamic nature of JavaScript data structures.

So, the next time you’re knee-deep in code, remember these patterns. They’re the secret handshake that can make or break your application’s logic. And with that, you’ve got the know-how to wield the power of .has like a pro!