javascript中不可变的原始值和可变对象
2017-11-16 10:27
113 查看
最近在学Angular4,所以少写了blog。然后昨晚学到时候碰到了ngOnChanges这个钩子,可变对象和不可变原始值对触不触发这个钩子是不同的。然后我就总结了一下可变对象和不可变原始值。
首先在JavaScript中原始值(undefined、null、布尔值、数字和字符串)这些都是不可变原始值。不可变说的是一旦这些基本类型值创建后会一直保存其内存地址,直到被浏览器的垃圾回收机制回收。而我们一直用的创建一个字符串变量,只是将这个变量指向了该字符串的内存地址,当改变该变量的值,也就是改变了该变量指向的字符串内存地址,而原来的字符串还在内存中存在。而这样是会触发angular的ngonchanges方法。
而对于对象(包括数组和函数)引用类型来说是可变对象。所谓可变对象指的是,即使你创建了两个相同属性和值的对象,他们也不是同一个对象,它们各自占有自己的内存地址。举个栗子,
但是如果都是引用同一个基础对象的话,则是相等的。再举个栗子:
此时b引用了a,包括引用了a指向的对象内存地址,所以他们引用了同一个对象的内存地址。故此时无论a还是b其属性值发生改变,都会影响到另外一个。
还有一点就是,对象属性值发生改变,改变的是该属性指向的内存地址,而对象本身的内存地址是没有改变的,这对于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方法来说,该对象就是没有发生变化,故不会触发该钩子。
相关文章推荐
- JavaScript权威指南_10_第3章_类型/值/变量_3.7-不可变的原始值和可变的对象引用
- javascript不可变的原始值和可变的对象引用
- JavaScript不可变原始值和可变的对象引用
- javascript权威指南--不可变原始值和可变对象引用
- JavaScript - 不可变的原始值和可变的对象引用
- JavaScript 面向对象程序设计 变量,函数定义之不可不知
- python知识整理--议可变对象和不可变对象以及str、list、tuple、dict、set
- javascript用arguments数组对象实现参数变量可变的函数
- Python中的可变、不可变对象和赋值技巧
- 利用原型对原始对象的方法进行扩展(javascript面试题)
- javascript原始值和对象引用
- python函数参数是值传递还是引用传递:取决于对象内容可变不可变
- Python基础:Python可变对象和不可变对象
- Python可变对象v.s.不可变对象,引用
- Python中的可变对象和不可变对象
- 关于python的可变和不可变对象
- javascript原始值和对象引用
- += 对于可变对象和不可变对象的区别
- python函数参数是值传递还是引用传递(以及变量间复制后是否保持一致):取决于对象内容可变不可变
- JavaScript自定义对象的判断以及属性不可写的实现