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

数组:

Array(1,2,3) 和 new Array(1,2,3)的效果是一样的;不带new 时会自动被补上;
Array构造函数只带一个数字参数的时候,返回的是一个数字参数为长度的数组;每一项都会默认填充undefined;
Array(3)
// [empty × 3] 

直接向数组添加属性,数组的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

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

一些数组方法

forEach
会遍历数组中的所有值并忽略回调函数的返回值

every
会一直运行到回调函数返回false(或者假值)

some
会一直运行直到回调函数返回true(或者真值)

every和some可以使用break终止遍历

for…of
直接遍历值(需本身定义了迭代器)
for…of 循环首先会向被访问对象请求一个迭代器对象,然后通过调用迭代器对象的
next() 方法来遍历所有返回值。
@@iterator 本身并不是一个迭代
器对象,而是一个返回迭代器对象的函数

var myArray = [ 1, 2, 3 ];
var it = myArray[Symbol.iterator]();
it.next(); // { value:1, done:false }
it.next(); // { value:2, done:false }
it.next(); // { value:3, done:false }
it.next(); // { done:true }

对象
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 都只会针对当前对象,如果对象的属性又是一个对象,则不会产生效果,除非遍历这个对象,依次冻结

发布了16 篇原创文章 · 获赞 0 · 访问量 8137
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章