杂记:Angular-ngOnChanges()

javascript中的两种类型,我觉得可以对应c#中的值类型和引用类型,但js中字符串是值类型

  • 在 ECMAScript 中,变量可以存在两种类型的值,即原始值和引用值。

http://www.w3school.com.cn/js/pro_js_value.asp (W3school)
原始值
存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。

引用值
存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存处。
为变量赋值时,ECMAScript 的解释程序必须判断该值是原始类型,还是引用类型。要实现这一点,解释程序则需尝试判断该值是否为 ECMAScript 的原始类型之一,即 Undefined、Null、Boolean、Number 和 String 型。由于这些原始类型占据的空间是固定的,所以可将他们存储在较小的内存区域 - 栈中。这样存储便于迅速查寻变量的值。

在许多语言中,字符串都被看作引用类型,而非原始类型,因为字符串的长度是可变的。ECMAScript 打破了这一传统。

如果一个值是引用类型的,那么它的存储空间将从堆中分配。由于引用值的大小会改变,所以不能把它放在栈中,否则会降低变量查寻的速度。相反,放在变量的栈空间中的值是该对象存储在堆中的地址。地址的大小是固定的,所以把它存储在栈中对变量性能无任何负面影响。如下图所示:
杂记:Angular-ngOnChanges()_第1张图片

  • angular中ngOnChanges()钩子的调用,对于两种这两种js数据类型有所区别

https://www.angular.cn/guide/lifecycle-hooks#onchanges (Angular中文文档)
对于原始值的改变会call OnChanges(),但对于引用值则不会

@Input() hero: Hero;
@Input() power: string;
<on-changes [hero]="hero.name" [power]="power"></on-changes>

当 power 属性的字符串值变化时,相应的日志就出现了。 但是 ngOnChanges 并没有捕捉到 hero.name 的变化。 这是第一个意外。
The log entries appear as the string value of the power property changes. But the ngOnChanges does not catch changes to hero.name That’s surprising at first.

Angular 只会在输入属性的值变化时调用这个钩子。 而 hero 属性的值是一个到英雄对象的引用。 Angular 不会关注这个英雄对象的 name 属性的变化。 这个英雄对象的引用没有发生变化,于是从 Angular 的视角看来,也就没有什么需要报告的变化了。
Angular only calls the hook when the value of the input property changes. The value of the hero property is the reference to the hero object. Angular doesn’t care that the hero’s own name property changed. The hero object reference didn’t change so, from Angular’s perspective, there is no change to report!

你可能感兴趣的:(杂记:Angular-ngOnChanges())