1.变量

1.1 var

1.1.1 函数作用域

  1. function test() {
  2. var message = 'hi'; // 局部变量
  3. }
  4. test();
  5. console.log(message); // 出错!
  6. // 虽可以省略var定义,变成全局变量,但不推荐使用,难以维护
  7. function test() {
  8. message = 'hi'; // 全局变量
  9. }
  10. test();
  11. console.log(message); // "hi"

1.1.2 变量提升

使用var声明的变量会自动提升到函数作用域顶部

  1. function foo() {
  2. console.log(age);
  3. var age = 26;
  4. }
  5. foo(); // undefined
  6. // age变量提升,相当于
  7. function foo() {
  8. let age;
  9. console.log(age);
  10. age = 26;
  11. }
  12. foo(); // undefined

1.1.3 可重复声明

  1. var age = 16;
  2. var age = 26;
  3. var age = 36;
  4. console.log(age); // 36

1.1.4 全局属性

  1. var a = 'ming';
  2. console.log(window.a); // ming

1.2 let

1.2.1 块级作用域

  1. if (true) {
  2. var name = 'ming';
  3. console.log(name); // ming
  4. }
  5. console.log(name); // ming
  6. if (true) {
  7. let age = 23;
  8. console.log(age); // 23
  9. }
  10. console.log(age); // ReferenceError: age 没有定义


1.2.2 没有变量提升,暂时性死区

  1. // var声明,name 会被提升
  2. console.log(name); // undefined
  3. var name = 'ming';
  4. // let声明,age 不会被提升
  5. console.log(age); // ReferenceError:age 没有定义
  6. let age = 23;


1.2.3 不能重复声明,不能条件声明

  1. // 混用 let 和 var 声明,结果一样
  2. let age;
  3. let age; // SyntaxError;标识符 age 已经声明过了
  4. if (typeof name === 'undefined') {
  5. let name;
  6. }
  7. // name 被限制在 if {} 块的作用域内
  8. // 因此这个赋值形同全局赋值
  9. name = 'ming';


1.2.4 for循环中的let声明

  1. for (var i = 0; i < 5; ++i) {
  2. setTimeout(() => console.log(i), 0); // 5、5、5、5、5
  3. }
  4. for (let i = 0; i < 5; ++i) {
  5. setTimeout(() => console.log(i), 0); // 0、1、2、3、4
  6. }

1.3 const

与let基本相同,唯一区别声明时必须同时初始化变量、且不可修改

  1. const age = 23;
  2. age = 36; // TypeError: 给常量赋值

1.4 声明风格及最佳实践

**

  • 不使用var
  • const优先,let次之

    2.数据类型

  • 原始类型: undefined null boolean number string symbol bigint

  • 复杂类型: object

2.1 typeof

  1. // 使用var let声明过且未经初始化的值都会被赋予undefined
  2. let name
  3. console.log(name == undefined) // true
  4. // 等同于
  5. let name = undefined
  6. // 识别所有值类型
  7. let a; typeof a // 'undefined'
  8. const str = "abc"; typeof str // 'string'
  9. const num = 100; typeof num // 'number'
  10. const boo = true; typeof boo // 'boolean'
  11. const sym = Symbol('s'); typeof sym// 'symbol'
  12. typeof null // 'object

2.2 字符串拼接

  1. const a = 100 + 10; // 110
  2. const b = 100 + '10'; // '10010'
  3. const c = true + '10'; // 'true10'

3.运算符

3.1 ==

  1. / == 运算符
  2. 100 == '100'; // true
  3. 0 == ''; // true
  4. 0 == false; // true
  5. false == ''; // true
  6. null == undefined;// true
  7. // 除了 == null 之外,其他一律用 ===
  8. const obj = { x: 100 };
  9. if (obj.a == null) {
  10. }
  11. // 相当于:
  12. // if (obj.a === null || obj.a === undefined) {
  13. // }

3.2 truly和falsely

  1. // 以下是 falsely 变量 除此之外都是 truly 变量
  2. !!0 === false;
  3. !!Nan === false;
  4. !!'' === false;
  5. !!null === false;
  6. !!undefined === false;
  7. !!false === false;

3.3 短路运算符

  1. // 逻辑判断
  2. console.log(10 && 0); //0 前为false直接跳过
  3. console.log('' || 'abc'); //'abc' 前为true直接跳过
  4. console.log(!window.abc); //true