diff --git a/js/src/tooltip.js b/js/src/tooltip.js
index 9ad73328bed9fb214a8c9da82756ed58f517c3fb..1bda97e388caf614d6ceb52e9741ff1b9282e3e6 100644
--- a/js/src/tooltip.js
+++ b/js/src/tooltip.js
@@ -331,6 +331,10 @@ class Tooltip {
   }
 
   hide() {
+    if (!this._popper) {
+      return
+    }
+
     const tip = this.getTipElement()
     const complete = () => {
       if (this._hoverState !== HOVER_STATE_SHOW && tip.parentNode) {
diff --git a/js/tests/unit/tooltip.spec.js b/js/tests/unit/tooltip.spec.js
index 0a98096a405ecc25e2c9e595f1bfcbefa1aaa78e..3e5c9179401b77e41af3ae84fb501c613d61b142 100644
--- a/js/tests/unit/tooltip.spec.js
+++ b/js/tests/unit/tooltip.spec.js
@@ -717,6 +717,20 @@ describe('Tooltip', () => {
 
       tooltip.show()
     })
+
+    it('should not throw error running hide if popper hasn\'t been shown', () => {
+      fixtureEl.innerHTML = '<div></div>'
+
+      const div = fixtureEl.querySelector('div')
+      const tooltip = new Tooltip(div)
+
+      try {
+        tooltip.hide()
+        expect().nothing()
+      } catch {
+        throw new Error('should not throw error')
+      }
+    })
   })
 
   describe('update', () => {