Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

Преобразование типов для примитивов [дубликат]

#javascript


        
             
                
                    
                        
                            This question already has answers here:
                            
                        
                    
                
                        
                            && и || с разными типами данных
                                
                                    (3 ответа)
                                
                        
                                Закрыт 1 год назад.
            
                    
Читаю про преобразование типов в JavaScript. Не поняла, что происходит в следующих
случаях:

alert(5 && 2); // 2
alert(2 && 5); // 5
alert(5 || 0); // 5


Я сначала думала, что будет преобразование к логическому типу и далее операции уже
с преобразованными данными. Но нет. Другой вариант - логическая операция операция работает
как побитовая, но тоже что-то не то.

Подскажите, что конкретно происходит в этих примерах?
    


Ответы

Ответ 1



Я сначала думала, что будет преобразование к логическому типу и далее операции уже с преобразованными данными. Но нет. На самом деле да. Сравнение операндов действительно производится только после приведения их к логическому типу. Вот только возвращается не true или false, а непосредственно один из операндов. Вот, что написано в спецификации по этому поводу: The value produced by a && or || operator is not necessarily of type Boolean. The value produced will always be the value of one of the two operand expressions. В секции 12.13.3 приведены непосредственно сами алгоритмы (о них еще более подробно ниже) работы этих операторов (|| и &&), из которых видно, что операнды действительно преобразуются к boolean типу. Здесь основная сложность может возникнуть с самим приведением, однако в последней редакции спецификации появилась очень удобная табличка, в которой в человеко-понятной форме расписано, какие значения к чему приводятся. Советую ознакомиться, если есть необходимость. Возвращаемое значение Здесь не все так очевидно. Хотя алгоритмы, приводимые спецификацией и являются исчерпывающими, думаю, их разъяснение здесь будет нелишним. Оператор && Если левый операнд преобразуется к false, то он и возвращается. В противном случае возвращается правый операнд: // Везде вернется левый операнд, поскольку он преобразуется к `false`. // И даже если и правый операнд тоже преобразуется к false, то все равно будет возвращен левый (случаи 4-6). let examples = [0 && true, false && "string", "" && 82, 0 && false, false && "", "" && 0]; examples.forEach((example) => { console.log(example); }); Оператор || Здесь левый операнд всегда будет возвращен наоборот только в том случае, если он приводится к true: // Если левый операнд приводится к true, то он же и возвращается. // И даже если и правый операнд тоже приводится к true, то все равно возвращается левый (случаи 3 и 4). // Однако если ни один из них не приводится к true, то возвращается последний (правый) (случаи 5 и 6). let examples = [true || false, "string" || "", true || true, 1 || [], false || 0, 0 || ""]; examples.forEach((example) => { console.log(example); });

Ответ 2



Согласно MDN: expr1 && expr2 возвращает значение expr1, если оно может быть преобразовано в false; иначе возвращает значение expr2 Так как в первом примере expr1 (5) преобразуется к true, то возвращается expr2 (2). Аналогично со вторым примером expr1 || expr2 возвращает значение expr1, если оно может быть преобразовано в true; иначе возвращает значение expr2 В третьем примере expr1 (5) преобразуется к true, поэтому оно и возвращается

Комментариев нет:

Отправить комментарий