JavaScript知识点回顾(十二)——变量、作用域与内存(一)

300 阅读2分钟

这是我参与8月更文挑战的第十二天,活动详情查看:8月更文挑战

原始值与引用值

ECMAScript变量可以包含两张不同类型的数据:原始值和引用值。原始值就是最简单的数据,引用值则是由多个值构成的对象。Undefined、Null、Boolean、Number、String和Symbol就是六种原始值类型。保存原始值的变量是按值访问的,保存引用值的变量是按引用访问的。

动态属性

对于引用值,可以随时添加、修改和删除其属性和方法。

    let juejin = new Object();
    juejin.year = 2021;
    console.log(juejin.year);  //2021;

原始值则不能有属性,只有引用值能动态添加后面可以使用的属性。

复制值

在通过变量把一个原始值赋值给到另一个变量是,原始值会被复制到新变量的位置。

    let year1 = 2021;
    let year2 = year1;

这里的year1和year2虽然值都是2021,但是是两个完全独立的变量。

而在把引用值从一个变量赋给另一个变量时,存储在变量中的值也会被复制到新变量的位置。区别在于,这里复制的值实际上是一个指针,这个指针指向存储在堆内存中的对象。也就是说,原始值复制时传的是值,引用值复制时传的是址。

    let juejin = new Object();
    let obj = juejin;
    juejin.year = 2021;
    console.log(obj.year);    //2021

传递参数

ECMAScript中所以函数的参数都是按值传递的,在传递参数时,值会被复制到一个局部变量(即一个命名参数,或者说是arguments对象中的一个坑位),在按引用传递参数时,值在内存中的位置会被保存到一个局部变量。即使对象时按值传进函数的,obj也会通过引用访问对象。当obj在函数内部被重写时,它变成一个指向本地对象的指针,而这个本地对象在函数执行结束时会被销毁。

确定类型

采用typeof操作符用于判断一个变量是否为原始值。可以判断字符串、数值、布尔值或布尔值或 undefined。

如果值为 null 则返回 object

如果需要进一步判断是什么类型的对象,可以采用instanceof

如果用 instanceof 检测原始值,则返回 false