你不知道的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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章