Js高程第四章 变量、作用域与内存

207 阅读1分钟

变量不过就是特定时间点一个特定值的名称而已。

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');