Symbols

博客围绕Symbol展开,探讨了其作用,介绍了Symbol()的语法,还提及了Symbol的其他一些知识,属于JavaScript相关内容。
Symbol这个词在IT软件领域实际上是个常见角色,在传统前端技术领域,这个词出现频率有限,
但是,随着现代web技术的发展,Symbol这个词开始在不同前端语言中出现。
symbol的中文意思是:符号;象征;标志;记号等。

作为一个JavaScript的原生数据类型(primitive data type)存在。
说到JavaScript原生数据类型,我们通常想到的有这6种:
undefined、null、boolean、string、number、object。
而symbol是ES6新增的一个原生数据类型。

而Symbol本身又是一个方法。
例如下面JStypeof Symbol()===>>>>'symbol',
symbol类型显示
但Symbol不能作为构造函数使用,否则或报错 XXX new Symbol();

Symbol的作用是什么?

Symbol的作用非常的专一,换句话说其设计出来就只有一个目的——作为对象属性的唯一标识符,
防止对象属性冲突发生。

//举个例子,你看上了公司前来的前台妹纸,想了解关于她的更多信息,于是就询问Hr同事,
//扫地阿姨,于是得到类似这样信息:
let info1 = {
    name: '婷婷',
    age: 24,
    job: '公司前台',
    description: '平时喜欢做做瑜伽,人家有男朋友,你别指望了'
}
let info2 = {
    description: '这小姑娘挺好的,挺热情的,嘿嘿嘿……'
}
//显然,你需要对这两个数据进行汇总,结果,就会发现,描述都用了同一个对象属性description,
//于是整合的时候,就容器冲突,覆盖,导致“人家有男朋友”这么重要的信息都没注意到。

但是,如果要是Symbol,则完全就不要担心这个问题了:
let info1 = {
    name: '婷婷',
    age: 24,
    job: '公司前台',
    [Symbol('description')]: '平时喜欢做做瑜伽,人家有男朋友,你别指望了'
}
let info2 = {
    [Symbol('description')]: '这小姑娘挺好的,挺热情的,嘿嘿嘿……'
}

此时,我们对info1, info2对象进行复制,如下:let target = {};
Object.assign(target, info1, info2);
target====>>>{
				age: 24,
				job: "公司前台",
				name: "婷婷",
				Symbol(description): "平时喜欢做做瑜伽,人家有男朋友,你别指望了",
				Symbol(description): "这小姑娘挺好的,挺热情的,嘿嘿嘿……"
			}

因为Symbol()返回值是唯一的,也就是:
Symbol('description') === Symbol('description');    // 返回值是false

Symbol()的语法

Symbol('description') target 对象不能遍历description 属性 
也不能想使用正常对象的属性eg:target["description"] ==undefind
let description=Symbol(["description"])
这样命名就可以正常访问属性及遍历

如何获取Symbol()对应属性值?
拿上面target举例,如何获得对妹纸的description描述信息呢?

//我们可以使用Object.getOwnPropertySymbols(obj)这个方法进行获取,
//可以返回obj对象中的Symbol信息,例如:Object.getOwnPropertySymbols(target);

妹纸的描述信息
Symbol在和对象使用的时候,往往离不开JS中的数组括号[],例如:
var smy = Symbol();
var info = {
  smy: 'x',
  [smy]: 'y'
};
此时:
console.log(info.smy);       // 输出'x'
console.log(info['smy']);    // 输出'x'
console.log(info[smy]);      // 输出'y'

Symbol其他一些知识

1. Symbol与运算、类型转换等
symbol值虽然不是对象,但是根据自己测试,在Chrome和Firefox下都是可以添加属性的,例如:
var smy = Symbol();
smy.description = '描述';
//在macos chrome 65.0.3325.181和node v8.9.4中测试给symbol加属性结果是undefined
//与上面window PC测试结果有些细节差异。

使用宽松相等时, Object(sym) == sym返回值是true。注意这里外面套的是Object()2. Symbol与forin迭代
Symbols在for...in迭代中不可枚举,如果想要达到效果,借助Object.getOwnPropertySymbols(obj)这个方法。

var obj = {};
obj[Symbol("a")] = "a";
obj[Symbol.for("b")] = "b";
obj["c"] = "c";
obj.d = "d";
 
for (var i in obj) {
   console.log(i);   // 输出 "c" 和 "d"
}

3. Symbol与JSON.stringify()
当使用JSON.strIngify()时以symbol值作为键的属性会被完全忽略,示意代码:

JSON.stringify({[Symbol("foo")]: "foo"});    // '{}'   
           

### 符号选择在编程和配置中的作用 符号选择(Symbol Selection)是编程和配置中一个关键概念,特别是在涉及跨平台编译、链接器选项以及动态库加载时。以下是关于符号选择在不同场景下的应用和相关技术细节: #### 跨平台编译中的符号选择 在跨平台编编译环境中,符号选择通常涉及到如何处理目标系统上的库文件和头文件。例如,当目标系统上的某些库不可用时,可以将这些库复制到主机系统上特定的目录中,并通过链接器选项告知其位置[^1]。以下是一个典型的命令示例,展示了如何通过 `-rpath-link` 和 `-L` 选项指定库路径,同时使用 `--unresolved-symbols=ignore-in-shared-libs` 忽略未解析的符号: ```bash make TARGET_ARCH=<arch> TARGET_OS=<os> \ EXTRA_LDFLAGS="-rpath-link=/opt/target/libs -L/opt/target/libs --unresolved-symbols=ignore-in-shared-libs" \ EXTRA_CCFLAGS="-I /opt/target/include" \ SAMPLE_ENABLED=1 ``` 此命令中,`EXTRA_LDFLAGS` 指定了链接器需要查找的库路径,而 `EXTRA_CCFLAGS` 则指定了编译器需要包含的头文件路径[^1]。 #### 链接器选项与符号解析 链接器选项对符号选择至关重要。例如,`--unresolved-symbols=ignore-in-shared-libs` 可以用于忽略共享库中的未解析符号,这对于某些跨平台开发场景非常有用。此外,`-rpath-link` 选项允许链接器在指定路径中搜索动态库,从而确保运行时能够正确加载所需的符号。 #### 配置文件中的符号选择 在某些情况下,符号选择可能涉及配置文件或脚本中的设置。例如,在构建工具链时,可以通过环境变量或配置文件指定符号解析规则。以下是一个简单的 Python 脚本示例,展示如何动态选择符号: ```python def select_symbol(symbol_map, key): if key in symbol_map: return symbol_map[key] else: return "default_symbol" symbol_map = { "linux": "linux_symbol", "windows": "windows_symbol", "macos": "macos_symbol" } key = "linux" selected_symbol = select_symbol(symbol_map, key) print(f"Selected symbol: {selected_symbol}") ``` 此脚本根据键值动态选择符号,适用于需要根据不同平台选择不同符号的场景。 #### GUI 开发中的符号选择 在图形用户界面开发中,符号选择可能与控件样式相关。例如,`Style` 对象的存在与否可以通过特定方法检查,从而决定是否应用某种样式[^2]。以下是一个 C# 示例,展示如何检查样式对象是否存在: ```csharp if (control.Style != null && control.Style.IsCreated) { // 应用样式 } else { // 使用默认样式 } ``` 此代码片段中,`IsCreated` 属性用于判断样式对象是否已被创建[^2]。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值