您的位置:首页 > Web前端 > JavaScript

javascript中不可变的原始值和可变对象

2017-11-16 10:27 113 查看
最近在学Angular4,所以少写了blog。然后昨晚学到时候碰到了ngOnChanges这个钩子,可变对象和不可变原始值对触不触发这个钩子是不同的。然后我就总结了一下可变对象和不可变原始值

首先在JavaScript中原始值(undefined、null、布尔值、数字和字符串)这些都是不可变原始值。不可变说的是一旦这些基本类型值创建后会一直保存其内存地址,直到被浏览器的垃圾回收机制回收。而我们一直用的创建一个字符串变量,只是将这个变量指向了该字符串的内存地址,当改变该变量的值,也就是改变了该变量指向的字符串内存地址,而原来的字符串还在内存中存在。而这样是会触发angular的ngonchanges方法。

而对于对象(包括数组和函数)引用类型来说是可变对象。所谓可变对象指的是,即使你创建了两个相同属性和值的对象,他们也不是同一个对象,它们各自占有自己的内存地址。举个栗子,

var a={name:'lucas'};
var b={name:'lucas'};
a==b --->false;
a===b -->false;


但是如果都是引用同一个基础对象的话,则是相等的。再举个栗子:

var a={name:'lucas'};
var b=a;
a==b; ---->true
a===b; --->true


此时b引用了a,包括引用了a指向的对象内存地址,所以他们引用了同一个对象的内存地址。故此时无论a还是b其属性值发生改变,都会影响到另外一个。

还有一点就是,对象属性值发生改变,改变的是该属性指向的内存地址,而对象本身的内存地址是没有改变的,这对于ngonchanges方法来说,该对象就是没有发生变化,故不会触发该钩子。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息