JavaScript приведение типов к числу и строке [дубликат]

112
17 августа 2019, 10:40

На данный вопрос уже ответили:

  • Преобразование скалярных типов при сравнении JavaScript 2 ответа

Объясните пожалуйста приведение типов к number, string в js на основе нижеприведенного примера или где об этом можно подробно почитать на русском.

var a = {a:0,b:'',c:null,d:undefined,e:NaN,f:false,g:[],h:{}}
var b = ['a','b','c','d','e','f','g','h'];
function f(call){
    for(var i = 0; i< b.length; i++){
        if(call(b[i]) ){
            console.log(b[i]);
        }
    }
}
f((key)=>a[key]);//gh
f((key)=>a[key]!=null);//все кроме cd
f((key)=>(++a[key]));//abcfg

после этого добавил больше значений

var a = {a:0,b:'',c:null,d:undefined,e:NaN,f:false,g:[],h:{},i:1,j:'one',k:[1],l:{a:true},m:[1,2],n:1e-6,o:0.9}
var b = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o'];
function f(call){
    for(var i = 0; i< b.length; i++){
        if(call(b[i]) ){
            console.log(b[i]);
        }
    }
}
f((key)=>++a[key]);//все кроме dehjlm
f((key)=>a[key]+'');//все кроме bg
f((key)=>a[key]);//все кроме abcdef
f((key)=>a[key]!=null);//все кроме cd

Проверил это следующим выводом

f((key)=>{
    console.log(`a[${key}]`+' => '+typeof(a[key])+`; ++a[${key}]`+' => '+(++a[key]));
  return false;
});
f((key)=>{
    console.log(`a[${key}]+''`+' => '+a[key]);
  return false;
});

Из этого понял что:

  • только [] при преобразовании к строке вернет '' , остальные вернут какие то символы;
  • массив является объектом и любой объект в преобразовании к bool это всегда true;
  • null==undefined;
  • js не может привести к числу undefined,NaN,любой объект, не пустую строку и массив содержащий больше 1 элемента, а также массив содержащий строку;

хотелось бы почитать объяснение такого поведения интерпретатора на русском

если null==undefined, то почему null можно привести к числу, а undefined нет??

Answer 1

Вот, что происходило во время выполнения. почему именно такие результаты - потому что при приведении результатов к Boolean возвращается true. Так работает js (в других языках может быть иначе).

//#1 
console.log( Boolean( [] ) ); 
console.log( Boolean( {} ) ); 
 
//#2 
console.log( null == null ); 
console.log( null == undefined ); 
 
//#3 
var foo = 0; 
console.log( Boolean( ++foo ) ); 
var foo = ""; 
console.log( Boolean( ++foo ) ); 
var foo = null; 
console.log( Boolean( ++foo ) ); 
var foo = false; 
console.log( Boolean( ++foo ) ); 
var foo = []; 
console.log( Boolean( ++foo ) );

READ ALSO
Как хранить данные в React сторе, полученные через Apollo graphQL?

Как хранить данные в React сторе, полученные через Apollo graphQL?

Есть React и Redux, храним данные в стореСейчас переходим на получение данных через graphQL, будем использовать Apollo

115
Как в vue.js роутере сделать ссылку на api?

Как в vue.js роутере сделать ссылку на api?

Использую стандартный пакет vue с webpack из коробки, но не могу обработать определённые api путиНужно, что б по этим путям запускался код node

99
Как открыть ссылку в новом окне (таблицы google)

Как открыть ссылку в новом окне (таблицы google)

Есть небольшая форма со скриптом, через которую осуществляется загрузка файлов на google диск сторонними пользователямиПользователь вводит...

98
MYSQL Current_Date

MYSQL Current_Date

Есть строчка из триггера:

120