首页 > 解决方案 > 成功更改 JS 中的不可变或原始数据类型。那么这些是原语还是JS概念错了?

问题描述

据我所知,JS 中有 4 个原语(那些直接存储值,而不是引用另一个内存位置的原语) - String, Number, Boolean, Symbol我不算数undefined, null——因为它们是特殊的数据类型,并且不通过继承链共享 Object-Constructor。)

现在, 的另一个属性primitives是它们是Immutableor unchanging。他们的价值观不能改变。我的结论是,对于同一个变量,值不应该改变(永远)。

现在,请在以下情况下向我解释 - 这些数据类型如何保持不变?

var str = "Good Morning";
var bool = true;
var num = 29;

str = str.replace("M", "Z");
bool = !bool;
num+=5;

console.log(str, bool, num);

对于相同的变量,我已经更改了所有 - string, bool, number。那么这些变量(各自的原始数据类型)如何在 JS 中是不可变的?

标签: javascripthtml

解决方案


您没有改变现有的原语。您只是将新的原始值(也是不可变的)分配给现有的变量名。

突变与变量名重新分配不同。突变看起来像下面这样:

someObj.someProp = newPropVal;

重新分配是:

someVarName = newVal;

基元没有自己的属性;试图分配给原语的属性不会做任何事情,并且会在严格模式下抛出错误,因为原语是不可变的。

这是看待它的一种方式(这是一个很好的可视化,尽管它必须准确反映字节码中实际发生的事情):值引用内存中的一个位置。变量名指向内存中的位置。假设它false对应于内存位置 1234,然后您创建一个{}对应于内存位置 9999 的对象。您可以分配false一个变量名并让该变量名指向内存中的位置 1234。您可以使用指向对象的位置 9999 来重新分配变量名称指向的值。与原语不同,对象是其他值(和其他内存位置)的潜在容器。原语不能充当这样的容器。


推荐阅读