JS高程——第4 章 变量、作用域和内存问题

1.基本类型和引用类型

  • 变量可能包含两种不同数据类型的值:基本类型值和引用类型值。
    基本类型值指的是简单的数据段,引用类型值指那些可能由多个值构成的对象。
    在将一个值赋给变量时,解析器必须确定这个值是基本类型值还是引用类型值。
    5 种基本数据类型: Undefined、 Null、 Boolean、 Number 和 String。
    这 5 种基本数据类型是按值访问的,因为可以操作保存在变量中的实际的值。
    引用类型的值是保存在内存中的对象

2.复制变量值

  • 复制基本类型的值,会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上这两个变量
    可以参与任何操作而不会相互影响
var num1=3;
var num2=num1;
 console.log(num2);  //3
image.png
  • 复制引用类型的值时,同样也会将存储在变量对象中的值复制一份放到为新变量分配的空间中。不同的是,这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一个对象。
    复制操作结束后,两个变量实际上将引用同一个对象。因此,改变其中一个变量,就会影响另一个变量
var obj={};
obj.name="benben";
obj.gender="nan";
var obj1=obj;
console.log(obj);
obj1.gender="女";
console.log(obj1);
console.log(obj.gender);  //女
image.png

3.检测引用类型instanceof

如果变量是给定引用类型(根据它的原型链来识别;第 6 章将介绍原型链)的实例,那么instanceof 操作符就会返回 true

 var obj={};
   obj.name="benben";
   obj.gender="nan"; 
console.log(obj instanceof Object); //true
所有引用类型的值都是 Object 的实例

4.只有函数有局部变量,其他都是全局变量(没有块级作用域)

var color = "blue";
function changeColor(){
    var anotherColor = "red";
    function swapColors(){
        var tempColor = anotherColor;
        anotherColor = color;
        color = tempColor;
// 这里可以访问 color、 anotherColor 和 tempColor
}
// 这里可以访问 color 和 anotherColor,但不能访问 tempColor
swapColors();
}
// 这里只能访问 color
changeColor();
console.log(color);

5.查询标识符

搜索过程从作用域链的前端开始,向上逐级查询与给定名字匹配的标识符。如果在局部环境中找到
了该标识符,搜索过程停止,变量就绪。如果在局部环境中没有找到该变量名,则继续沿作用域链向上
搜索。搜索过程将一直追溯到全局环境的变量对象。如果在全局环境中也没有找到这个标识符,则意味
着该变量尚未声明。

var color = "blue";
function getColor(){
var color = "red";
return color;
}
console.log(getColor()); //"red"
image.png

你可能感兴趣的:(JS高程——第4 章 变量、作用域和内存问题)