symbol作為屬性名,不會出現在for……in,for……of迴圈中,也不會被object.keys(),object.getownpropertynames(),json.stringify()返回,但是它也不是私有屬性,有乙個object.getownpropertysymbols方法,可以獲取指定物件的所有symbol屬性名。
object.getownpropertysymbols
方法返回乙個陣列,成員是當前物件的所有用作屬性名的 symbol 值。
const obj = {};
let a = symbol('a');
let b = symbol('b');
obj[a] = 'hello';
obj[b] = 'world';
const objectsymbols = object.getownpropertysymbols(obj);
objectsymbols
// [symbol(a), symbol(b)]
下面是另乙個例子,object.getownpropertysymbols
方法與for...in
迴圈、object.getownpropertynames
方法進行對比的例子。
const obj = {};
let foo = symbol("foo");
object.defineproperty(obj, foo, );
for (let i in obj)
object.getownpropertynames(obj)
// object.getownpropertysymbols(obj)
// [symbol(foo)]
上面**中,使用object.getownpropertynames方法得不到屬性名,需要使用object.getownpropertysymbols
方法。
另乙個新的api,reflect.ownkeys方法可以返回所有型別的鍵名,包括常規鍵名和symbol鍵名。
let obj = ;
reflect.ownkeys(obj)
// ["enum", "nonenum", symbol(my_key)]
由於以symbol值作為名稱的屬性,不會被常規方法遍歷得到。我們可以利用這個特性,為物件定義一些私有的,但又只希望用於內部的方法。
let size = symbol('size');
class collection
add(item)
static sizeof(instance)
}let x = new collection();
collection.sizeof(x) // 0
x.add('foo');
collection.sizeof(x) // 1
object.keys(x) // ['0']
object.getownpropertynames(x) // ['0']
object.getownpropertysymbols(x) // [symbol(size)]
上面**中,物件x
的size
屬性是乙個 symbol 值,所以object.keys(x)
、object.getownpropertynames(x)
都無法獲取它。這就造成了一種非私有的內部方法的效果。 iOS遍歷類中的屬性名runtime
栗子 有乙個zhhassertnewnew類,類中有兩個屬性 property nonatomic,strong nsstring name property nonatomic,assign int age 1,匯入 import 2,實現方法 void test u int count 0 iv...
JS遍歷物件修改屬性名
根據介面返回資料中number屬性值,對資料進行擷取,並改變屬性名.直接上碼 下面是需要處理的資料 let data 根據number值對資料擷取 var num data.value.number 2 var arr data.value.value.slice 0,num 改變屬性的方法 方法一...
C 遍歷自定義物件,獲取屬性名 屬性值,設定屬性值
physiqueoutmodel physiqueoutmodel new physiqueoutmodel 自定義物件 type t physiqueoutmodel.gettype 獲得該類的type foreach propertyinfo pi in t.getproperties stri...