编程题解析【2】

106 阅读2分钟

编程题2


以下代码执行结果是:( )
var a = 1; let b = 2;
console.log(window.a,window.b);

分析1

var声明的变量会挂载在window

分析2

var let const详解

前言
上面三个都用来声明变量

1

挂载window情况
var a = 1;
console.log(a,window.a);    // 1   1

let b = 1;
console.log(b,window.b);    // 1   undefined

const c = 1;
console.log(c,window.c);    // 1  undefined

var声明的变量会挂载在window上,其他两个不会

2

    console.log(a);  
    var a = 1;
    结果为 undefined  
    var具有变量提升的特性   所以a已声明但还没赋值,所以得到undefined值
    下面代码同上
    var a,
    console.log(a),
    a=1

    onsole.log(b); 
    let b = 1;
    结果报错:b is not defined  

    console.log(c);
    const c = 1;
    结果报错:c is not defined 

    let 和 const 都不具有变量提升特性,按照代码从上到下执行,那么在打印时并没有这个值  所以就找不到了

3

    比较作用域
    if(true){
    var a = 1;
    let b = 1;
    const c = 1;
        }
    console.log(a);   结果为1
    console.log(b)  结果报错:b is not defined  
    console.log(c)  结果报错:c is not defined  
    这里可以看出let 和 const形成的是块级作用域

4

    重复声明一个变量时
    只有var可以重复声明变量,后面声明的同一个变量会覆盖前面的

    if(true){
    var a = 1;
    var a = 2
    console.log(a)
    结果为2  //后面的会覆盖前面声明的
    }

    if(true){
    let b = 1;
    let b = 2
    console.log(b)
    结果为控制台报错:Identifier 'b' has already been declared    意思b已经被声明了。
    }

    if(true){
    const c = 1;
    const c = 2
    console.log(c)
    结果为控制台报错:Identifier 'c' has already been declared    意思b已经被声明了。
    }

5

    var的暂时性死区特性

    var a = 1;
    if(true){
    a = 10;
    //在当前块作用域中存在a使用let/const声明的情况下,给a赋值10时,只会在当前作用域找变量a,
    // 而这时,还未到声明时候,所以控制台Error:a is not defined
    let a = 1;
    }

6

    const的特性

    一旦声明必须赋值,不能使用null占位

    声明后不能再修改

    如果声明的是复合类型数据,可以修改其属性

    const a = 1;   
    const arr = [1,2]
    const obj = {name:'小明'}
    //const用来声明常量,就是固定的值,一般不做修改