Context Items异常行为:未调用context.set却持续自增的原因
这是特性而非Bug:JavaScript引用类型的特性导致该行为
核心原因:引用类型与基本类型的本质差异
JavaScript里的数据类型分两类,行为逻辑完全不同:
- 引用类型:对象、数组、函数等,这类数据存在堆内存中,变量存储的是指向内存地址的引用
- 基本类型:数字、字符串、布尔值、null、undefined等,这类数据存在栈内存中,变量存储的是具体的值本身
结合你的代码具体分析
- 第一次运行时,你创建了
{'item1':100}对象,通过context.set('items', items)存入context。此时context里存的是这个对象的内存引用,不是对象的副本。 - 后续每次运行,
var items = context.get('items')拿到的是这个对象的引用,相当于直接"链接"到了context里存储的那个原始对象。 - 执行
items.item1 += 1时,本质是顺着引用直接修改了堆内存里原始对象的属性值——这个修改会直接同步到context存储的对象上,自然不需要再调用context.set来保存。
为什么简单变量没有这个行为?
对于数字、字符串这类基本类型,context.get返回的是值的副本。你修改这个副本时,只会改变当前变量的值,不会影响context里存储的原始值,所以必须调用context.set才能把修改后的值存回去。
总结
这是JavaScript语言本身的特性,和Node-RED的context类型无关。所有引用类型(对象、数组等)都会表现出这种"修改引用即修改原数据"的行为,而基本类型则需要显式保存修改后的值。
内容的提问来源于stack exchange,提问作者Gottfried Prandstetter
相关产品推荐
相关产品推荐

