Javascript 原始值与参考值

Javascript 原始值与参考值,javascript,Javascript,我读了一本名为“web开发者的专业Javascript”的书,书中说:“变量由引用值或原语值赋值。引用值是存储在内存中的对象。”。然后它就没有说明原语值是如何存储的。所以我猜它没有存储在内存中。基于此,当我有这样一个脚本时: var foo = 123; JSGenericObject ten = new JSNumber(10); // var ten = 10; Javascript如何记住foo变量以备日后使用?一个变量可以包含两种值类型之一:基本值或参考值 基本值是存储在堆栈上的数

我读了一本名为“web开发者的专业Javascript”的书,书中说:“变量由引用值或原语值赋值。引用值是存储在内存中的对象。”。然后它就没有说明原语值是如何存储的。所以我猜它没有存储在内存中。基于此,当我有这样一个脚本时:

var foo = 123;
JSGenericObject ten = new JSNumber(10); // var ten = 10;

Javascript如何记住
foo
变量以备日后使用?

一个
变量可以包含两种值类型之一:
基本值
参考值

  • 基本值
    是存储在堆栈上的数据
  • 原语值
    直接存储在变量访问的位置
  • 参考值
    是存储在堆中的对象
  • 存储在变量位置的参考值是指向存储对象的内存位置的指针
  • 基本类型包括
    未定义
    布尔
    数字
    ,或
    字符串
基础知识:

对象是属性的聚合。属性可以引用
对象
原语
<代码>原语是值
,它们没有属性

更新:


JavaScript有6种基本数据类型:字符串数字布尔未定义符号(ES6中新增)。除了null和undefined之外,所有原语值都具有环绕原语值的对象等价物,例如字符串对象环绕字符串原语。所有原语都是不可变的。

在javascript中,
原语值是存储在
堆栈上的数据

原语值
直接存储在变量访问的位置

参考值
是存储在
堆中的对象

存储在变量位置中的参考值是指向存储对象的内存位置的指针

JavaScript支持五种基本数据类型:
number、string、Boolean、undefined和null

这些类型被称为基元类型,因为它们是基本的构建块,可以从中构建更复杂的类型

在这五种类型中,只有
number、string和Boolean
是实际存储数据的真正数据类型

未定义和null
是在特殊情况下出现的类型。
基元类型
在内存中具有固定大小。 例如,一个数字占用八个字节的内存,布尔值只能用一位表示


引用类型可以是任意长度的——它们没有固定的大小。

好的,把变量想象成一张纸——一张便笺

注1:变量是便签

现在,一张便签非常小。你只能在上面写一点点信息。如果你想写更多的信息,你需要更多的便签,但这不是问题。想象一下,你有无数的便笺

注2:你有无数的便笺,用来储存少量信息

太好了,你能在便条上写些什么?我可以写:

  • 是或否(布尔值)
  • 我的年龄(一个数字)
  • 我的名字(字符串)
  • 完全没有(未定义)
  • 涂鸦或任何对我来说毫无意义的东西(null
  • 所以我们可以在便笺上写一些简单的东西(让我们屈尊称之为原始的东西)

    注3:你可以在便签上写一些原始的东西

    比如说,我在便条上写了
    30
    ,提醒自己为今晚在我家举办的小派对买30片奶酪(我的朋友很少)

    当我去把我的便条贴在冰箱上时,我看到我妻子在冰箱上又贴了一张便条,上面写着
    30
    (提醒我她的生日是本月30日)

    Q:这两张便笺是否传达了相同的信息

    A:是的,他们都说
    30
    。我们不知道是30片奶酪还是一个月的第30天,坦率地说,我们不在乎。对于一个不知道更多的人来说,一切都一样

    var slicesOfCheese = 30;
    var wifesBirthdate = 30;
    
    alert(slicesOfCheese === wifesBirthdate); // true
    
    注4:两张写有相同内容的便笺传达相同的信息,即使它们是两张不同的便笺

    今晚我真的很兴奋——和老朋友一起玩,玩得很开心。然后我的一些朋友打电话给我,说他们不能参加聚会了

    所以我去冰箱把我的便条上的
    30
    擦掉(不是我妻子的便条,那会让她很生气),然后把它变成
    20

    注5:您可以删除便笺上写的内容,然后再写其他内容

    问:这很好,但是如果我妻子想让我写一份杂货清单,让我在出去买奶酪的时候去拿,那该怎么办呢。她需要为每一项都写一张便条吗

    A:不,她会拿一张长长的纸,然后把食品清单写在那张纸上。然后她会写一张便条,告诉我在哪里可以找到杂货清单

    那么这里发生了什么

  • 杂货清单显然不是简单的(呃…原始的)数据
  • 我妻子把它写在一张较长的纸上
    var groceryList1 = ["1 dozen apples", "2 loaves of bread", "3 bottles of milk"];
    var groceryList2 = groceryList1;
    
    alert(groceryList1 === groceryList2); // true
    
    #include <stdio.h>
    
    int main() {
        int a = 10;
        int b = 20;
        int c = a + b;
        printf("%d", c);
        return 0;
    }
    
    #include <stdio.h>
    #include <malloc.h>
    
    int main() {
        int * a = malloc(3 * sizeof(int));
    
        a[0] = 3;
        a[1] = 5;
        a[2] = 7;
    
        printf("a: %d\nb: %d\nc: %d\n", a[0], a[1], a[2]);
    
        return 0;
    }
    
    JSGenericObject ten = new JSNumber(10); // var ten = 10;
    
    var a = 3.14;  // Declare and initialize a variable
    var b = a;     // Copy the variable's value to a new variable
    a = 4;         // Modify the value of the original variable
    alert(b)       // Displays 3.14; the copy has not changed
    
    var a = [1,2,3];  // Initialize a variable to refer to an array
    var b = a;        // Copy that reference into a new variable
    a[0] = 99;        // Modify the array using the original reference
    alert(b);         // Display the changed array [99,2,3] using the new reference