Как я могу преобразовать строку в логическое значение в JavaScript? - PullRequest
2162 голосов
/ 05 ноября 2008

Могу ли я преобразовать строку, представляющую логическое значение (например, 'true', 'false') во внутренний тип в JavaScript?

У меня есть скрытая форма в HTML, которая обновляется на основе выбора пользователя в списке. Эта форма содержит некоторые поля, которые представляют логические значения и динамически заполняются внутренним логическим значением. Однако после помещения этого значения в скрытое поле ввода оно становится строкой.

Единственный способ определить логическое значение поля после его преобразования в строку - это зависеть от литерального значения его строкового представления.

var myValue = document.myForm.IS_TRUE.value;
var isTrueSet = myValue == 'true';

Есть ли лучший способ сделать это?

Ответы [ 74 ]

1 голос
/ 19 апреля 2016

Будьте осторожны, возможно, в будущем код изменится и вернет логическое значение вместо одной строки в данный момент.

Решение будет:

//Currently
var isTrue = 'true';
//In the future (Other developer change the code)
var isTrue = true;
//The solution to both cases
(isTrue).toString() == 'true'
1 голос
/ 23 октября 2012

Я использовал этот фрагмент для преобразования чисел и логических значений:

var result = !isNaN(value) ? parseFloat(value) : /^\s*(true|false)\s*$/i.exec(value) ? RegExp.$1.toLowerCase() === "true" : value;
1 голос
/ 15 декабря 2015

Самый быстрый и безопасный способ преобразования строки в логическое значение в одной строке кода

Одной из функций, которые помогают ускорить выполнение кода в Javascript, является Оценка короткого замыкания :

Поскольку логические выражения оцениваются слева направо, они проверяются на возможную оценку "короткого замыкания" с использованием следующих правил:

  • false && (что угодно) - короткое замыкание, оцененное как false.
  • верно || (что-нибудь), короткое замыкание оценивается как истинное.

Так что, если вы хотите проверить строковое значение на наличие true из false в JSON.parse способе проверки и сохранить высокую производительность, вы можете использовать оператор ||, чтобы исключить медленный код из выполнения в случае, если тестовое значение имеет логический тип.

test === true || ['true','yes','1'].indexOf(test.toString().toLowerCase()) > -1

Поскольку метод Array.prototype.indexOf() является частью стандарта ECMA-262 в 5-м издании, вам может понадобиться polyfill для поддержки старых браузеров.

// Production steps of ECMA-262, Edition 5, 15.4.4.14
// Reference: http://es5.github.io/#x15.4.4.14
if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function(searchElement, fromIndex) {

    var k;

    // 1. Let O be the result of calling ToObject passing
    //    the this value as the argument.
    if (this == null) {
      throw new TypeError('"this" is null or not defined');
    }

    var O = Object(this);

    // 2. Let lenValue be the result of calling the Get
    //    internal method of O with the argument "length".
    // 3. Let len be ToUint32(lenValue).
    var len = O.length >>> 0;

    // 4. If len is 0, return -1.
    if (len === 0) {
      return -1;
    }

    // 5. If argument fromIndex was passed let n be
    //    ToInteger(fromIndex); else let n be 0.
    var n = +fromIndex || 0;

    if (Math.abs(n) === Infinity) {
      n = 0;
    }

    // 6. If n >= len, return -1.
    if (n >= len) {
      return -1;
    }

    // 7. If n >= 0, then Let k be n.
    // 8. Else, n<0, Let k be len - abs(n).
    //    If k is less than 0, then let k be 0.
    k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);

    // 9. Repeat, while k < len
    while (k < len) {
      // a. Let Pk be ToString(k).
      //   This is implicit for LHS operands of the in operator
      // b. Let kPresent be the result of calling the
      //    HasProperty internal method of O with argument Pk.
      //   This step can be combined with c
      // c. If kPresent is true, then
      //    i.  Let elementK be the result of calling the Get
      //        internal method of O with the argument ToString(k).
      //   ii.  Let same be the result of applying the
      //        Strict Equality Comparison Algorithm to
      //        searchElement and elementK.
      //  iii.  If same is true, return k.
      if (k in O && O[k] === searchElement) {
        return k;
      }
      k++;
    }
    return -1;
  };
}
1 голос
/ 25 июня 2014

Простое решение, которое я использовал некоторое время

function asBoolean(value) {

    return (''+value) === 'true'; 

}


// asBoolean(true) ==> true
// asBoolean(false) ==> false
// asBoolean('true') ==> true
// asBoolean('false') ==> false
1 голос
/ 05 июня 2013

Вам даже не нужно преобразовывать строку в логическое значение. просто используйте следующее: var yourstring = yourstringValue == 1 ? true : false;

1 голос
/ 20 августа 2012

Boolean.parse() существует в некоторых реализациях браузера. Это определенно не универсально, поэтому, если это то, что вам нужно, вы не должны использовать этот метод. Но в Chrome, например (я использую v21) он работает просто отлично, как и следовало ожидать.

1 голос
/ 09 февраля 2017

Полегче, используя эту библиотеку.

https://github.com/rohmanhm/force-boolean

вам просто нужно написать одну строку

const ForceBoolean = require('force-boolean')

const YOUR_VAR = 'false'
console.log(ForceBoolean(YOUR_VAR)) // it's return boolean false

Это также поддержка для следующих

 return false if value is number 0
 return false if value is string '0'
 return false if value is string 'false'
 return false if value is boolean false
 return true if value is number 1
 return true if value is string '1'
 return true if value is string 'true'
 return true if value is boolean true
1 голос
/ 25 февраля 2015

Для оценки как логических, так и логических строк, таких как логические, я использовал следующую простую формулу:

var trueOrStringTrue = (trueOrStringTrue === true) || (trueOrStringTrue === 'true');

Как очевидно, он вернет истину как для истины, так и для истины. Все остальное возвращает ложь.

1 голос
/ 28 февраля 2013

Основываясь на ответе Стивена выше, я написал эту функцию в качестве универсального синтаксического анализатора для ввода строки:

parse:
  function (value) {
    switch (value && value.toLowerCase()) {
      case null: return null;
      case "true": return true;
      case "false": return false;
      default: try { return parseFloat(value); } catch (e) { return value; }
    }
  }
1 голос
/ 06 марта 2019

Для TypeScript мы можем использовать функцию:

export function stringToBoolean(s: string, valueDefault: boolean = false): boolean {
    switch(s.toLowerCase())
    {
        case "true":
        case "1":
        case "on":
        case "yes":
        case "y":
            return true;

        case "false":
        case "0":
        case "off":
        case "no":
        case "n":
            return false;
    }

    return valueDefault;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...