diff --git a/app/assets/javascripts/behaviors/shortcuts/shortcuts_issuable.js b/app/assets/javascripts/behaviors/shortcuts/shortcuts_issuable.js
index 670f66b005efe5e64def57f05835d3a5011f5366..c8eb96a625ca3530e052442129c8f43beb43f7ae 100644
--- a/app/assets/javascripts/behaviors/shortcuts/shortcuts_issuable.js
+++ b/app/assets/javascripts/behaviors/shortcuts/shortcuts_issuable.js
@@ -37,7 +37,7 @@ export default class ShortcutsIssuable extends Shortcuts {
     }
 
     // Sanity check: Make sure the selected text comes from a discussion : it can either contain a message...
-    let foundMessage = !!documentFragment.querySelector('.md');
+    let foundMessage = Boolean(documentFragment.querySelector('.md'));
 
     // ... Or come from a message
     if (!foundMessage) {
diff --git a/app/assets/javascripts/boards/components/modal/index.vue b/app/assets/javascripts/boards/components/modal/index.vue
index 8e09e265cfb69c526d48f1a52a2f937f1afc9c99..defa1f75ba24fcdbad06106813ef10f684ab2c1e 100644
--- a/app/assets/javascripts/boards/components/modal/index.vue
+++ b/app/assets/javascripts/boards/components/modal/index.vue
@@ -124,7 +124,7 @@ export default {
           data.issues.forEach(issueObj => {
             const issue = new ListIssue(issueObj);
             const foundSelectedIssue = ModalStore.findSelectedIssue(issue);
-            issue.selected = !!foundSelectedIssue;
+            issue.selected = Boolean(foundSelectedIssue);
 
             this.issues.push(issue);
           });
diff --git a/app/assets/javascripts/boards/models/list.js b/app/assets/javascripts/boards/models/list.js
index 7e5d0e0f88879edc8395763aa3061daa2551dc11..08aecfab8a4da8ba501a62567e89bc9c4f47384f 100644
--- a/app/assets/javascripts/boards/models/list.js
+++ b/app/assets/javascripts/boards/models/list.js
@@ -37,8 +37,8 @@ class List {
     this.type = obj.list_type;
 
     const typeInfo = this.getTypeInfo(this.type);
-    this.preset = !!typeInfo.isPreset;
-    this.isExpandable = !!typeInfo.isExpandable;
+    this.preset = Boolean(typeInfo.isPreset);
+    this.isExpandable = Boolean(typeInfo.isExpandable);
     this.isExpanded = true;
     this.page = 1;
     this.loading = true;
diff --git a/app/assets/javascripts/branches/branches_delete_modal.js b/app/assets/javascripts/branches/branches_delete_modal.js
index f34496f84c61f38c393524e695b4a8e136717db6..f4c3fa185d8bb484681c7b04b95566cfbe3c2e14 100644
--- a/app/assets/javascripts/branches/branches_delete_modal.js
+++ b/app/assets/javascripts/branches/branches_delete_modal.js
@@ -23,7 +23,7 @@ class DeleteModal {
     const branchData = e.currentTarget.dataset;
     this.branchName = branchData.branchName || '';
     this.deletePath = branchData.deletePath || '';
-    this.isMerged = !!branchData.isMerged;
+    this.isMerged = Boolean(branchData.isMerged);
     this.updateModal();
   }
 
diff --git a/app/assets/javascripts/clusters/components/application_row.vue b/app/assets/javascripts/clusters/components/application_row.vue
index eb92a4dd980cce8e18f220dc44031f10be115735..7b173be599a70f9195892d5953ab508127c8ad1d 100644
--- a/app/assets/javascripts/clusters/components/application_row.vue
+++ b/app/assets/javascripts/clusters/components/application_row.vue
@@ -142,7 +142,7 @@ export default {
       );
     },
     hasLogo() {
-      return !!this.logoUrl;
+      return Boolean(this.logoUrl);
     },
     identiconId() {
       // generate a deterministic integer id for the identicon background
diff --git a/app/assets/javascripts/compare_autocomplete.js b/app/assets/javascripts/compare_autocomplete.js
index 37a3ceb5341e8afa2d500bb9b87e35be91da6cf1..5bfe158ceda923984163f66a75eeb079760bfbe0 100644
--- a/app/assets/javascripts/compare_autocomplete.js
+++ b/app/assets/javascripts/compare_autocomplete.js
@@ -40,7 +40,7 @@ export default function initCompareAutocomplete(limitTo = null, clickHandler = (
       },
       selectable: true,
       filterable: true,
-      filterRemote: !!$dropdown.data('refsUrl'),
+      filterRemote: Boolean($dropdown.data('refsUrl')),
       fieldName: $dropdown.data('fieldName'),
       filterInput: 'input[type="search"]',
       renderRow: function(ref) {
diff --git a/app/assets/javascripts/create_item_dropdown.js b/app/assets/javascripts/create_item_dropdown.js
index 916b190f469445a715dba25d13c45e362d14a3da..fa0f04c7d8274c5aff623b390ac61473c1dafeb4 100644
--- a/app/assets/javascripts/create_item_dropdown.js
+++ b/app/assets/javascripts/create_item_dropdown.js
@@ -12,7 +12,7 @@ export default class CreateItemDropdown {
     this.fieldName = options.fieldName;
     this.onSelect = options.onSelect || (() => {});
     this.getDataOption = options.getData;
-    this.getDataRemote = !!options.filterRemote;
+    this.getDataRemote = Boolean(options.filterRemote);
     this.createNewItemFromValueOption = options.createNewItemFromValue;
     this.$dropdown = options.$dropdown;
     this.$dropdownContainer = this.$dropdown.parent();
diff --git a/app/assets/javascripts/error_tracking_settings/store/getters.js b/app/assets/javascripts/error_tracking_settings/store/getters.js
index a008b181907901e3b9b1b213be30248145288857..d77e5f1546985572f80602bc38c0791e01e0d788 100644
--- a/app/assets/javascripts/error_tracking_settings/store/getters.js
+++ b/app/assets/javascripts/error_tracking_settings/store/getters.js
@@ -2,10 +2,10 @@ import _ from 'underscore';
 import { __, s__, sprintf } from '~/locale';
 import { getDisplayName } from '../utils';
 
-export const hasProjects = state => !!state.projects && state.projects.length > 0;
+export const hasProjects = state => Boolean(state.projects) && state.projects.length > 0;
 
 export const isProjectInvalid = (state, getters) =>
-  !!state.selectedProject &&
+  Boolean(state.selectedProject) &&
   getters.hasProjects &&
   !state.projects.some(project => _.isMatch(state.selectedProject, project));
 
diff --git a/app/assets/javascripts/frequent_items/store/actions.js b/app/assets/javascripts/frequent_items/store/actions.js
index 3dd89a82a42bb2f7943c95a4b3885753cf59b75f..ba62ab67e507f22c347048f6fff55f764ed7d60c 100644
--- a/app/assets/javascripts/frequent_items/store/actions.js
+++ b/app/assets/javascripts/frequent_items/store/actions.js
@@ -51,7 +51,7 @@ export const fetchSearchedItems = ({ state, dispatch }, searchQuery) => {
   const params = {
     simple: true,
     per_page: 20,
-    membership: !!gon.current_user_id,
+    membership: Boolean(gon.current_user_id),
   };
 
   if (state.namespace === 'projects') {
diff --git a/app/assets/javascripts/gl_dropdown.js b/app/assets/javascripts/gl_dropdown.js
index a143d79097ba3fba694bdc3ddbd2dd295f182ac0..18fa62651081f5c33834f0c1761db4c1e4199497 100644
--- a/app/assets/javascripts/gl_dropdown.js
+++ b/app/assets/javascripts/gl_dropdown.js
@@ -307,8 +307,8 @@ GitLabDropdown = (function() {
     // Set Defaults
     this.filterInput = this.options.filterInput || this.getElement(FILTER_INPUT);
     this.noFilterInput = this.options.noFilterInput || this.getElement(NO_FILTER_INPUT);
-    this.highlight = !!this.options.highlight;
-    this.icon = !!this.options.icon;
+    this.highlight = Boolean(this.options.highlight);
+    this.icon = Boolean(this.options.icon);
     this.filterInputBlur =
       this.options.filterInputBlur != null ? this.options.filterInputBlur : true;
     // If no input is passed create a default one
diff --git a/app/assets/javascripts/gl_form.js b/app/assets/javascripts/gl_form.js
index 5a6d44ef83822a8b15b3e90c28692fd761d07d9d..a66555838ba415eb932083b61364a5f1186feeb8 100644
--- a/app/assets/javascripts/gl_form.js
+++ b/app/assets/javascripts/gl_form.js
@@ -13,7 +13,7 @@ export default class GLForm {
     const dataSources = (gl.GfmAutoComplete && gl.GfmAutoComplete.dataSources) || {};
     Object.keys(this.enableGFM).forEach(item => {
       if (item !== 'emojis') {
-        this.enableGFM[item] = !!dataSources[item];
+        this.enableGFM[item] = Boolean(dataSources[item]);
       }
     });
     // Before we start, we should clean up any previous data for this form
diff --git a/app/assets/javascripts/ide/components/preview/clientside.vue b/app/assets/javascripts/ide/components/preview/clientside.vue
index c98dda008177adf6441b7bb4931065854b70c43d..6999746f1159978ed43cbc2820b953b265d9627d 100644
--- a/app/assets/javascripts/ide/components/preview/clientside.vue
+++ b/app/assets/javascripts/ide/components/preview/clientside.vue
@@ -105,7 +105,7 @@ export default {
         .then(() => {
           this.initManager('#ide-preview', this.sandboxOpts, {
             fileResolver: {
-              isFile: p => Promise.resolve(!!this.entries[createPathWithExt(p)]),
+              isFile: p => Promise.resolve(Boolean(this.entries[createPathWithExt(p)])),
               readFile: p => this.loadFileContent(createPathWithExt(p)).then(content => content),
             },
           });
diff --git a/app/assets/javascripts/ide/components/repo_commit_section.vue b/app/assets/javascripts/ide/components/repo_commit_section.vue
index 99f1d4a573dab2e292ef735ca3a1b3208bcff80a..5201c33b1b4835f30908507e6010b2efbc8c7c6f 100644
--- a/app/assets/javascripts/ide/components/repo_commit_section.vue
+++ b/app/assets/javascripts/ide/components/repo_commit_section.vue
@@ -30,7 +30,7 @@ export default {
     ...mapGetters(['lastOpenedFile', 'hasChanges', 'someUncommittedChanges', 'activeFile']),
     ...mapGetters('commit', ['discardDraftButtonDisabled']),
     showStageUnstageArea() {
-      return !!(this.someUncommittedChanges || this.lastCommitMsg || !this.unusedSeal);
+      return Boolean(this.someUncommittedChanges || this.lastCommitMsg || !this.unusedSeal);
     },
     activeFileKey() {
       return this.activeFile ? this.activeFile.key : null;
diff --git a/app/assets/javascripts/ide/lib/editor_options.js b/app/assets/javascripts/ide/lib/editor_options.js
index e35595ab1fd3ea6ec45ce86dfbf9b4436a0c573f..dac2a8e8b51faf011863351034ce57e51365fa26 100644
--- a/app/assets/javascripts/ide/lib/editor_options.js
+++ b/app/assets/javascripts/ide/lib/editor_options.js
@@ -11,7 +11,7 @@ export const defaultEditorOptions = {
 
 export default [
   {
-    readOnly: model => !!model.file.file_lock,
+    readOnly: model => Boolean(model.file.file_lock),
     quickSuggestions: model => !(model.language === 'markdown'),
   },
 ];
diff --git a/app/assets/javascripts/ide/stores/getters.js b/app/assets/javascripts/ide/stores/getters.js
index 7a88ac5b116ae31a033e053337354a8bcc7c1a1d..5a736805fdc06c06483f44ed49638f5a5e49a048 100644
--- a/app/assets/javascripts/ide/stores/getters.js
+++ b/app/assets/javascripts/ide/stores/getters.js
@@ -42,9 +42,10 @@ export const emptyRepo = state =>
 export const currentTree = state =>
   state.trees[`${state.currentProjectId}/${state.currentBranchId}`];
 
-export const hasChanges = state => !!state.changedFiles.length || !!state.stagedFiles.length;
+export const hasChanges = state =>
+  Boolean(state.changedFiles.length) || Boolean(state.stagedFiles.length);
 
-export const hasMergeRequest = state => !!state.currentMergeRequestId;
+export const hasMergeRequest = state => Boolean(state.currentMergeRequestId);
 
 export const allBlobs = state =>
   Object.keys(state.entries)
@@ -70,7 +71,7 @@ export const isCommitModeActive = state => state.currentActivityView === activit
 export const isReviewModeActive = state => state.currentActivityView === activityBarViews.review;
 
 export const someUncommittedChanges = state =>
-  !!(state.changedFiles.length || state.stagedFiles.length);
+  Boolean(state.changedFiles.length || state.stagedFiles.length);
 
 export const getChangesInFolder = state => path => {
   const changedFilesCount = state.changedFiles.filter(f => filePathMatches(f.path, path)).length;
diff --git a/app/assets/javascripts/ide/stores/modules/commit/actions.js b/app/assets/javascripts/ide/stores/modules/commit/actions.js
index f81bdb8a30e24e1764cf8ae159cd0dd56eb6d668..77ea208487776e1a10d9833dd7e1583fa7d90935 100644
--- a/app/assets/javascripts/ide/stores/modules/commit/actions.js
+++ b/app/assets/javascripts/ide/stores/modules/commit/actions.js
@@ -102,7 +102,7 @@ export const updateFilesAfterCommit = ({ commit, dispatch, rootState, rootGetter
 
     eventHub.$emit(`editor.update.model.content.${file.key}`, {
       content: file.content,
-      changed: !!changedFile,
+      changed: Boolean(changedFile),
     });
   });
 };
diff --git a/app/assets/javascripts/ide/stores/modules/pipelines/getters.js b/app/assets/javascripts/ide/stores/modules/pipelines/getters.js
index ef7cd4ff8e8084c1036ebb0964452002ac973516..1d127d915d7d1ac49ed860e7fe97c738b1493482 100644
--- a/app/assets/javascripts/ide/stores/modules/pipelines/getters.js
+++ b/app/assets/javascripts/ide/stores/modules/pipelines/getters.js
@@ -1,6 +1,6 @@
 import { states } from './constants';
 
-export const hasLatestPipeline = state => !state.isLoadingPipeline && !!state.latestPipeline;
+export const hasLatestPipeline = state => !state.isLoadingPipeline && Boolean(state.latestPipeline);
 
 export const pipelineFailed = state =>
   state.latestPipeline && state.latestPipeline.details.status.text === states.failed;
diff --git a/app/assets/javascripts/ide/stores/mutations.js b/app/assets/javascripts/ide/stores/mutations.js
index 344b189decff858dceb1e3f1554dc44056a3b71d..ae42b87c9a7ae6beb5d210622086f1a64ebe2ca8 100644
--- a/app/assets/javascripts/ide/stores/mutations.js
+++ b/app/assets/javascripts/ide/stores/mutations.js
@@ -142,7 +142,7 @@ export default {
 
     Object.assign(state.entries[file.path], {
       raw: file.content,
-      changed: !!changedFile,
+      changed: Boolean(changedFile),
       staged: false,
       prevPath: '',
       moved: false,
diff --git a/app/assets/javascripts/image_diff/helpers/comment_indicator_helper.js b/app/assets/javascripts/image_diff/helpers/comment_indicator_helper.js
index 05000c73052db35e75e558bbfd28fa7b6ce21083..7051a968dac07fbc9e529a647f88a2a0567509ae 100644
--- a/app/assets/javascripts/image_diff/helpers/comment_indicator_helper.js
+++ b/app/assets/javascripts/image_diff/helpers/comment_indicator_helper.js
@@ -14,7 +14,7 @@ export function addCommentIndicator(containerEl, { x, y }) {
 export function removeCommentIndicator(imageFrameEl) {
   const commentIndicatorEl = imageFrameEl.querySelector('.comment-indicator');
   const imageEl = imageFrameEl.querySelector('img');
-  const willRemove = !!commentIndicatorEl;
+  const willRemove = Boolean(commentIndicatorEl);
   let meta = {};
 
   if (willRemove) {
diff --git a/app/assets/javascripts/image_diff/image_diff.js b/app/assets/javascripts/image_diff/image_diff.js
index 3587f073a00bee85fe981cc89c153b0dda2e1761..26c1b0ec7be9003dbbe7653c577c34c99e270516 100644
--- a/app/assets/javascripts/image_diff/image_diff.js
+++ b/app/assets/javascripts/image_diff/image_diff.js
@@ -6,8 +6,8 @@ import { isImageLoaded } from '../lib/utils/image_utility';
 export default class ImageDiff {
   constructor(el, options) {
     this.el = el;
-    this.canCreateNote = !!(options && options.canCreateNote);
-    this.renderCommentBadge = !!(options && options.renderCommentBadge);
+    this.canCreateNote = Boolean(options && options.canCreateNote);
+    this.renderCommentBadge = Boolean(options && options.renderCommentBadge);
     this.$noteContainer = $('.note-container', this.el);
     this.imageBadges = [];
   }
diff --git a/app/assets/javascripts/image_diff/view_types.js b/app/assets/javascripts/image_diff/view_types.js
index ab0a595571fff30df246e87667a020b77c7bbe25..1a5123de22096edb9cef2e62f03681c0ce5416ab 100644
--- a/app/assets/javascripts/image_diff/view_types.js
+++ b/app/assets/javascripts/image_diff/view_types.js
@@ -5,5 +5,5 @@ export const viewTypes = {
 };
 
 export function isValidViewType(validate) {
-  return !!Object.getOwnPropertyNames(viewTypes).find(viewType => viewType === validate);
+  return Boolean(Object.getOwnPropertyNames(viewTypes).find(viewType => viewType === validate));
 }
diff --git a/app/assets/javascripts/issuable_index.js b/app/assets/javascripts/issuable_index.js
index f51c7a2f99012b938fe0b797cc6b03ce62f217b3..16f88cddce326f54a3a62eae3a01e2e06d7fe04f 100644
--- a/app/assets/javascripts/issuable_index.js
+++ b/app/assets/javascripts/issuable_index.js
@@ -12,7 +12,7 @@ export default class IssuableIndex {
   }
   initBulkUpdate(pagePrefix) {
     const userCanBulkUpdate = $('.issues-bulk-update').length > 0;
-    const alreadyInitialized = !!this.bulkUpdateSidebar;
+    const alreadyInitialized = Boolean(this.bulkUpdateSidebar);
 
     if (userCanBulkUpdate && !alreadyInitialized) {
       IssuableBulkUpdateActions.init({
diff --git a/app/assets/javascripts/issue_show/components/app.vue b/app/assets/javascripts/issue_show/components/app.vue
index ab0b4231255353b10d75123fefbbe1f8805cd649..e88ca4747c564c8b12f9cbd24e68b2e3140c452e 100644
--- a/app/assets/javascripts/issue_show/components/app.vue
+++ b/app/assets/javascripts/issue_show/components/app.vue
@@ -156,7 +156,7 @@ export default {
       return this.store.formState;
     },
     hasUpdated() {
-      return !!this.state.updatedAt;
+      return Boolean(this.state.updatedAt);
     },
     issueChanged() {
       const {
diff --git a/app/assets/javascripts/label_manager.js b/app/assets/javascripts/label_manager.js
index c6dd21cd2d492f47116b0147bb8180329af87bff..7064731a5eab2defea0e899d785d557c41171797 100644
--- a/app/assets/javascripts/label_manager.js
+++ b/app/assets/javascripts/label_manager.js
@@ -53,7 +53,7 @@ export default class LabelManager {
   toggleEmptyState($label, $btn, action) {
     this.emptyState.classList.toggle(
       'hidden',
-      !!this.prioritizedLabels[0].querySelector(':scope > li'),
+      Boolean(this.prioritizedLabels[0].querySelector(':scope > li')),
     );
   }
 
diff --git a/app/assets/javascripts/lib/utils/accessor.js b/app/assets/javascripts/lib/utils/accessor.js
index 1d18992af6325f4f805ef0ba4e72b0bc5247982e..39cffedcac6d278f1c821d276e5de79829e61df5 100644
--- a/app/assets/javascripts/lib/utils/accessor.js
+++ b/app/assets/javascripts/lib/utils/accessor.js
@@ -2,7 +2,7 @@ function isPropertyAccessSafe(base, property) {
   let safe;
 
   try {
-    safe = !!base[property];
+    safe = Boolean(base[property]);
   } catch (error) {
     safe = false;
   }
diff --git a/app/assets/javascripts/lib/utils/datetime_utility.js b/app/assets/javascripts/lib/utils/datetime_utility.js
index 32cafb74d912529216b7a7d35511d6d51e914fb1..d3e6851496b06a2dc3b515085c94e1688c3c4552 100644
--- a/app/assets/javascripts/lib/utils/datetime_utility.js
+++ b/app/assets/javascripts/lib/utils/datetime_utility.js
@@ -513,7 +513,7 @@ export const stringifyTime = (timeObject, fullNameFormat = false) => {
   const reducedTime = _.reduce(
     timeObject,
     (memo, unitValue, unitName) => {
-      const isNonZero = !!unitValue;
+      const isNonZero = Boolean(unitValue);
 
       if (fullNameFormat && isNonZero) {
         // Remove traling 's' if unit value is singular
diff --git a/app/assets/javascripts/lib/utils/text_markdown.js b/app/assets/javascripts/lib/utils/text_markdown.js
index 84a617acb4263a18d656579d577f91f7de63da12..b7922e29bb00bbacab115e88bf1e4d8ae3dc7115 100644
--- a/app/assets/javascripts/lib/utils/text_markdown.js
+++ b/app/assets/javascripts/lib/utils/text_markdown.js
@@ -223,9 +223,9 @@ export function insertMarkdownText({
             return tag.replace(textPlaceholder, val);
           }
           if (val.indexOf(tag) === 0) {
-            return '' + val.replace(tag, '');
+            return String(val.replace(tag, ''));
           } else {
-            return '' + tag + val;
+            return String(tag) + val;
           }
         })
         .join('\n');
@@ -233,7 +233,7 @@ export function insertMarkdownText({
   } else if (tag.indexOf(textPlaceholder) > -1) {
     textToInsert = tag.replace(textPlaceholder, selected);
   } else {
-    textToInsert = '' + startChar + tag + selected + (wrap ? tag : ' ');
+    textToInsert = String(startChar) + tag + selected + (wrap ? tag : ' ');
   }
 
   if (removedFirstNewLine) {
diff --git a/app/assets/javascripts/mr_notes/stores/getters.js b/app/assets/javascripts/mr_notes/stores/getters.js
index b10e9f9f9f1abaa72b7347573996ad8535a5b6fa..e48cfcd956419b65265e13cb8ac8a793b6a545df 100644
--- a/app/assets/javascripts/mr_notes/stores/getters.js
+++ b/app/assets/javascripts/mr_notes/stores/getters.js
@@ -1,5 +1,5 @@
 export default {
   isLoggedIn(state, getters) {
-    return !!getters.getUserData.id;
+    return Boolean(getters.getUserData.id);
   },
 };
diff --git a/app/assets/javascripts/notes/components/discussion_notes.vue b/app/assets/javascripts/notes/components/discussion_notes.vue
index 5b6163a621442f7b39355c61499fc0e19624e880..228bb6525978e9b3ab2c47471c70391f66be95b9 100644
--- a/app/assets/javascripts/notes/components/discussion_notes.vue
+++ b/app/assets/javascripts/notes/components/discussion_notes.vue
@@ -49,7 +49,7 @@ export default {
   computed: {
     ...mapGetters(['userCanReply']),
     hasReplies() {
-      return !!this.replies.length;
+      return Boolean(this.replies.length);
     },
     replies() {
       return this.discussion.notes.slice(1);
diff --git a/app/assets/javascripts/notes/components/noteable_note.vue b/app/assets/javascripts/notes/components/noteable_note.vue
index e0af2e69fbee64297674e0a5035f498e32e3ae5b..aa80e25a3e05b020542cb456bbd1f030fad7aa75 100644
--- a/app/assets/javascripts/notes/components/noteable_note.vue
+++ b/app/assets/javascripts/notes/components/noteable_note.vue
@@ -75,7 +75,7 @@ export default {
       };
     },
     canReportAsAbuse() {
-      return !!this.note.report_abuse_path && this.author.id !== this.getUserData.id;
+      return Boolean(this.note.report_abuse_path) && this.author.id !== this.getUserData.id;
     },
     noteAnchorId() {
       return `note_${this.note.id}`;
diff --git a/app/assets/javascripts/notes/mixins/issuable_state.js b/app/assets/javascripts/notes/mixins/issuable_state.js
index 97f3ea0d5deaabdc46fb17e463d409d22901cf1b..ded0ac3cfa98d61747a129aa279c040dfc1241b7 100644
--- a/app/assets/javascripts/notes/mixins/issuable_state.js
+++ b/app/assets/javascripts/notes/mixins/issuable_state.js
@@ -1,11 +1,11 @@
 export default {
   methods: {
     isConfidential(issue) {
-      return !!issue.confidential;
+      return Boolean(issue.confidential);
     },
 
     isLocked(issue) {
-      return !!issue.discussion_locked;
+      return Boolean(issue.discussion_locked);
     },
 
     hasWarning(issue) {
diff --git a/app/assets/javascripts/notes/stores/getters.js b/app/assets/javascripts/notes/stores/getters.js
index 2d150e64ef779b825f5b2b17bfbe9f04b6e571c8..d7982be3e4b370001b7b620ef575f254a5efce9c 100644
--- a/app/assets/javascripts/notes/stores/getters.js
+++ b/app/assets/javascripts/notes/stores/getters.js
@@ -20,7 +20,7 @@ export const getNoteableData = state => state.noteableData;
 
 export const getNoteableDataByProp = state => prop => state.noteableData[prop];
 
-export const userCanReply = state => !!state.noteableData.current_user.can_create_note;
+export const userCanReply = state => Boolean(state.noteableData.current_user.can_create_note);
 
 export const openState = state => state.noteableData.state;
 
diff --git a/app/assets/javascripts/pages/projects/pipeline_schedules/shared/components/interval_pattern_input.vue b/app/assets/javascripts/pages/projects/pipeline_schedules/shared/components/interval_pattern_input.vue
index bd4309e47ad7f627ef7f0cfd15957bc31b1118dc..bb490919a9aae5cf2d837090605178cd33495f4b 100644
--- a/app/assets/javascripts/pages/projects/pipeline_schedules/shared/components/interval_pattern_input.vue
+++ b/app/assets/javascripts/pages/projects/pipeline_schedules/shared/components/interval_pattern_input.vue
@@ -29,7 +29,7 @@ export default {
     // The text input is editable when there's a custom interval, or when it's
     // a preset interval and the user clicks the 'custom' radio button
     isEditable() {
-      return !!(this.customInputEnabled || !this.intervalIsPreset);
+      return Boolean(this.customInputEnabled || !this.intervalIsPreset);
     },
   },
   watch: {
diff --git a/app/assets/javascripts/profile/account/index.js b/app/assets/javascripts/profile/account/index.js
index 59c13e1a042efce7b23c438c30ade61ec288290a..f0d9642a2b2fb4abe4d5a768e824dacf74227f05 100644
--- a/app/assets/javascripts/profile/account/index.js
+++ b/app/assets/javascripts/profile/account/index.js
@@ -35,7 +35,7 @@ export default () => {
       return createElement('delete-account-modal', {
         props: {
           actionUrl: deleteAccountModalEl.dataset.actionUrl,
-          confirmWithPassword: !!deleteAccountModalEl.dataset.confirmWithPassword,
+          confirmWithPassword: Boolean(deleteAccountModalEl.dataset.confirmWithPassword),
           username: deleteAccountModalEl.dataset.username,
         },
       });
diff --git a/app/assets/javascripts/projects/gke_cluster_dropdowns/store/actions.js b/app/assets/javascripts/projects/gke_cluster_dropdowns/store/actions.js
index 4834a856271df85d83615bab24dfd7068618e538..f05ad7773a202fd070bf982d8b084a578d9914e6 100644
--- a/app/assets/javascripts/projects/gke_cluster_dropdowns/store/actions.js
+++ b/app/assets/javascripts/projects/gke_cluster_dropdowns/store/actions.js
@@ -57,7 +57,7 @@ export const validateProjectBilling = ({ dispatch, commit, state }) =>
       resp => {
         const { billingEnabled } = resp.result;
 
-        commit(types.SET_PROJECT_BILLING_STATUS, !!billingEnabled);
+        commit(types.SET_PROJECT_BILLING_STATUS, Boolean(billingEnabled));
         dispatch('setIsValidatingProjectBilling', false);
         resolve();
       },
diff --git a/app/assets/javascripts/projects/gke_cluster_dropdowns/store/getters.js b/app/assets/javascripts/projects/gke_cluster_dropdowns/store/getters.js
index e39f02d08943e0fd7ec29e821138720612d8c730..f9e2e2f74fbea2552641c4368a35e4e29fbc51fe 100644
--- a/app/assets/javascripts/projects/gke_cluster_dropdowns/store/getters.js
+++ b/app/assets/javascripts/projects/gke_cluster_dropdowns/store/getters.js
@@ -1,3 +1,3 @@
-export const hasProject = state => !!state.selectedProject.projectId;
-export const hasZone = state => !!state.selectedZone;
-export const hasMachineType = state => !!state.selectedMachineType;
+export const hasProject = state => Boolean(state.selectedProject.projectId);
+export const hasZone = state => Boolean(state.selectedZone);
+export const hasMachineType = state => Boolean(state.selectedMachineType);
diff --git a/app/assets/javascripts/registry/stores/mutations.js b/app/assets/javascripts/registry/stores/mutations.js
index 1ac699c538ff590b11536f65b0287d37056244f5..8ace6657ad1a325e55b136b23e9101ae0764620e 100644
--- a/app/assets/javascripts/registry/stores/mutations.js
+++ b/app/assets/javascripts/registry/stores/mutations.js
@@ -9,7 +9,7 @@ export default {
   [types.SET_REPOS_LIST](state, list) {
     Object.assign(state, {
       repos: list.map(el => ({
-        canDelete: !!el.destroy_path,
+        canDelete: Boolean(el.destroy_path),
         destroyPath: el.destroy_path,
         id: el.id,
         isLoading: false,
@@ -42,7 +42,7 @@ export default {
       location: element.location,
       createdAt: element.created_at,
       destroyPath: element.destroy_path,
-      canDelete: !!element.destroy_path,
+      canDelete: Boolean(element.destroy_path),
     }));
   },
 
diff --git a/app/assets/javascripts/right_sidebar.js b/app/assets/javascripts/right_sidebar.js
index 72e061df5731feb5a4ef0a485193a29482acd188..930c0d5e9581706d3d2e7f2751e1ef1ae00d4e56 100644
--- a/app/assets/javascripts/right_sidebar.js
+++ b/app/assets/javascripts/right_sidebar.js
@@ -82,9 +82,9 @@ Sidebar.prototype.toggleTodo = function(e) {
   ajaxType = $this.data('deletePath') ? 'delete' : 'post';
 
   if ($this.data('deletePath')) {
-    url = '' + $this.data('deletePath');
+    url = String($this.data('deletePath'));
   } else {
-    url = '' + $this.data('createPath');
+    url = String($this.data('createPath'));
   }
 
   $this.tooltip('hide');
diff --git a/app/assets/javascripts/search_autocomplete.js b/app/assets/javascripts/search_autocomplete.js
index a0780f36b7b1d3807d7f93f002e6084de1b0cc9c..6aca4067ba77e92fbc2d4515762e0170619a91f0 100644
--- a/app/assets/javascripts/search_autocomplete.js
+++ b/app/assets/javascripts/search_autocomplete.js
@@ -379,7 +379,7 @@ export class SearchAutocomplete {
           }
         }
     }
-    this.wrap.toggleClass('has-value', !!e.target.value);
+    this.wrap.toggleClass('has-value', Boolean(e.target.value));
   }
 
   onSearchInputFocus() {
@@ -396,7 +396,7 @@ export class SearchAutocomplete {
 
   onClearInputClick(e) {
     e.preventDefault();
-    this.wrap.toggleClass('has-value', !!e.target.value);
+    this.wrap.toggleClass('has-value', Boolean(e.target.value));
     return this.searchInput.val('').focus();
   }
 
diff --git a/app/assets/javascripts/sidebar/components/time_tracking/time_tracker.vue b/app/assets/javascripts/sidebar/components/time_tracking/time_tracker.vue
index c03b2a68c7880a5069c74f459bc911906e53d20e..d84d5344935b595531ad44dad9efb556b10ae8d3 100644
--- a/app/assets/javascripts/sidebar/components/time_tracking/time_tracker.vue
+++ b/app/assets/javascripts/sidebar/components/time_tracking/time_tracker.vue
@@ -49,10 +49,10 @@ export default {
   },
   computed: {
     hasTimeSpent() {
-      return !!this.timeSpent;
+      return Boolean(this.timeSpent);
     },
     hasTimeEstimate() {
-      return !!this.timeEstimate;
+      return Boolean(this.timeEstimate);
     },
     showComparisonState() {
       return this.hasTimeEstimate && this.hasTimeSpent;
@@ -67,7 +67,7 @@ export default {
       return !this.hasTimeEstimate && !this.hasTimeSpent;
     },
     showHelpState() {
-      return !!this.showHelp;
+      return Boolean(this.showHelp);
     },
   },
   created() {
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/deployment.vue b/app/assets/javascripts/vue_merge_request_widget/components/deployment.vue
index ad0464a3a9859af32bfbda34f8a2b4cabeba07b0..abe5bdd29017bf20908c15bed473add8bf07e5c1 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/deployment.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/deployment.vue
@@ -77,16 +77,16 @@ export default {
       return this.deployment.external_url;
     },
     hasExternalUrls() {
-      return !!(this.deployment.external_url && this.deployment.external_url_formatted);
+      return Boolean(this.deployment.external_url && this.deployment.external_url_formatted);
     },
     hasDeploymentTime() {
-      return !!(this.deployment.deployed_at && this.deployment.deployed_at_formatted);
+      return Boolean(this.deployment.deployed_at && this.deployment.deployed_at_formatted);
     },
     hasDeploymentMeta() {
-      return !!(this.deployment.url && this.deployment.name);
+      return Boolean(this.deployment.url && this.deployment.name);
     },
     hasMetrics() {
-      return !!this.deployment.metrics_url;
+      return Boolean(this.deployment.metrics_url);
     },
     deployedText() {
       return this.$options.deployedTextMap[this.deployment.status];
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline_container.vue b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline_container.vue
index 0686409a785b6f414c384b79ea352f7f1f34a0f9..03a15ba81ed19073da53986476ee012d137d5dd1 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline_container.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline_container.vue
@@ -56,7 +56,7 @@ export default {
       return this.isPostMerge ? this.mr.mergePipeline : this.mr.pipeline;
     },
     showVisualReviewAppLink() {
-      return !!(this.mr.visualReviewFF && this.mr.visualReviewAppAvailable);
+      return Boolean(this.mr.visualReviewFF && this.mr.visualReviewAppAvailable);
     },
   },
 };
diff --git a/app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue b/app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue
index bf175eb5f694d9c4d02d22e5b27fc82dd038b470..eef2667e1410bad567c65202917c163b3cbbcbdf 100644
--- a/app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue
@@ -97,7 +97,7 @@ export default {
       return this.mr.hasCI;
     },
     shouldRenderRelatedLinks() {
-      return !!this.mr.relatedLinks && !this.mr.isNothingToMergeState;
+      return Boolean(this.mr.relatedLinks) && !this.mr.isNothingToMergeState;
     },
     shouldRenderSourceBranchRemovalStatus() {
       return (
diff --git a/app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js b/app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js
index 448cbaa6fc950e4237b9a7937d302a203d070665..32badb0fb08624dca071cfbf06afc7e0fb484c87 100644
--- a/app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js
+++ b/app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js
@@ -79,7 +79,7 @@ export default class MergeRequestStore {
     this.autoMergeStrategy = data.auto_merge_strategy;
     this.mergePath = data.merge_path;
     this.ffOnlyEnabled = data.ff_only_enabled;
-    this.shouldBeRebased = !!data.should_be_rebased;
+    this.shouldBeRebased = Boolean(data.should_be_rebased);
     this.statusPath = data.status_path;
     this.emailPatchesPath = data.email_patches_path;
     this.plainDiffPath = data.plain_diff_path;
@@ -92,9 +92,9 @@ export default class MergeRequestStore {
     this.isOpen = data.state === 'opened';
     this.hasMergeableDiscussionsState = data.mergeable_discussions_state === false;
     this.canRemoveSourceBranch = currentUser.can_remove_source_branch || false;
-    this.canMerge = !!data.merge_path;
+    this.canMerge = Boolean(data.merge_path);
     this.canCreateIssue = currentUser.can_create_issue || false;
-    this.canCancelAutomaticMerge = !!data.cancel_auto_merge_path;
+    this.canCancelAutomaticMerge = Boolean(data.cancel_auto_merge_path);
     this.isSHAMismatch = this.sha !== data.diff_head_sha;
     this.canBeMerged = data.can_be_merged || false;
     this.isMergeAllowed = data.mergeable || false;
diff --git a/app/assets/javascripts/vue_shared/components/pikaday.vue b/app/assets/javascripts/vue_shared/components/pikaday.vue
index fa502b9beb97c7bf5171452bee0d1f4d82c0027c..8104d919bf6417534ece531d574493fd4c140f90 100644
--- a/app/assets/javascripts/vue_shared/components/pikaday.vue
+++ b/app/assets/javascripts/vue_shared/components/pikaday.vue
@@ -34,7 +34,7 @@ export default {
       format: 'yyyy-mm-dd',
       container: this.$el,
       defaultDate: this.selectedDate,
-      setDefaultDate: !!this.selectedDate,
+      setDefaultDate: Boolean(this.selectedDate),
       minDate: this.minDate,
       maxDate: this.maxDate,
       parse: dateString => parsePikadayDate(dateString),
diff --git a/app/assets/javascripts/vue_shared/components/table_pagination.vue b/app/assets/javascripts/vue_shared/components/table_pagination.vue
index 8e0b08032f70d8f1f67bbd9a6b44c16705a2b28a..9cce9a4e5421c936d4763009a224103d33dd30d4 100644
--- a/app/assets/javascripts/vue_shared/components/table_pagination.vue
+++ b/app/assets/javascripts/vue_shared/components/table_pagination.vue
@@ -121,7 +121,7 @@ export default {
           this.change(1);
           break;
         default:
-          this.change(+text);
+          this.change(Number(text));
           break;
       }
     },
diff --git a/babel.config.js b/babel.config.js
index df30892731d350049fd8a30eda920e391ec69847..05554e8763e894cd739678e01ed7958ed2a03069 100644
--- a/babel.config.js
+++ b/babel.config.js
@@ -39,7 +39,7 @@ if (BABEL_ENV === 'karma' || BABEL_ENV === 'coverage') {
 }
 
 // Jest is running in node environment, so we need additional plugins
-const isJest = !!process.env.JEST_WORKER_ID;
+const isJest = Boolean(process.env.JEST_WORKER_ID);
 if (isJest) {
   plugins.push('@babel/plugin-transform-modules-commonjs');
   /*
diff --git a/spec/frontend/helpers/vue_test_utils_helper.js b/spec/frontend/helpers/vue_test_utils_helper.js
index 19e27388eebed18db8eaa0081c2ed09881d0f03a..121e99c9783440791a28cc04a9be0d2a3930bc56 100644
--- a/spec/frontend/helpers/vue_test_utils_helper.js
+++ b/spec/frontend/helpers/vue_test_utils_helper.js
@@ -16,4 +16,6 @@ const vNodeContainsText = (vnode, text) =>
  * @param {String} text
  */
 export const shallowWrapperContainsSlotText = (shallowWrapper, slotName, text) =>
-  !!shallowWrapper.vm.$slots[slotName].filter(vnode => vNodeContainsText(vnode, text)).length;
+  Boolean(
+    shallowWrapper.vm.$slots[slotName].filter(vnode => vNodeContainsText(vnode, text)).length,
+  );
diff --git a/spec/javascripts/helpers/vue_test_utils_helper.js b/spec/javascripts/helpers/vue_test_utils_helper.js
index 19e27388eebed18db8eaa0081c2ed09881d0f03a..121e99c9783440791a28cc04a9be0d2a3930bc56 100644
--- a/spec/javascripts/helpers/vue_test_utils_helper.js
+++ b/spec/javascripts/helpers/vue_test_utils_helper.js
@@ -16,4 +16,6 @@ const vNodeContainsText = (vnode, text) =>
  * @param {String} text
  */
 export const shallowWrapperContainsSlotText = (shallowWrapper, slotName, text) =>
-  !!shallowWrapper.vm.$slots[slotName].filter(vnode => vNodeContainsText(vnode, text)).length;
+  Boolean(
+    shallowWrapper.vm.$slots[slotName].filter(vnode => vNodeContainsText(vnode, text)).length,
+  );
diff --git a/spec/javascripts/matchers.js b/spec/javascripts/matchers.js
index 406527b08a35346095c0260f28954fd88cbf8b72..7d1921cabcfde843087e8177d1d4e75f125a9ea0 100644
--- a/spec/javascripts/matchers.js
+++ b/spec/javascripts/matchers.js
@@ -28,7 +28,7 @@ export default {
         reference.getAttribute('xlink:href').endsWith(`#${iconName}`),
       );
       const result = {
-        pass: !!matchingIcon,
+        pass: Boolean(matchingIcon),
       };
 
       if (result.pass) {