es5 的物件屬性名都是字串,這容易造成屬性名的衝突
比如,我們使用了乙個他人提供的物件,
但又想為這個物件新增新的方法cmixin 模式〉,
新方法的名字就有可能與現有方法產生衝突。
es6引入了一種新的原始資料型別symbol,表示獨一無二的值
是第七種資料型別
1.number
2.string
3.undefined
4.null
5.boolean
6.object
symbol值是通過symbol函式生成,
只要屬性名屬於symbol型別,就是獨一無二的,
可以保證不會與其他屬性名衝突
let s1 =
symbol()
;console.
log(
typeof s1)
;
ps:symbol函式不能使用new命令,
因為生成的symbol是乙個原始型別的值,不是物件
就是說symbol不是物件,所以不能新增屬性
基本上,他是一種類似於字串的資料型別
// symbol新增引數,便於區分
let s2 =
symbol
('foo');
let s3 =
symbol
('bar');
console.
log(s2,s3)
;// eg1
let mysymbol =
symbol()
;let mysymbol2 =
symbol()
;let mysymbol3 =
symbol()
;// 第一種寫法
let a =
;a =
// 第二種寫法
a[mysymbol]
='hello'
;// 第三種寫法 不太行
object.
defineproperty
(a,mysymbol3,);
console.
log(a)
symbol型別還可以用於定義一組變數,保證這組變數的值都不相等
/*
log.levels = ;
log(log.levels.debug,'debug message');
*/// 例子:消除魔術字串
function
getarea
(shape,options)
return area;
}
強耦合
console.
log(
getarea
('********',)
);// change
function
getareachange
(shape,options)
= math;
switch
(shape)
return area;
}let shapetype =
;console.
log(
getareachange
(shapetype.********,))
;console.
log(
getareachange
(shapetype.circle,))
;
屬性名的遍歷
let
= object;
let objectsymbols1 =
getownpropertysymbols
(a);
console.
log(objectsymbols1)
// another example
let obj3 =
;let foo3 =
symbol
("foo");
defineproperty
(obj3,foo3,);
for(
let i in obj3)
使用getownpropertynames方法得不到symbol屬性名
需要使用getownpropertysymbols方法
console.
log(
getownpropertynames
(obj3));
console.
log(
getownpropertysymbols
(obj3)
);
可以使用reflect.ownkeys()方法返回所有型別的鍵名
包括常規鍵名和symbol鍵名
const
= reflect;
let obj4 =
;console.
log(
ownkeys
(obj4)
);
以symbol值作為名稱的屬性不會被常規方法遍歷得到。
我們可以利用這個特性為物件定義些非私有但又希望只用於內部的方法。
let size =
symbol
('size');
class
collection
add(item)
static
sizeof
(instance)
}let x =
newcollection()
;console.
log(collection.
sizeof
(x));x.
add(
'foo');
console.
log(collection.
sizeof
(x))
const
= object;
console.
log(
keys
(x),
getownpropertynames
(x),
getownpropertysymbols
(x))
;
ES6個人筆記記錄 陣列擴充套件
擴充套件運算子 console.log 1,2,3,4 5 es5 console.log math.max.null,14,2,48 es6 let math console.log max 14,2,48 es5 var arr1 0 1,2 var arr2 3 4,5 console.log...
ES6個人筆記記錄 Proxy2
1.getlet person let proxy1 newproxy person,else console.log proxy1.name,proxy1.age get方法可以被繼承 let proto newproxy const object const reflect let obj1 c...
ES6個人筆記記錄 Proxy5
雖然proxy可以 針對目標物件的訪問,但他不是目標物件的透明 即不做任何攔截的情況下也無法保證與目標物件的行為一致。主要原因就是在proxy 的情況下,目標物件內部的this關鍵字會指向proxy const target const handler const proxy newproxy ta...