Posts Notes
Post
Cancel

Notes

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
## [...undefined] 输出什么?
// Uncaught TypeError: undefined is not iterable

[...{}] // Uncaught TypeError: {} is not iterable

undefined/{} 没有实现iterator接口
一种数据结构只要部署了 Iterator 接口,我们就称这种数据结构是“可遍历的”

## Iterator 的作用有三个:
一是为各种数据结构,提供一个统一的、简便的访问接口;
二是使得数据结构的成员能够按某种次序排列;
三是 ES6 创造了一种新的遍历命令for...of循环,Iterator 接口主要供for...of消费。

const counter = {
  next() {
    return { value: undefined, done: true };
  },
  [Symbol.iterator]() {
    return this;
  },
};

## 那想实现 [...obj] 展开一个普通对象,有办法吗?
展开对象的 key:[...Object.keys(obj)]
展开对象的 value:[...Object.values(obj)]
展开整个对象:[...Object.entries(obj)]

## 那 {...undefined} 执行结果是什么?
执行结果则是返回一个 {} 空对象,{...true}、{...1}、{...null} 亦是如此

## {...[1, 2, 3]} 执行结果呢?
{...[1, 2, 3]} // {0: 1, 1: 2, 2: 3}
首先在对象中不能将 ... 后面当作 可迭代对象 看待,应该看作是一个普通对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# js的数据是存在“堆”还是“栈”?

## 堆
在栈中存储不了的数据比如对象就会被存储在堆中,在栈中呢是保留了对象在堆中的地址,也就是对象的引用

## 栈
栈是内存中一块用于存储局部变量和函数参数的线性结构,遵循着先进后出的原则
## 栈中的变量在函数调用结束后,就会消失。 这也正是栈的特点:无需手动管理、轻量、函数调时创建,调用结束则消失。
##对于原始类型,数据本身是存在栈内,对于对象类型,在栈中存的只是一个堆内地址的引用


## 闭包
函数A中返回了函数B, 函数B中调用了在函数A中定义的变量
funcion A() {
	let a = 1;
	return () => {
		console.log("a", a);
	}
}

## 已知变量a存在栈中,为什么闭包中的a没有被销毁?
- 除了局部变量,其他的全都存在堆中

#变量类型:
局部变量:在函数返回后不会被其他作用域所使用
全局变量:会被默认添加到函数作用域链的最低端
# 注意: 全局var变量只会给global对象增加一个属性, 全局let / const变量不会改变window对象
捕获变量:在函数中声明,但在函数返回后仍有未执行作用域(函数或是类)使用到该变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
for每一次循环的代码都是独立的代码块,let是块级作用域变量
for (var i = 0; i <10; i++) {  
    setTimeout(function() {  // 同步注册回调函数到 异步的 宏任务队列。
         console.log(i);        // 执行此代码时,同步代码for循环已经执行完成
      }, 0);
}
 // 输出结果
//10   共10个 

// i虽然在全局作用域声明,但是在for循环体局部作用域中使用的时候,变量会被固定,不受外界干扰。
for (let i = 0; i < 10; i++) { 
  setTimeout(function() {
    console.log(i);    //  i 是循环体内局部作用域,不受外界影响。
  }, 0);
}
// 输出结果:
0  1  2  3  4  5  6  7  8 9

暂时性死区:ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错

总结:
var 存在提升,我们能在声明之前使用。let、const 因为暂时性死区的原因,不能在声明前使用
var 在全局作用域下声明变量会导致变量挂载在 window 上,其他两者不会
let 和 const 作用基本一致,但是后者声明的变量不能再次赋值
This post is licensed under CC BY 4.0 by the author.