变量不过就是特定时间点一个特定值的名称而已。
graph TD
ECMAScript --> 原始值
ECMAScript --> 引用值
原始值 --> Undefined
原始值 --> Null
原始值 --> Boolean
原始值 --> Number
原始值 --> String
原始值 --> Symbol
引用值 --> 对象
引用值 --> 数组
操作原始值是直接实际值 操作引用之是操作变量的引用
动态属性
let a = 'a'; // typeof --> string
let b = new String('b'); // typeof --> object
此时
log a --> 'a'
log b --> 'b'
如果
a.name = 'A';
b.name = 'B';
则
log a.name --> undefined
log b.name --> 'B'
let a = {a:1}; // typeof --> object
let b = a; // typeof --> object
typeof a.a; --> number
typeof b.a; --> number
b.a = 2
log a --> {a:2}
log b --> {a:2}
因为 a和b是引用值 a.a 和 b.a 是指向的同一个值
当 a.a 的值修改时 b.a 的值也就改变了反之亦然
let a = 1;
let b = {a:a};
let c = b;
log
a --> 1
b --> {a:1}
c --> {a:1}
a = 2;
log
a --> 2
b --> {a:1}
c --> {a:1}
b.a = 2;
log
a --> 2
b --> {a:2}
c --> {a:2}
堆栈关系
flowchart TB
a-->a=1
c-->b.a
b-->b.a
b.a-->b.a=1
subgraph 定义域
a
b
c
end
subgraph 值域
subgraph 堆
b.a["{a:1}"]
end
subgraph 栈
b.a=1[1]
a=1[1]
end
end
复制值
// 如果再
let d = b;
// 也是将堆中的{a:1}指向d
// 值更改时还是都会更改
参数传递
函数传参都是按值传递的。值传递的时候就像变量赋值一样,如果参数是原始值就是原始值复制,如果是引用值就是引用值复制。
function add(num){
num += 10;
return num;
}
let count = 10;
let result = add(count);
console.log(count); // count --> 10
console.log(result); // result --> 20
// 其本质上为
// function add( let num = 传进来的参数 ) {
// num += 10;
// return num;
// }
// num 的作用于值存在于 add中
堆栈关系
flowchart TB
count-->10
add-->add_
num-->num_
result-->20
subgraph 定义域
add
num
count
result
end
subgraph 值域
subgraph 堆
add_["function add(){...}"]
num_["当add方法被调用时 num 进行赋值操作"]
10
20
end
end
一些关于function定义的测试
function a(){};
let b = ()=>{};
let c = new Function('c');