null与undefined、Symbol

本文介绍了JavaScript中的null和undefined的区别,强调了null作为程序级别的空值,undefined表示系统级的缺失。同时,着重讲解了ES6引入的Symbol类型,作为非字符串属性名的独特性,以及在可迭代对象和语言扩展中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. null与undefined

(1)null是一个语言关键词,求值为一个特殊值,通常用于表示某个值不存在。对null使用typeof操作符返回字符串"object",表明可以将null看成一种特殊对象,表示没有对象。但在实践中,null通常呗被当作它自己类型的唯一成员,可以用来表示数值、字符串以及对象“没有值”。但是typeof null会返回字符串"object"是语言的一个bug,实际上,null本身是基本数据类型的。

为什么typeof null返回的是object?(简单介绍一下)

1995年JavaScript语言的第一版,所有值都设计成32位,
其中最低的3位用来表述数据类型,object对应的值是000。
当时,只设计了五种数据类型(对象、整数、浮点数、字符串和布尔值),完全没考虑null,只把它当作object的一种特殊值,32位全部为0。 这是typeof null返回object的根本原因。

(2)Javascript中的undefined也表示值不存在,但undefined表示一种更深层次的不存在。具体来说,变量的值未初始化时就是undefined,在查询不存在的对象属性或数组元素时也会得到undefined。另外,没有明确返回值的函数返回值是undefined,没有传值的参数的值也是undefined。undefined是一个预定义的全局常量(而非像null那样的语言关键字),这个常量的初始化就是undefined。对undefined应用typeof undefined操作符会返回"undefined",表示这个值是该特殊类型的唯一成员。

关于undefined和null值的使用

我们认为可以用undefined表示一种系统级别、意料之外或类似错误的没有值,可以用null表示程序级别、正常或意料之外的没有值。实际编码中,我会尽量避免使用null和undefined,如果需要给某个变量或属性赋一个这样的值,或者需要向函数传入或从函数中返回一个这样的值,我通常使用的是null。

二. 符号(Symbol)

符号(Symbol)是ES6新增的一种原始类型,用作非字符串的属性名。要理解符号,需要了解Javascript的基础类型Object是一个属性的无序集合,其中每个属性都有一个名字和一个值。属性名通常是(在ES6之前一直必须是)字符串。但在ES6和之后的版本中,符号也可以作为属性名:

let strname = "string name";
let symname = Symbol("propname");
console.log(typeof strname); // => "string":string是字符串
console.log(typeof symname); // => "symbol": symbol是符号
let o ={};
o[strname] = 1;
o[symname] = 2;
console.log(o[srtname]); // => 1:访问字符串名字的属性
console.log(0[symname]); // => 2:访问符号名字的属性 

Symbol类型没有字面量语法。要获取一个Symbol值,需要调用Symbol()函数。这个函数永远不会返回相同的值,即使每次传入的参数都一样。这意味着可以将调用Symbol()取得的符号值安全地用于为对象添加新属性,而无需担心可能重写已有的同名属性。类似的,如果定义了符号属性但没有共享相关符号,也可以确信程序中的其它代码不会重写这个属性。

实践中,符号通常用作一种语言扩展机制。ES6新增了for/of循环(参见5.4.4节)和可迭代对象(参见12章),为此就需要定义一种标准的机制让类可以实现,从而把自身变得可迭代。但选择任何特定的字符串作为这个迭代器方法的名字都有可能破坏已有的代码。为此,符号名应运而生。正如12章会介绍的Symbol.iterator是一个符号值,可用作一个方法名,让对象变得可迭代。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值