symbol類型(primitive type==原始類型)
symbol類型是es6新增的一個基本數據類型,表示獨一無二的值罚渐,最大的用法是用來定義對象的唯一屬性名
基本用法:
symbol不是一個構造函數捎泻,不能使用new來創(chuàng)建扔亥,與普通函數調用類似
var s1 = Symbol();//創(chuàng)建了一個symbol的實例
console.log(s1);//Symbol()
console.log(typeof s1);//symbol
symbol可以傳遞一個字符串參數柄错,參數作用是對symbol類型的描述埃碱,便于區(qū)分這個symbol是哪一個
var s1 = Symbol("symbol");
console.log(s1);//Symbol(symbol)
console.log(typeof s1);//symbol
symbol類型的值具有唯一性,是一個獨一無二的值荔仁,每一個 Symbol 的值都不相等伍宦。相同參數 Symbol() 返回的值不相等
var s1 = Symbol("symbol");
var s2 = Symbol("symbol");
console.dir(s1 == s2);//false
使用場景:
用于對象中的屬性
//使用方式一
var n = Symbol("uname");
var obj = {};
obj[n] = "tom";
//以symbol作為屬性不能使用點運算符添加屬性,用點來添加屬性是添加常規(guī)字符串屬性
//obj.n = "tom";
console.log(obj);//{Symbol(uname): "tom"}
//使用方式二
var n = Symbol("uname");
var obj = {
[n]:"tom" //字面量添加symbol屬性乏梁,必須要用[]
};
console.log(obj);//{Symbol(uname): "tom"}
訪問以上添加的symbol屬性
console.log(obj[n]);//tom
console.log(obj.n);//undefined
如果對象下同時添加了與symbol同名的常規(guī)屬性次洼,則使用[]訪問的是symbol屬性,使用點運算符訪問的是常規(guī)屬性
var n = Symbol("uname");
var obj = {};
obj.n = "jerry";
obj[n] = "tom";
console.log(obj[n]);//tom
console.log(obj.n);//jerry
symbol類型的值具有唯一性掌呜,由于每一個 Symbol 的值都是不相等的滓玖,所以 Symbol 作為對象的屬性名坪哄,可以保證屬性不重名质蕉。
var n = Symbol("uname");
var n2 = Symbol("uname");
var obj1 = {};
obj1[n] = "tom";
obj1[n2] = "jerry";
console.log(obj1);//{Symbol(uname): "tom", Symbol(uname): "jerry"}
對象中的symbol屬性不會被for in遍歷
var n = Symbol("uname");
var obj = {};
obj[n] = "tom";
for(var key in obj){
console.log(obj[key]);//無輸出
}
對象中的symbol屬性不會被 Object.keys(obj) 、Object.values(obj)翩肌、 Object.getOwnPropertyNames(obj) 返回模暗。
var n = Symbol("uname");
var obj = {};
obj[n] = "tom";
console.log(Object.keys(obj));//[]
console.log(Object.values(obj));//[]
console.log(Object.getOwnPropertyNames(obj));//[]
可以通過 Object.getOwnPropertySymbols() 和 Reflect.ownKeys() 取到。
var n = Symbol("uname");
var obj = {};
obj[n] = "tom";
console.log(Reflect.ownKeys(obj));//[Symbol(uname)]
console.log(Object.getOwnPropertySymbols(obj));//[Symbol(uname)]