欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

你不知道的js (数组和对象的部分属性)

程序员文章站 2022-07-14 14:25:16
...

数组:

直接向数组添加属性,数组的length属性不会发生变化

let arr = [‘a’,’b’,’c’];
arr[name] = 4;
console.log(arr);  // ["a", "d", "c", name: 4]
arr.length // 3

最好 只用对象来存储键 / 值对,只用数组来存储数值下标 / 值对。

arr[‘3’] = ‘d’;
arr.length = 4

属性名“看起来”像一个数字,那它会变成 一个数值下标

对象
Object.getOwnPropertyDescriptor
只会在自身寻找

var obj = { a:2 }
Object.getOwnPropertyDescriptor(obj,’a’)
1. configurable: true // 可配置的,为true时才可以通过defineProperty 修改属性描述符
2. enumerable: true  // 可枚举的
3. value: 2   // 值
4. writable: true  // 可修改的,为true才可以修改

如果访问一个不存在的属性,则会返回undefined
Object.getOwnPropertyDescriptor(obj,'b’)
// undefined 

obj.__proto__.name = 'zg'
"zg"
obj.name
"zg"
Object.getOwnPropertyDescriptor(obj,'name')
undefined
原型上的属性也无法访问

用 Object.defineProperty(…) 来添加一个新属性或者修改一个已有属性(如果它是 configurable:true)并对特性进行设置。
对象常量:
就是将一个对象的writable:false,configurable:false,
创建一个不可修改、重定义、删除的常量属性

禁止扩展 Object.preventExtensions

Object.preventExtensions();
var obj = {
    name:"zc"
};
Object.preventExtensions(obj);
obj.name = ‘haha’;
console.log(obj) //{name: "haha”},可以修改已有的属性
obj.sex = 'men'
"men"
obj
{name: "haha”} // 添加新的属性则不会成功

Object.defineProperty(obj,'name',{
    configurable:false, // 不可配置
    writable:false // 不可修改
})
现在obj 就不可添加新属性,不可配置,不可修改,不可删除了
如果对象的属性又是一个对象,则这个对象可以添加新属性,配置和修改
除非继续将这个对象调用 Object.preventExtensions,则不可扩展,可继续添加
其他限制如(
 configurable:false, // 不可配置 ,
writable:false // 不可修改
 )

Object.seal = Object.preventExtensions + configurable:false 密封
Object.freeze = Object.seal + writable:false
Object.freeze 、 Object.seal 、 Object.preventExtension 都只会针对当前对象,如果对象的属性又是一个对象,则不会产生效果,除非遍历这个对象,依次冻结