基本类型:
六种类型:
string
number
null
undefined
boolean
symbol(ES6新增)
内置对象: 对象子类型(注意:没有null/undefined),实质上是内置函数;
String
Number
Boolean
Object
Function
Array
Date
RegExp
Error
属性描述符
value
writable 是否可以修改属性的值。
Object.defineProperty( myObject, "a", {
value: 2,
writable: false, // 不可写!
configurable: true,
enumerable: true
} );
myObject.a = 3;
myObject.a; // 2, 严格模式下直接报错TypeError
enumerable 枚举
configurable:
配置修改属性描述符,单向的,一旦设置后续无法修改
会让delete删除失效
例外:当configurable:false时 -> writable可以true->false,但是无法false->true;
不变性
1.对象常量:
场景:创建一个正真常量,不可修改/删除/重定义
方法:writable:false + configurable:false;
2.禁止扩展:
场景:禁止添加属性,且保留原有属性;
方法:Object.preventExtensions(obj)
3.密封:
场景:禁止添加属性/重新配置/删除现有属性,但可以修改属性的值;
方法:Object.seal(...)
原理:内部会调用Object.preventExtensions(obj),然后把现有所有属性添加configurable:false;
4.冻结:
场景:禁止修改一切属性内容,可应用在对象上的级别最高的不可变性(引用类型限制不到,如果如要深层冻结,需要遍历所有内容,类似深层拷贝)
方法:Object.freeze(..)
原理:内部调用Object.seal(...),把所有数据访问数据标记为writable:false;