一、JSON 方法

1、 `json` 是一种特殊的字符串个是,本质是一个字符串

var jsonObj = '{ "name": "Jack", "age": 18, "gender": "男" }'

①、 `json.stringify(变量)` 是将 js 的对象或者数组转换成为 json 格式的字符串

②、`JSON.parse(变量)`  是将 json 格式的字符串转换为 js 的对象或者数组

二、call 和 apply 和 bind  改变this的指向

1、call

- `call` 方法是附加在函数调用后面使用,可以忽略函数本身的 this 指向

- 语法: `函数名.call(要改变的 this 指向,要给函数传递的参数1,要给函数传递的参数

2、apply

- `apply` 方法是附加在函数调用后面使用,可以忽略函数本身的 this 指向

- 语法: `函数名.apply(要改变的 this 指向,[要给函数传递的参数1, 要给函数传递的参数2, ...])`

3、bind

- `bind` 方法是附加在函数调用后面使用,可以忽略函数本身的 this 指向

- 和 call / apply 有一些不一样,就是不会立即执行函数,而是返回一个已经改变了 this 指向的函数

- 语法: `var newFn = 函数名.bind(要改变的 this 指向); newFn(传递参数)`

三、let 和 const 关键字

 `let` 和 `const` 相同点

1.  `let` 和 `const` 不允许重复声明变量

2. `let` 和 `const` 声明的变量不会在预解析的时候解析(也就是没有变量提升)

3. `let` 和 `const` 声明的变量会被所有代码块限制作用范围

 `let` 和 `const` 的区别

  1. `let` 声明的变量的值可以改变,`const` 声明的变量的值不可以改变

  2. `let` 声明的时候可以不赋值,`const` 声明的时候必须赋值

四、箭头函数

- 语法: `(函数的行参) => { 函数体内要执行的代码 }`

1、箭头函数的特殊性

①、箭头函数内部没有 this,箭头函数的 this 是上下文的 this

②、 箭头函数内部没有 `arguments` 这个参数集合

③、函数的行参只有一个的时候可以不写 `()` 其余情况必须写

fn2: a => {
      console.log('一个行参,可以不写小括号')
    },
    fn3: (a, b) => {
      console.log('两个或两个以上参数,必须写小括号')
    }

④、函数体只有一行代码的时候,可以不写 `{}` ,并且会自动 return

fn: a => {
      return a + 10
    },
    fun: a => a + 10

五、解构赋值

- 解构赋值,就是快速的从对象或者数组中取出成员的一个语法方式

1、解构对象    快速的从对象中获取成员  

// 解构赋值的方式从对象中获取成员
  const obj = {
    name: 'Jack',
    age: 18,
    gender: '男'
  }
  // 前面的 {} 表示我要从 obj 这个对象中获取成员了
  // name age gender 都得是 obj 中有的成员
  // obj 必须是一个对象
  let { name, age, gender } = obj

2、解构数组   快速的从数组中获取成员

// 使用解构赋值的方式从数组中获取成员
  const arr = ['Jack', 'Rose', 'Tom']
  // 前面的 [] 表示要从 arr 这个数组中获取成员了
  // a b c 分别对应这数组中的索引 0 1 2
  // arr 必须是一个数组
  let [a, b, c] = arr

六、模版字符串

- ES5 中我们表示字符串的时候使用 `''` 或者 `""`

- 在 ES6 中,我们还有一个东西可以表示字符串,就是 **``**(反引号)

1. 反引号可以换行书写

     

```javascript
     // 这个单引号或者双引号不能换行,换行就会报错了
     let str = 'hello world'
    
     // 下面这个就报错了
     let str2 = 'hello
     world'
     ```
     ```javascript
     let str = `
      hello
      world
     `
     console.log(str) // 是可以使用的
     ```

  2. 反引号可以直接在字符串里面拼接变量

   

```javascript
     // ES5 需要字符串拼接变量的时候
     let num = 100
     let str = 'hello' + num + 'world' + num
     console.log(str) // hello100world100
     // 直接写在字符串里面不好使
     let str2 = 'hellonumworldnum'
     console.log(str2) // hellonumworldnum
     ```
     ```javascript
     // 模版字符串拼接变量
     let num = 100
     let str = `hello${num}world${num}`
     console.log(str) // hello100world100
     ```

     - 在 **``** 里面的 `${}` 就是用来书写变量的位置

七、展开运算符

1、作用是把数组展开

```javascript
  let arr = [1, 2, 3, 4, 5]
  console.log(...arr) // 1 2 3 4 5

2、 合并数组的时候可以使用

 

```javascript
  let arr = [1, 2, 3, 4]
  let arr2 = [...arr, 5]
  console.log(arr2)
  ```

3、 也可以合并对象使用

 

```javascript
  let obj = {
    name: 'Jack',
    age: 18
  }
  let obj2 = {
    ...obj,
    gender: '男'
  }
  console.log(obj2)
  ```

4、在函数传递参数的时候也可以使用

 

```javascript
  let arr = [1, 2, 3]
  function fn(a, b, c) {
    console.log(a)
    console.log(b)
    console.log(c)
  }
  fn(...arr)
  // 等价于 fn(1, 2, 3)
  ```