记录红宝书知识点笔记

143 阅读5分钟

语言基础

语法

标识符

  1. 标识符,就是变量、函数名、函数参数、属性的名称。具体规则可以去看红宝书,这里只介绍什么是标识符。

  2. 代码加分号可以提高性能,否则浏览器还要去判断一下,这一行代码要不要加分号。

  3. 标识符使用驼峰命名法

变量

varlet 的注意事项和区别

  1. 未初始化的变量,会默认放一个值为undefined存起来。未初始化,现在我这里理解成就是未赋初值的变量。

    var msg; // undefined
    
  2. 没有声明的变量会报错。所以声明和初始化,一个会报错,一个不会报错。

  3. 在函数内部不使用var或者let声明的变量,会是一个全局变量,函数执行完后,该变量不会被销毁。但是一般不建议这么做,因为不利于维护。

    function fun(){
       var msg = 'hello world'
    }
    fun();
    console.log(msg) // 出错
    
    function fun(){
        msg = 'hello world'
    }
    fun();
    console.log(msg) // 'hello world'
    
  4. letvar区别

    • let声明的范围是块作用域,就是声明的变量的范围在一个代码块中。代码块用{}表示,比如if中声明的变量只能在这块代码中有效。

    • let声明的变量不会被变量提升。这里会引申一个知识点叫暂时性死区

    暂时性死区: 在let声明变量之前,代码执行的瞬间称为暂时性死区,在此阶段引用任何后面声明的变量,都会抛出错误:ReferenceError,简而言之,就是引用未被声明的变量,会出现暂时性死区。

    • var关键字不同,使用let声明的变量不会被挂载到window上.

      var msg = 'hello world';
      console.log(window.msg) // 'hello world'
      
      let msg = 'hello world';
      console.log(window.msg) // undefined
      
    • for循环中的letvar

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

      var: 所有的i都是同一个变量。所以最后打印的是同一个

      let:每次都会重新声明一个新的i。所以每一个i都对应有一个console let声明的变量不能被重新定义,而var可以被重新定义。

数据类型

基础数据类型+复杂数据类型

基础数据类型有6种:Null,Undefined,Number,String,Boolean,Symbel

复杂数据类型:Object,以上6种数据类型不足以区分具体的数据类型,所以typeof就来了。可以区分对象和函数,

  1. Undefined类型只有一个值:undefined,就是未赋初始值时,存的值就是undefined,(注意不是字符串'undefined')

    typeof undefined // 'undefined'
    typeof null // 'object'
    typeof 函数 // 'function'
    

    能让typeof undefined === 'undefined'有两种情况: 未声明的变量和未赋初始值的变量。用typeof检测会返回'undefined'

    let msg 
    console.log(typeof msg) // 'undefined'
    console.log(typeof a) // 'undefined'
    
  2. null == undefined

  3. 如果一个变量将来需要存对象但是目前又不知道存谁,则可以给这个变量先赋初始值null,因为null表示的是一个空对象。

  4. Number()类型

    • NaN:不是数值,用于表示本来要返回的数据是数字,返回失败了,没有报错,就返回了NaN.
    • isNaN(value):判断一个数是否是NaN,会首先将value转换为数值,转换失败了的就会返回true。在项目中的应用场景可以应用于,将value转换为数值,用isNaN(value)来判断是否转换异常。
    • isNaN()确实也适用于对象。在基于对象调用 isNaN() 函数时,会首先调用对象的 valueOf()方法,然后确定该方法返回的值是否可以转 换为数值。如果不能,则基于这个返回值再调用 toString()方法,再测试返回值。 而这个过程也是 ECMAScript 中内置函数和操作符的一般执行流程,更详细的内容请 参见 3.5 节。
    var obj = {0: 1}
    obj.valueOF() // {0: 1}
    Number({0: 1}) // NaN
    obj.valueOf().toString() // "[object object]"
    Number("[object object]") // NaN
    // 所以 
    isNaN({0: 1}) // true
    
  5. String类型

  • 任何数据类型都有toString()方法,转换为字符串,但是nullundefined没有,要想要nullundefined也可以转换为对应的字符串格式,可以用String(null/undefined)=> "null" /"undefined"
  • 要把某个值转换为字符串,可以使用加号操作符,把它与一个字符 串("")加在一起。
  1. Object类型
  • Object 的每个实例都具有下列属性和方法。

    var obj = new Object()
    

    constructor: obj.constructor => Object(),表示obj这个对象是由哪个函数创造出来的,constructor英文就是构造者的意思。 hasOwnProperty():obj.hasOwnProperty('name'):判断某个属性是否在这个对象自身属性上。如这个'name'属性是否在obj对象的自身属性上。 isPrototypeOf(object):目前不清楚

    propertyIsEnumerable(属性名):用于检查给定的属性是否能够使用 for-in 语句来枚举.

    toLocaleString():返回对象的字符串表示

    toString():返回对象的字符串表示。这两个啥区别?

    valueOf():返回对象的字符串、数值或布尔值表示

关系运算符

  1. 对象与其他类型数据(不是对象)比较大小,会先运用对象的valueOf()方法,转换为基础数据类型,再去比较。

    在这里可以改写对象的valueOf方法,修改返回值。

    var obj1 = {
        a: 1,
        valueOf() {
            return 3
        }
    }
    var a = 3
    console.log(obj1 == a) // true
    console.log(obj1 === a) // false