变量复制

ECMAScript变量可以包含两种不同类型的数据:原始值和引用值。原始值 (primitive value)就是最简单的数据,引用值 (reference value)则是由多个值构成的对象。

6种原始值:Undefined 、Null 、Boolean 、Number 、String 和Symbol 。

在把一个值赋给变量时,JavaScript引擎必须确定这个值是原始值还是引用值。

保存原始值的变量是按值 (by value)访问的,因为我们操作的就是存储在变量中的实际值。(原始值存储在变量中

引用值是保存在内存中的对象。在操作对象时,由于JavaScript不允许直接访问内存位置,实际上操作的是对该对象的引用 (reference)而非实际的对象本身。为此,保存引用值的变量是按引用 (by reference)访问的。(对象的引用存储在变量中,对象存储在内存中

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

let num1 = 5;
let num2 = num1;

 

在把引用值从一个变量赋给另一个变量时,存储在变量中的值也会被复制到新变量所在的位置。区别在于,这里复制的值实际上是一个指针,它指向存储在堆内存中的对象。操作完成后,两个变量实际上指向同一个对象。

let obj1 = new Object();
let obj2 = obj1;
obj1.name = "Nicholas";
console.log(obj2.name); // "Nicholas"

  

参数传递

ECMAScript中所有函数的参数都是按值传递的。这意味着函数外的值会被复制到函数内部的参数中,就像从一个变量复制到另一个变量一样。如果是原始值,那么就跟原始值变量的复制一样,如果是引用值,那么就跟引用值变量的复制一样。

function setName(obj) {
  obj.name = "Nicholas";
  obj = new Object();
  obj.name = "Greg";
}

let person = new Object();
setName(person);
console.log(person.name);  // "Nicholas"

person 传入setName() 时,其name 属性被设置为"Nicholas" 。然后变量obj 被设置为一个新对象且name 属性被设置为"Greg" 。如果person 是按引用传递的,那么person 应该自动将指针改为指向name 为"Greg" 的对象。可是,当我们再次访问person.name 时,它的值是"Nicholas" ,这表明函数中参数的值改变之后,原始的引用仍然没变。当obj 在函数内部被重写时,它变成了一个指向本地对象的指针。而那个本地对象在函数执行结束时就被销毁了。

类型判断

判断一个变量是否为字符串、数值、布尔值或undefined 的最好方式是使用typeof。

instanceof 操作符可以判断Object、Array、RegExp。

 

posted @ 2021-12-09 11:13  远看山有色  阅读(118)  评论(0)    收藏  举报