js数据类型 作用域 优先级 执行顺序

235 阅读2分钟
  1. typeof类型:
   {} / [] / null ==> object;

    3 / NaN ==> number ;

    " "==>String;

    typeof true==>boolean;

    undefined ;

    function;

2.常见代码解析:

//1.要求:每隔1s依次输出123,请分析 
    for(var i=1;i<4;i++){ //同步 
      setTimeout(()=>{ //异步 
        console.log(i); },1000*i)
    } //输出 4 4 4 
    //setTimeout()是一个异步方法,每一次for循环,settimeout都执行一次,但是里面的函数没有立即执行,而是被放到了任务队列,等待执行; 等主程序运行完,再调用; 
    //主线for循环全部执行完,才会执行任务队列里的任务,当主线执行完成后,此时i=4,所以打印3次4; //解决1:用es6的【let i=0,输出 1 2 3】
    //用let来定义i,i成为块级变量,会绑定到循环体的每一次迭代中; 
    //解决2:把setTimeout放到一个自执行的函数中去执行,将i作为参数传进去

3循环终止条件!

 var x; 
 for(var i=0,j=0;i<6,j<10;i++,j++){
    x=i+j; 
 } 
 console.log(x); //18=9+9 
 //注意:终止条件是i<6,j<10,同时都不满足才会结束/跳出循环,否则一直会执行i++,j++;

4 作用域,优先级!变量提升!

//作用域,变量提升: 
//**原则1:先在内部找,如果找不到,才可以向外查找; 
//**原则2:优先级【变量且赋值 > 函数 > 传参数 > 变量提升】; 
//尝试做以下8个题 练练脑
var bar = 1; 
function aa(){ 
    console.log(bar); //1 //内部找不到变量bar,找外部; 
}
aa();

function bb(){
    console.log(bar); //undefined //下句:变量var bar;会提升到最前面申明。找到了,所以不往外找了。 
    var bar =2; console.log(bar); //2 
};
bb();

function fn(bar2){ 
    console.log(bar2); //5
    var bar2=1; 
};
fn(5);
//不传参数,无后面那句,“报错”;【找不到变量】
//不传参数5,有后面那句,“undefined”;【变量提升】 
//传参数+后面那句,输出“5”; 【传参优先级>变量提升】

function fn(bar3){ 
  console.log(bar3); //bar3(){return "函数2";} 
  var bar3 = 1; 
  function bar3(){ return "函数1"; } 
  function bar3(){ return "函数2"; } 
};
fn(6);
//函数>传参数>变量提升,且同优先级后者函数覆盖前者=输出函数

function fn(bar3){ 
 var bar3 = 1; //变量且赋值 //变量赋值优先级最高!!
 console.log(bar3); //输出 1 
 function bar3(){ return "函数1"; } 
 function bar3(){ return "函数2"; } 
};
fn(6);

var foo = function(){
 console.log(1); 
} 
function foo(){ console.log(2); }
foo();//答案:输出 1 //变量(用函数赋的值)优先级 > 函数;和代码前后位置无关

function c(){ 
  var b = 1; 
  function a(){ 
      console.log(b); //undefined //下一句变量提升 
      var b=2; console.log(b); //2 
  } 
  a();
  console.log(b); //1 //外面拿不到里面的 
};
c();

var name ="张三"; 
(function(){ 
    if(typeof name == 'undefined'){ 
        var name = "李四"; 
        console.log("111"+ name) 
    }else{ 
      console.log("222" + name)} 
})();
//输出:111李四 //因为匿名函数内部有var变量提升,所以满足==undefined,不会往外找 

5 浮点型数据

//因为js只有number数据类型,无浮点型 
console.log(0.1+0.2); //0.30000000000000004 
console.log(0.1+0.2==0.3); //false
//字符串类型的计算:+是连接,- * / 都是计算 
var a='10';b=20;
console.log(a+b,a-b,a*b,a/b); //1020 -10 200 0.5

6 隐式转换:某些类型在被参与计算的时候会被转化为其他类型~

console.log(true+1); //2 //true隐式转化为number类型 1 
console.log('name'+true);//nametrue //所有字符串类型不进行转化 
console.log(undefined+1);//NaN //undefined隐式转化为number类型NaN 
console.log(typeof null); //object