javascript - 成功更改 JS 中的不可变或原始数据类型。那么这些是原语还是JS概念错了?
问题描述
据我所知,JS 中有 4 个原语(那些直接存储值,而不是引用另一个内存位置的原语) - String, Number, Boolean, Symbol
。我不算数undefined, null
——因为它们是特殊的数据类型,并且不通过继承链共享 Object-Constructor。)
现在, 的另一个属性primitives
是它们是Immutable
or 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 中是不可变的?
解决方案
您没有改变现有的原语。您只是将新的原始值(也是不可变的)分配给现有的变量名。
突变与变量名重新分配不同。突变看起来像下面这样:
someObj.someProp = newPropVal;
重新分配是:
someVarName = newVal;
基元没有自己的属性;试图分配给原语的属性不会做任何事情,并且会在严格模式下抛出错误,因为原语是不可变的。
这是看待它的一种方式(这是一个很好的可视化,尽管它必须准确反映字节码中实际发生的事情):值引用内存中的一个位置。变量名指向内存中的位置。假设它false
对应于内存位置 1234,然后您创建一个{}
对应于内存位置 9999 的对象。您可以分配false
一个变量名并让该变量名指向内存中的位置 1234。您可以使用指向对象的位置 9999 来重新分配变量名称指向的值。与原语不同,对象是其他值(和其他内存位置)的潜在容器。原语不能充当这样的容器。
推荐阅读
- php - SMTP 错误:以下收件人失败:SMTP 错误:以下收件人失败
- sql - oracle 中的 Unnest(String_to_array) 转换
- android - cordova android 应用程序可以在模拟器上运行,但在设备上运行时无法连接到服务器
- ubuntu-18.04 - 访问 LXC 中的 USB 以太网适配器
- java - 如何杀死阻止另一个实例运行的春季批处理作业?
- ionic-framework - 错误:未捕获(承诺):TypeError:无法读取离子5中未定义的属性“解雇”
- c# - c#每x秒调用一个方法,但只有一定次数
- javascript - 在同一窗口中打开 UPI 链接
- powerbi - 如何在PowerBI中显示两个字段的减法并显示为一列?
- javascript - 在 Android 6 中使用 Cordova 的 Javascript 语法错误