第三章

293 阅读5分钟

Day 2

语法基础

1.0语法

  • JS里区分一切大小写,所有标识符都要遵循首字符必须是字母或者下划线或者$。按照惯例采用驼峰命名法;

  • 所有语句以分号结尾,省略分号意味着由解析器自行决定,

1.1变量

声明方法

  • var :可以在所有版本中使用;使用 var 操作符定义的变量会成为包含它的 函数的局部变量。比如,使用 var 在一个函数内部定义一个变 量,就意味着该变量将在函数退出时被销毁:

    function test() {
        var message = "hi"; // 局部变量
    }
    test(); 
    console.log(message); // 出错!
    

​ 这里message在调用过后销毁了,所以错误,函数内省略var,可以创造一个全局变量,声明的变量会自动提升到函数作用域顶部

  • const:可以在es6后的版本使用

    • const 的行为与 let 基本相同,唯一一个重要的区别是用它声 明变量时必须同时初始化变量,且尝试修改 const 声明的变量会导 致运行时错误;
    • const 声明的限制只适用于它指向的变量的引用。换句话说, 如果 const 变量引用的是一个对象,那么修改这个对象内部的属性并不违反 const 的限制。
  • let: 可以在es6后的版本使用;

    • 和var的区别: let声明的是块级作用域;var声明的是函数作用域;

      • if (true) {
        var name = 'Matt'; console.log(name); // Matt 
        }
        console.log(name); // Matt 
        if (true) { 
        let age = 26; 
        console.log(age); // 26
        }
        console.log(age); // ReferenceError: age没有
        
      • let 也不允许同一个块作用域中出现冗余声明;

      • **暂时性死区 **let 与 var 的另一个重要的区别,就是 let 声明的变量不会 在作用域中被提升。

      • 循环迭代中 var定义的变量可以反复去定义,当然后面的会覆盖前面的 , 在循环绑定事件过程中,var定义的变量无法保存,循环会在瞬间执行完 , let定义的变量不会预解析,必须先声明再使用,否则会报错 , 在循环绑定事件过程中let会在这个循环中生效,再次循环时let会重新定义生效

        for (var i = 0; i < 5; ++i) {
            setTimeout(() => console.log(i), 0) 
        }// 你可能以为会输出0、1、2、3、4 // 实际上会输出5、5、5、5、5
        for (let i = 0; i < 5; ++i) {
            setTimeout(() => console.log(i), 0)
        }// 会输出0、1、2、3、4
        
  • 共同点:变量声明没有初始化的时候会保存undefined;

    小结

    var,let ,const,分别的特点:const声明的常量,阅读代码的人一看就意识到不应该修改这个值,let本身是一个块级作用域,let没有预编译和变量提升的问题,先声明再使用更为规范,使用场景来看:let 一般用于基本数据类型;const 多数使用引用数据类型也就是函数对象;

1.2 数据类型

ECMAScript有6种简单数据类型(也称为原始类型):Undefined 、 Null 、 Boolean 、 Number 、 String 和 Symbol

  • typeof: 用来检测数据类型的方法;

  • Number(): 可以用于任何数据类型转换成数值; parseInt()、parseFloat(): 专门用于把字符串转换成数值;

  • 字符串:ECMAScript中的字符串是不可变的(immutable),意思是一旦 创建,它们的值就不能变了。要修改某个变量中的字符串值,必须先销毁原始的字符串,然后将包含新值的另一个字符串保存到该变量,原先的两个销毁;

  • toString():吧一个值转换成字符串

  • Symbol 本质上是一种唯一标识符,可用作对象的唯一属性名,这样其他人就不会改写或覆盖你设置的属性值

  • Object:

    • constructor :用于创建当前对象的函数。在前面的例子中,

    这个属性的值就是 Object() 函数。

    • isPrototypeof(object) :用于判断当前对象是否为另一个 对象的原型。

    • toString() :返回对象的字符串表示。

    • Object 是所有对象的基类,所以任何对 象都有这些属性和方法。

  • 递增递减中,前缀和后缀的区别,前缀是先对自身进行操作,后缀是结果出来以后再对自身操作

    let num1 = 2;
    let num2 = 20; 
    let num3 = --num1 + num2;//这里num1 = 1
    let num4 = num1 + num2; 
    console.log(num3); // 21 console.log(num4); // 21
    let num1 = 2;
    let num2 = 20;
    let num3 = num1-- + num2;//num1还是2
    let num4 = num1 + num2;
    console.log(num3); // 22 console.log(num4); // 21
    
  • (!!)先对值调用Boolean(),然后再取反

  • 指数操作符

    let squared = 3;
    squared **= 2;
    console.log(squared); // 9 
    let sqrt = 16; sqrt **= 0.5;
    console.log(sqrt); // 4
    

    1.3条件操作符

    let max = (num1 > num2) ? num1 : num2;
    
    • 如果条件成立,则返回num1.否则num2;

    • do-while 里面的条件不管是否成立,所有条件都会执行一次

  • for ,for in ,for of:

    • 遍历数组通常用for循环

    • for in会遍历数组所有的可枚举属性,包括原型。所以for in更适合遍历对象,不要使用for in遍历数组。

    • for of遍历的只是数组内的元素,而不包括数组的原型属性method和索引name

总结:

  • 这章主要讲了ECMAScript中的基本数据类型;
  • if,for,switch语句等, 还有函数一些的,常用的,熟悉的就不做笔记了
  • 主要考察,3中声明变量的优缺点,前缀递增,后缀递增的区别,条件操作符等等,还有一些数据转换和操作,逻辑或和非得转换等,都是日常用的很多的,理解为主

本文使用 mdnice 排版