nrm、let、const、var

235 阅读4分钟

一、 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) 冻结对象,不能冻结数组 : 注意这里的冻结只是浅冻结(浅拷贝)