学习记录 -- 知识点

1.js数组赋值问题:值传递仍是引用传递?

var a = [1, 2, 3]
var b = a // 该操做后,b直接指向数组对象,不是b指向a,a再指向数组。
a = [3, 4, 5]
复制代码

Q:请问b的值是多少? 【b = [1, 2, 3]】程序员

大多数人会这么想,因为数组是引用类型,所以认为答案是[3, 4, 5] ,其实咱们能够把数组[3, 4, 5]看作是数组c,那么当a=c其实a已经再也不指向原来的数组对象了 json

var a = [1, 2, 3]
var b = a
a.pop()
复制代码

Q:请问b的值是多少? 【b = [1, 2]】数组

2.js中的深拷贝和浅拷贝

首先咱们先来回顾一下js数据类型:
值类型:数字、字符串、布尔、undefined、null
引用类型:数组、对象、函数bash

引用类型和值类型的区别:异步

  • 引用类型能够对其添加属性、方法;
    值类型不能够;
  • 引用类型的复制是将其存储变量的值复制一份,但两个变量所指向的地址是同样的,因此会出现其一改变,其二也跟着改变;
    值类型是复制就是在变量对象上建立一个新的值,两个值改变不会相互影响;
  • 引用类型用instanceof() ;
    值类型用typeof();
var a = 1
var b = {};
var c = [];
a.name = 'mm';
b.name = 'Adela';

a.name // undefined
b.name // "Adela"

typeof(a) // "number"
typeof(b) // "object"
typeof(c) // "object"
b instanceof Object // true
c instanceof Array // true
复制代码

深拷贝方法:
① 数组: slice、concat、ES6扩展运算符实现数组的深拷贝async

var arr1 = [1, 2, 3, 4]
var arr2 = arr1.slice(0)
arr2.pop() // 4
arr1 // [1, 2, 3, 4]
arr2 // [1, 2, 3]
复制代码
var arr1 = [1, 2, 3, 4]
var arr2 = arr1.concat()
arr2.pop() // 4
arr1 // [1, 2, 3, 4]
arr2 // [1, 2, 3]
复制代码
var arr1 = [1, 2, 3, 4]
var [...arr2] = arr1
arr2.pop() // 4
arr1 // [1, 2, 3, 4]
arr2 // [1, 2, 3]
复制代码

② 对象:JSON.parse(JSON.stringify(obj1)、ES6扩展运算符实现数组的深拷贝
JSON.parse(str): parse用于从一个字符串中解析出json对象
JSON.stringify(obj):stringify()用于从一个对象解析出字符串函数

var obj1 = {
  name: 'Adela',
  age: '18',
}
var obj2 = JSON.parse(JSON.stringify(obj1))
obj1.name = 'mm'
obj1 // {name: "mm", age: "18"}
obj2 // {name: "Adela", age: "18"}
复制代码
var obj1 = {
  name: 'Adela',
  age: '18',
}
var {...obj2} = obj1
obj1.name = 'mm'
obj1 // {name: "mm", age: "18"}
obj2 // {name: "Adela", age: "18"}
复制代码

3.JavaScript做用域了解吗?有多少种?

做用域:是指你代码的上下文环境,js做用域包括全局做用域函数做用域块做用域(ps:这是ES6新增的)ui

4.说说 async 和 await

async异步的简写,而await能够认为是async wait 的简写。
async 用于申明一个 function 是异步的,而 await 用于等待一个异步方法执行完成。spa

sync 会将其后的函数(函数表达式或 Lambda)的返回值封装成一个Promise 对象,而 await 会等待这个 Promise 完成,并将其resolve的结果返回出来。3d

async/await 的优点在于处理 then 链

// 假设一个业务,分多个步骤完成,每一个步骤都是异步的,并且依赖于上一个步骤的结果
async function doIt() {
    console.time("doIt");
    const time1 = 300;
    const time2 = await step1(time1);
    const time3 = await step2(time2);
    const result = await step3(time3);
    console.log(`result is ${result}`);
    console.timeEnd("doIt");
}

doIt();
复制代码

Async 函数的错误处理

当 async 函数中只要一个 await 出现 reject 状态,则后面的 await 都不会被执行。解决办法:能够添加 try/catch

let a;
async function correct() {
    try {
        await Promise.reject('error')
    } catch (error) {
        console.log(error)
    }
    a = await 1
    return a
}
复制代码

术语 1.语法糖(Syntactic Sugar),也称糖衣语法,指在计算机语言中添加的某种语法,这种语法对语言自己功能来讲没有什么影响,只是为了方便程序员的开发,提升开发效率。说白了,语法糖就是对现有语法的一个封装。

相关文章
相关标签/搜索