一、 nrm 切换源头
1、node -v 、 npm -v (国外源)
2、npm源切换:npm i -g nrm || sudo npm i -g nrm
nrm ls 可以查看源头(可以使用nrm来切换源到yarn、taobao)
nrm test 测试 每一个源的响应时间
nrm use taobao 可以切换到淘宝源
nrm current 查看当前源
nrm add imox http:zz 可以新增一个源头(定制公司源头)
nrm del imox 可以删除自定义源头
二、let || var 不同之处
var: variable 表示可变的
**汇总: let **
不属于顶层对象window、不许重复声明变量、不存在变量提升、暂时性死区、块级作用域
(1)如何区分是对象还是变量 (使用delete: 只能删除对象属性,不能删除变量,不能删除原型链中的变量)
ES5之中,顶层对象的属性与全局变量是等价的。
var a = 5 // 输出结果一样是js设计初衷window和顶层对象挂钩,这是一个很严重的弊端
console.log(a)
console.log(window.a)
let b = 5 // 弥补js初衷设计的不足: window 和 顶层对象挂钩。导致全局变量污染
console.log(b)
console.log(window.b)
var name = 'lily';
delete name
console.log(name);
var obj = {name:'hello', age:10};
console.log('1', obj);
delete obj.name;
console.log('2',obj);
undefined || is not defined
(定义变量只是没有赋值,不会报错) 和 is not defined (没有定义,报错) 代表啥意思?
console.log(a) // undefined
var a = 5
console.log(b) // 报错
(2)暂时性死区: 防止变量在声明之前被使用、提高代码安全性。
if(true) { // 报错
a = 2
let a
}
function foo (a = b , b = 2) { // 报错 这是一个隐蔽的暂时性死区问题
console.log(a, b)
}
function foo (a = 2 , b = a) { // 正常执行
console.log(a, b)
}
foo()
(3)块级作用域
var 没有块级作用域, {} 内的值会被外部访问、所以会出输出值,
for(var i = 0 ; i < 3; i ++ ) {
console.log('内', i)
}
console.log('外’, i)
let块级作用域,{}内部形成了一个块,外部不能访问
for(let i = 0 ; i < 3; i ++ ) {
console.log('内', i)
}
console.log('外’, i) // 报错
for(var i = 0 ; i < 3; i ++ ) {
setTimeout(function() {
console.log(i)
}
}// for循环是同步优先执行,输出三为3,变量释放, 异步滞后执行,循环三次、所以是三个3。})}
(4)闭包简单理解
有一个外部函数、有一个内部函数、内部函数会调用外部函数的变量、这样保证外部函数这个变量的状态不会被释放,
for(var i = 0 ; i < 3; i ++ ) {
(function (j) {
setTimeout(function() {
console.log(j)
})})(i)
}
for(let i = 0 ; i < 3; i ++ ) {
setTimeout(function() {
console.log(i) // 自动形成了一个闭包,可以在babel里面查看
})}
四、const 常量
{}块级作用域、暂时性死区
(1)js中的变量储存: 栈(有序、大小明确、先进后出)、堆(无序任意存放)
栈内存: 基本类型(存放值固定空间)、引用类型(存放地址是固定空间)
堆内存:引用类型:数组、对象(引用类型值的存放,值是不固定空间)
引用类型:栈内存中存放地址指向堆内存中的对象,按引用访问。
基本类型:内存中分别占有固定大小的空间、值保存在栈空间。按值访问。
垃圾回收机制回收: 基本类型在当前执行环境结束时销毁,而引用类型不会随执行环境结束而销毁,只有当所有引用它的变量不存在时才销毁。
引用类型值大小不固定,分开存放使得程序运行占用内存最小。所以分配在堆里面。
js变量定义就分配了内存,内存的释放依赖于浏览器的垃圾回收机制,数据查询速度比较的话:栈远远快于堆,但是栈是固定大小的会导致栈溢出, 然而堆大小是不确定的,需要可以一直累加。(垃圾回收、避免栈溢出这也就解释了为什么基本类型值存放在栈中、引用类型值存放在堆中、引入类型在栈中只是存放了地址。)
(2)const 声明的常量不改变指的是什么??
基本类型指的是值不改变,所有const常量定义基本类型,赋值会报错。
引用类型指的的是变量的所指的内存地址不改变,但是内存地址里面的内容是可变的。
Object.freeze(obj) 冻结对象,不能冻结数组 : 注意这里的冻结只是浅冻结(浅拷贝)