博客

以前在csdn segmentfault 掘金 有道 github都有零散的笔记或博客,但是太乱啦,还是自己搭一个整理下比较好

优秀博客

冴羽博客

木易杨说 博客

掘金翻译计划

前端导航

wxyyxc1992/Web-Series

cache github

中专逆袭blog

算法

又一个blog

underscore-analysis

吴恩达老师的机器学习课程个人笔记

###vue源码解析

开源项目总结库

awesome-vue

vue源码分析 2288 推荐

vue.js源码解析 5207 掘金

逐行阅读vue源码 3150 不维护

Vue 源码注释版 及 Vue 源码详细解析 643 不维护

###node学习

ele node面试 7705

koa2进阶学习笔记 2625

深入理解Node.js:核心思想与源码分析 2230

Node学习笔记 4239

###webpack学习 中文文档

深入浅出

【进阶 1 期】 调用堆栈

【进阶 2 期】 作用域闭包

【进阶 3 期】 this 全面解析

【进阶 4 期】 深浅拷贝原理

【进阶 5 期】 原型 Prototype

【进阶 6 期】 高阶函数

【进阶 7 期】 事件机制

【进阶 8 期】 Event Loop 原理

【进阶 9 期】 Promise 原理

【进阶 10 期】Async/Await 原理

【进阶 11 期】防抖/节流原理

【进阶 12 期】模块化详解

【进阶 13 期】ES6 重难点

【进阶 14 期】计算机网络概述

【进阶 15 期】浏览器渲染原理

【进阶 16 期】webpack 配置

【进阶 17 期】webpack 原理

【进阶 18 期】前端监控

【进阶 19 期】跨域和安全

【进阶 20 期】性能优化

【进阶 21 期】VirtualDom 原理

【进阶 22 期】Diff 算法

【进阶 23 期】MVVM 双向绑定

【进阶 24 期】Vuex 原理

【进阶 25 期】Redux 原理

【进阶 26 期】路由原理

【进阶 27 期】VueRouter 源码解析

【进阶 28 期】ReactRouter 源码解析

javascript-question

function getInfo(member, year) {
  member.name = "Lydia";
  year = "1998";
}

const person = { name: "Sarah" };
const birthYear = "1997";

getInfo(person, birthYear);

console.log(person, birthYear);

普通参数都是 值 传递的,而对象则不同,是 引用 传递。所以说,birthYear是值传递,因为他是个字符串而不是对象。当我们对参数进行值传递时,会创建一份该值的 复制 。(可以参考问题46)

变量birthYear有一个对"1997"的引用,而传入的参数也有一个对"1997"的引用,但二者的引用并不相同。当我们通过给 year赋值"1998"来更新year的值的时候我们只是更新了year(的引用)。此时birthYear仍然是"1997".

而person是个对象。参数member引用与之 相同的 对象。当我们修改member所引用对象的属性时,person的相应属性也被修改了,因为他们引用了相同的对象. person的 name属性也变成了 "Lydia".

57

// counter.js
let counter = 10;
export default counter;
// index.js
import myCounter from "./counter";

myCounter += 1;

console.log(myCounter);

Error

引入的模块是 只读 的: 你不能修改引入的模块。只有导出他们的模块才能修改其值。

当我们给myCounter增加一个值的时候会抛出一个异常: myCounter是只读的,不能被修改。

// index.js
console.log('running index.js');
import { sum } from './sum.js';
console.log(sum(1, 2));

// sum.js
console.log('running sum.js');
export const sum = (a, b) => a + b;


running sum.js, running index.js, 3
// a.js
export let count = 0;//输出的是值的引用,指向同一块内存
export const add = ()=>{
    count++;//此时引用指向的内存值发生改变
}

// b.js
import { count, add } from './a.js'

console.log(count) //0
add();
console.log(count)//1

  • esModule import命令是编译阶段执行的,在代码运行之前。因此这意味着被导入的模块会先运行,而导入模块的文件会后执行。 使得静态分析成为可能(按需引入)。

  • 这是CommonJS中require()和import之间的区别。使用require(),您可以在运行代码时根据需要加载依赖项(所以必须全局引入文件)。 如果我们使用require而不是import,running index.js,running sum.js,3会被依次打印。

  • 这样的设计,固然有利于编译器提高效率,但也导致无法在运行时加载模块。在语法上,条件加载就不可能实现。如果import命令要取代 Node 的require方法,这就形成了一个障碍。因为require是运行时加载模块,import命令无法取代require的动态加载功能。so-----出现import()动态加载提案。返回一个 Promise 对象.

const path = './' + fileName;
const myModual = require(path);
import(path).then()
  • commentJs具有缓存。在第一次被加载时,会完整运行整个文件并输出一个对象,拷贝(浅拷贝)在内存中。下次加载文件时,直接从内存中取值
  • commonJs输出的是值的浅拷贝esModule输出值的只读引用,也就是 假如我在b中引入了a的x值,再调用a的方法改变x,这时在打印x,是改变后的
async function getData() {
  return await Promise.resolve("I made it!");
}

const data = getData();
console.log(data);

 Promise {<pending>}
 异步函数始终返回一个promise。await仍然需要等待promise的解决:当我们调用getData()并将其赋值给data,此时data为getData方法返回的一个挂起的promise,该promise并没有解决。

如果我们想要访问已解决的值"I made it!",可以在data上使用.then()方法
function giveLydiaPizza() {
  return "Here is pizza!"
}

const giveLydiaChocolate = () => "Here's chocolate... now go hit the gym already."

console.log(giveLydiaPizza.prototype)
console.log(giveLydiaChocolate.prototype)

箭头函数没有prototype
Last Updated: 11/29/2019, 3:28:21 PM