0

мне нужно таким образом, чтобы обернуть логическое значение, таким образом, что сравнение не нарушены, и результат строки отличается от «лжи» или «истины», не изменяя глобальные логические значенияКак я могу подклассы Boolean изменять строковое представление без отрицательных побочных эффектов вне моей функции?

function TestIt(bool){ 
    if(wrapper(bool) == true) 
     return "it was: " + wrapper(bool) 
    if(wrapper(bool) == false) 
     return "it was: " + wrapper(bool) 
    return "no dice" 
} 

например,

var result; 
result = TestIt(true); 
// "it was: True" 
result = TestIt(false); 
// "it was: False" 

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

var initial = true; 
var result1; 
var result2; 
(function(){ 
    result1 = wrapper(true); 
    result2 = wrapper(true); 
})() 
// result1 == result2 
// result1 == true 
// result1.toString() != initial.toString() 
// initial.toString() == true.toString() 
// initial.toString() == (new Boolean(true)).toString() 

Может кто-нибудь мне помочь, пожалуйста?

Мне нужно это (автоматическое) альтернативное преобразование строки, чтобы я мог дублировать строку, созданную в среде сервера, с использованием другого языка и точно соответствовать ей.

~~~~~~

Редактировать

~~~~~~

Я забыл упомянуть, что проблема я бегу в булево «valueOf» метод, который называется вместо toString (по-видимому) для конкатенации строк.

~~~~~~

Edit # 2

~~~~~~

Это также нужно будет работать неверно. Я просто оставил это для краткости. Однако обертка (false) == false дала мне головную боль.

~~~~~~

Edit Final

~~~~~~

Оказывается (в ответах ниже), что вы не можете изменить поведение по умолчанию, как Я хотел, чтобы использовать конкатенацию строк. Я собираюсь работать над использованием массива для решения моей проблемы, а затем выполнять пользовательские преобразования, когда я присоединяюсь к нему вместе. Кажется, что Javascript требует нечеткого подхода к концептуально простой проблеме.

Пример кода для командной строки:

function boolish(a){a=new Boolean(a);a.toString=function(){return this.valueOf()?"True":"False"};return a}; 

boolish(false) == false 
boolish(true) == true 
boolish(false) + " or " + boolish(true) 
[boolish(false) , " or " , boolish(true)].join("~~~~~~~~") 
+0

Вы говорите, вы ожидаете 'обертка (истина)', чтобы оценить, булева истинно при использовании в вашей 'обертку (истина) == true' заявление, но' обертку (true) 'должен оцениваться строкой« True », если она используется в конкатенации строк? Это не сработает. – nnnnnn

+0

@nnnnnn Да, это то, что я хочу. Wrapper может вернуть новый объект или что-то еще. Не имеет значения, как это происходит ... если это произойдет =). Я просто не могу понять, как это сделать. Обратите внимание, что это была оболочка (true) == true, а не wrapper (true) === true с 3 равными знаками. – user319862

+0

@RobG, который не работает для конкатенации строк – user319862

ответ

0

Я не понимаю, почему вы думаете, что вам нужно, чтобы это произошло автоматически через toString(). Если у вас есть «простое» логическое значение, вы можете (очевидно) использовать его в любых сравнениях как обычно, но если вы хотите получить нестандартный текст при конкатенировании, просто укажите его в то время. Например, если вы хотите "TRUE" и "FALSE" все в шапках:

var myBool1 = false, 
    myBool2 = true; 

alert("The value of myBool1 is: " + (myBool1?"TRUE":"FALSE")); 

Или вы могли бы написать небольшую функцию:

function boolToString(val) { 
    return val ? "True enough" : "That's a lie!"; 
} 

alert("The value of myBool2 is: " + boolToString(myBool2)); 

EDIT Согласно следующий SO вопрос (и ответы): valueOf() vs. toString() in Javascript ваше требование не может быть выполнено.Оператор конкатенации строк + всегда будет использовать valueOf, а не toString. Я согласен, что это странно. Обходной путь состоит в том, чтобы объединить строки без использования оператора +, но я понимаю, что вы не хотите этого делать.

+0

Это не сработает для моих тестовых случаев в вопросе. – user319862

+0

Я знаю это. Я говорю, почему вы не можете просто делать то, что я сделал в своем ответе, и продолжать с этим? То есть я не могу придумать практический пример, почему вам нужно что-то еще. В чем смысл этой «обертки» в вашем вопросе? – nnnnnn

+0

Напечатайте «перевод» с python на javascript для системы шаблонов, которая уже написана. Я не могу писать тесты для проверки вывода, если шаблон содержит логическое значение прямо сейчас. – user319862

0

Вы можете сделать что-то вроде:

function myBool(value) { 
    this.value = value; 
} 
myBool.prototype.toString = function() { 
    return 'The value is ' + (this.value? 'true' : 'false'); 
} 

var x = new myBool(true); 

alert(x); // 'The value is true' 
+0

Это не работает, если вы говорите 'alert (« X: »+ x);' потому что тогда JS пытается использовать 'valueOf'' вместо' toString'. (Это странно, но, похоже, это то, что говорит спецификация языка.) – nnnnnn

+0

Подходящий метод может быть назначен * valueOf * также, скажем: 'myBool.prototype.valueOf = myBool.prototype.toString'. – RobG

+0

@RobG Тогда myBool никогда не будет ложным, потому что строка является либо «True», либо «False» – user319862