0

Объясните пожалуйста приведение типов к 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 нет??

Mcile
  • 1,524
  • 11
  • 27
  • @doox911 там объясняется про знак +, а именно что он может выступать в качестве конкатенации, если одно из слагаемых строка, также говорится о том что [2] приводится к "2", но не раскрывает сути вопроса. Я думаю мало кто может дать ответ на вышеприведенный вопрос... – Mcile Jan 19 '19 at 13:00

1 Answers1

0

Вот, что происходило во время выполнения. почему именно такие результаты - потому что при приведении результатов к 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 ) );

Misha Saidov
  • 5,416
  • есть этому техническое обоснование? – Mcile Jan 19 '19 at 15:01
  • @Mcile это задокументированное поведение http://www.ecma-international.org/publications/standards/Ecma-262.htm. такова специфика языка. – Misha Saidov Jan 19 '19 at 15:08