如果我说var myobj = JsonConvert.DeserializeObject<RootObject>(json);
,sym1 = Symbol();
函数的功能就像下面的函数Symbol
一样,
g
现在当我执行> g = function(){
| return 2; //return some random unique value based on some internal algo
| }
g()
> var sym1 = g();
> sym1
2
并记录var sym1 = Symbol();
时,控制台会显示sym1
,而不是显示Symbol()
函数返回的值。
所以这是我的问题:Symbol
函数如何工作?当您键入Symbol
时,控制台如何能够显示Symbol()
而不是某些值?我们可以写这样的功能吗?
答案 0 :(得分:6)
是的,Symbol
只是一个函数,类似于 1 到任意function g() { return something }
。
但是,与您问题中的示例g
不同,它不返回数字,而是返回symbols,这是ES6中新的原始值类型。
当我说
sym1
时,控制台显示Symbol()
而不是显示函数符号返回的值。
您认为返回的价值是什么,您认为应该如何展示?
您的g
函数返回的数字只是64位 2 的集合。不知何故 3 ,控制台从中导出一个基数为10的字符串,以显示您期望的数字。
现在,什么是符号?它只是一个带有身份的价值,我们甚至不知道它是如何实现的。目前还不清楚如何显示,或者根本不显示。这不是一个数字,它不是一个字符串。也许某种id 4 ?
然而,ES6对此采取了预防措施,每个符号都有一个description string 5 ,可以作为Symbol
函数的可选参数传递。此外,ES6确实指定了符号应如何在§19.4.3.2中显示为字符串。这通常是控制台使用的。
这个“描述性字符串”几乎与Symbol
的调用方式相似,例如。
var sym1 = Symbol("my description");
console.log(sym1.toString()); // "Symbol(my description)"
console.log(sym1); // Symbol(my description)6
var sym2 = Symbol();
console.log(sym2.toString()); // "Symbol()"
console.log(sym2); // Symbol()6
1:但是,它是一个普通函数,而不是构造函数,不能使用new
调用。
2:加上某种类型信息,它是一个数字,给64位一个含义
3:显而易见,控制台在遇到号码时可能会使用.toString
for numbers
4:当您使用开发工具拍摄堆快照时,Chrome会为每个对象显示此类对象,例如
5:所以是的,它比独特的身份更多一点
6:依赖于实现,取决于您的console
答案 1 :(得分:0)
窗口[&#39;符号&#39;]功能是否像下面的函数g,
一样工作
不确定实际问题?但是,出现&#34; no&#34;
这就是混淆,当我说,&gt; sym1控制台显示符号() 而不是显示函数Symbol
返回的值
Symbol()
不返回一个function
,而是一个&#34;唯一且不可变的数据类型,可以用作标识符&#34; < / em>的
请参阅Symbol
symbol
是一种唯一且不可变的数据类型,可以用作 对象属性的标识符。符号对象是隐式的 符号原始数据类型的对象包装器。
var sym = Symbol("foo");
var obj = {};
obj[sym] = 1;
console.log(obj.sym); // `undefined`
console.log(Object.keys(obj)) // `[]`
console.log(obj[sym]); // `1`
&#13;