Как вернуть логическое значение в функции Array.prototype?

Я пытаюсь создать функцию для использования AND-Logicgate, но она отвечает только на массив. Я пытался использовать toString() и join(), но они не работают. Кто-нибудь может мне помочь.

Вот код:

Array.prototype.AND = function() {
  var temp = true;
  for (let i = 0; i < this.length; i++) {
    if (this[i] == false) {
      temp = false;
    }
  }
  while (this.length > 0) {
    this.pop();
  }
  this[0] = temp;
}

const test = [true, true, true, false];

test.AND();

console.info(test);

Он отвечает массивом, потому что вы выполняете операции над массивом. Какой результат вы ожидаете? (Также вы ничего не возвращаете из этой функции - вы обновляете этот массив на месте).

Andy 19.03.2022 20:07
toString и join не изменяют массив. Они возвращают новое значение.
jabaa 19.03.2022 20:10
ВЫ НЕ ДОЛЖНЫ ИЗМЕНЯТЬ ПРОТОТИПЫ ВСТРОЕННЫХ ОБЪЕКТОВ, если только не использовать методы полифилла из более поздних версий ECMAScript.
user3840170 19.03.2022 20:46

@ user3840170 это был совет, данный 15 лет назад, когда библиотеки пытались исправить недостатки в JS. Таким образом, такие библиотеки, как Mootools и Prototype, будут сражаться друг с другом. Можно добавлять в прототип, если вы проверяете, что там нет существующего метода. if (!('add' in Array.prototype)) {...}.

Andy 19.03.2022 21:12
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
41
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если разрешено использовать .reduce(), это может быть полезно:

const logicAndGate = arr => arr.reduce((a, b) => a && b, true);
      
const test = [true, true, true, false];
console.info(logicAndGate(test));
console.info(logicAndGate([true, true, true, true]));
console.info(logicAndGate([false, true]));
//test.AND();
//console.info(test);

Другой вариант может использовать .every следующим образом:

const logicAndGate = arr => arr.every(x => !!x);

console.info(logicAndGate([true, true, true, false]));
console.info(logicAndGate([true, true, true, true]));
console.info(logicAndGate([false, true]));
Ответ принят как подходящий

Таким образом, если массив содержит false, функция-прототип .AND должна возвращать false.

Используйте некоторый, чтобы определить, содержит ли массив false.

const test = [true, true, true, false];
const test2 = [true, true, true, true];
const test3 = [true, "blah!", false];

// Make sure you do not overwrite an existing method
if (typeof(Array.prototype.AND) === "undefined"){
  Array.prototype.AND = function() {
    // Make sure the array only contains booleans
    if (this.some(item => typeof(item) !== "boolean")){
      throw `error: AND must be applied on boolean array only. Got ${JSON.stringify(this)}`
    }
    return !this.some(item => item === false)
  }
}

console.info(test.AND())   // false
console.info(test2.AND())  // true
console.info(test3.AND())  // error thrown

Чтобы не ошибиться, я бы добавил оператор if, чтобы проверить, существует ли этот метод в прототипе, согласно моему комментарию под постом.

Andy 19.03.2022 21:13

@Энди: Согласен. ;)

Louys Patrice Bessette 19.03.2022 21:43

Другие вопросы по теме