var、let、const的区别

  最新的ECMAScript标准推荐使用let和const,所以在编码时应尽量使用let和const,而不是var。



// 使用var两次声明同一变量(不会报错)
var name = '张三';
var name = '李四';

// 使用var声明变量但不指定值(默认值为undefined)
var gender;

console.log('[LOG-1] typeof name is', typeof name); // [LOG-1] typeof name is string
console.log('[LOG-2] typeof gender is', typeof gender); // [LOG-2] typeof gender is undefined

var name;
console.log('[LOG-3] typeof name is', typeof name); // [LOG-3] typeof name is string
console.log('[LOG-4] name is', name); // [LOG-4] name is 李四

function foo() {
    console.log('[LOG-5] name is', name);
}

foo(); // [LOG-5] name is 李四

for (var num = 9527; num > 0; num--) {
    var language = 'PHP是世界上最好の语言';
    break;
}
console.log('[LOG-6] num is', num); // [LOG-6] num is 9527
console.log('[LOG-7] language is', language); // [LOG-7] language is PHP是世界上最好の语言

//========== 总结 ==========//
// 1、var的作用域是函数作用域,即变量只在声明它的函数内部可见。
// 2、在同一个作用域内,可以使用var重复声明同名变量。
// 3、使用var声明变量时若不指定值则默认值为undefined。



let name1 = '张三';
// let name1 = '张三'; // Uncaught SyntaxError: Identifier 'name1' has already been declared

if (true) {
    // 变量name2只能在当前代码块中使用
    let name2 = '李四';
    console.log('[LOG-1] typeof name2 is', typeof name2); // [LOG-1] typeof name2 is string
}

console.log('[LOG-2] typeof name1 is', typeof name1); // [LOG-2] typeof name1 is string
console.log('[LOG-3] typeof name2 is', typeof name2); // [LOG-3] typeof name2 is undefined

// 在for循环的圆括号里声明的变量num只能在循环体内使用
for (let num = 9527; num > 0; num--) {
    console.log('[LOG-4] num is', num); // [LOG-4] num is 9527

    let language = 'PHP是世界上最好の语言';

    // 这里再次使用let声明变量name1,其作用域是当前for循环内
    let name1 = '王五';
    console.log('[LOG-5] name1 is', name1); // [LOG-5] name1 is 王五

    break;
}
console.log('[LOG-6] name1 is', name1); // [LOG-6] name1 is 张三
console.log('[LOG-7] typeof num is', typeof num); // [LOG-7] typeof num is undefined
console.log('[LOG-8] typeof language is', typeof language); // [LOG-8] typeof language is undefined

//========== 总结 ==========//
// 1、let的作用域是块作用域,即变量只在声明它的{}内部可见,值得一提的是在for循环的圆括号里声明的变量只在循环体内可见。
// 2、在同一个作用域内,不能使用let重复声明同名变量,但是不同作用域内可以使用let重复声明同名变量。



const NAME = '张三';
// NAME = '李四'; // Uncaught TypeError: Assignment to constant variable.
console.log('[LOG-1] NAME is', NAME); // [LOG-1] NAME is 张三

if (true) {
    const NAME = '李四';
    console.log('[LOG-2] NAME is', NAME); // [LOG-2] NAME is 李四
}

console.log('[LOG-3] NAME is', NAME); // [LOG-3] NAME is 张三

//========== 总结 ==========//
// 1、const其实就是声明常量的关键字,且必须声明时就赋值,不能声明和赋值分开操作。
// 2、JavaScript的const和PHP的const在语法上完全一样,但是千万不要想当然地认为其作用域也是全局,事实上const和let一样都是块作用域,
//    在同一个作用域内不能重复声明,但不同作用域内可以重复声明同名常量(可参考上面的代码)。

Copyright © 2024 码农人生. All Rights Reserved