极客视点
极客时间编辑部
极客时间编辑部
113241 人已学习
免费领取
课程目录
已完结/共 3766 讲
2020年09月 (90讲)
时长 05:33
2020年08月 (93讲)
2020年07月 (93讲)
时长 05:51
2020年06月 (90讲)
2020年05月 (93讲)
2020年04月 (90讲)
2020年03月 (92讲)
时长 04:14
2020年02月 (87讲)
2020年01月 (91讲)
时长 00:00
2019年12月 (93讲)
2019年11月 (89讲)
2019年10月 (92讲)
2019年09月 (90讲)
时长 00:00
2019年08月 (91讲)
2019年07月 (92讲)
时长 03:45
2019年06月 (90讲)
2019年05月 (99讲)
2019年04月 (114讲)
2019年03月 (122讲)
2019年02月 (102讲)
2019年01月 (104讲)
2018年12月 (98讲)
2018年11月 (105讲)
时长 01:23
2018年10月 (123讲)
时长 02:06
2018年09月 (119讲)
2018年08月 (123讲)
2018年07月 (124讲)
2018年06月 (119讲)
时长 02:11
2018年05月 (124讲)
时长 03:16
2018年04月 (120讲)
2018年03月 (124讲)
2018年02月 (112讲)
2018年01月 (124讲)
时长 02:30
时长 02:34
2017年12月 (124讲)
时长 03:09
2017年11月 (120讲)
2017年10月 (86讲)
时长 03:18
时长 03:31
时长 04:25
极客视点
15
15
1.0x
00:00/05:32
登录|注册

delete 0:到底是在删除什么?

讲述:丁婵大小:7.60M时长:05:32
JavaScript 是一门面向对象的语言,它很早就支持了 delete 运算,但你知道 delete 0 到底是在删除什么吗?近日,南潮科技(Ruff)首席架构师周爱民在他的极客时间专栏《JavaScript 核心原理解析》中对这个问题进行了解答,以下是重点内容。
早期的 JavaScript 在推广时,采用传统的数据类型的分类方法,并且所谓值类型中的字符串是按照引用来赋值和传递引用的。但是什么是引用类型呢?在这件事上,JavaScript 偷了个懒,它强行定义了“Object 和 Function 就是引用类型”。这样一来,引用类型和值类型就给开发人员讲清楚了,对象和函数呢,也就可以理解了:它们按引用来传递和使用。
绝大多数情况下,这样解释起来是行得通的。但是到了 delete 运算这里,就不行。
因为这样一来,delete 0 就是删除一个值,而 delete x 就既可能是删除一个值,也可能是删除一个引用。然而,当时 JavaScript 又同时约定:那些在 global 对象上声明的属性,就“等同于”全局变量。于是,这就带来了第三个问题:delete x 还可能是删除一个 global 对象上的属性。
这中间有哪些细节的区别呢?delete 这个运算的表面意思,是该运算试图销毁某种东西。然而,delete 0 中的 0 是一个具体的、字面量表示的“值”。一个字面量值“0”如何在现实世界中销毁呢?假定它销毁了,那是不是说,在这个语言当前的运行环境中,就不能使用 0 这个值了呢?显然,这不合理。
所以,JavaScript 认为“所有删除值的 delete 就直接返回 true”,表明该行为过程中没有异常。然而,返回值只表明执行过程中没有异常,但实际的执行行为是“什么也没发生”。你显然不可能真的将“0”从执行系统中清理出去。

delete 0 到底是在删除什么?

对于一门编译型语言来说,所谓“0”,就是上面所述的一个值,它可以是基础值,也可以是数值类型。但如果将这个问题上升到编译之前的、所谓语法分析的阶段,那么“0”就会被称为一个记号。一个记号是没有语义的,记号既可以是语言能识别的,也可以是语言不能识别的。唯有把这二者同时纳入语言范畴,那么这个语言才能识别所谓的“语法错误”。
delete 不仅仅是要操作 0 或 x 这样的单个记号或标识符(例如变量)。因为这个语法实际起作用的是一个对象的属性,也就是“删除对象的成员”。所以,这正好将你之前所认识的倒转过来,是删除 x 这个成员,而不是删除 x 这个值。不过终归有一点是没错的:既然没办法表达异常,而 delete 0 又不产生异常,那么它自然就该返回 true。
如果你理解了它真正的语法 delete obj.x,就一定会想法:obj.x 既不是之前说过的引用类型,也不是值类型,它是一个表达式。所以,delete 这个操作的正式语法设计并不是“删除某个东西”,而是“删除一个表达式的结果”。
表达式的结果是什么?在 JavaScript 中表达式是一个很独特的东西,所有一切表达式运算的终极目的都是为了得到一个值,例如字符串。然后再用另外一些操作将这个值输出出来,例如变成网页中的一个元素。
在 JavaScript 中,有两个东西可以被执行并存在执行结果值(Result),包括语句和表达式。表达式的值,在 ECMAScript 的规范中,称为“引用”,这是一种称为“规范类型”的东西。
这种情况下,delete 0 这里的 0,其实不是值类型的数据,而是一个表达式运算的结果值。在进一步的删除操作之前,JavaScript 需要检测这个 Result 的类型:
如果它是值,则按照传统的 JavaScript 的约定返回 true;
如果它是一个引用,那么对该引用进行分析,以决定如何操作。
而 delete x 归根到底说起来,是在删除一个表达式的、引用类型的结果,而不是在删除 x 表达式,或者这个删除表达式的值。

总结一下

delete 运算符尝试删除值数据时,会返回 true,用于表示没有错误(Error)。
delete 0 的本质是删除一个表达式的值(Result)。
delete x 与上述的区别只在于 Result 是一个引用(Reference)。
delete 其实只能删除一种引用,即对象的成员(Property)。
所以,只有在 delete x 等值于 delete obj.x 时,delete 才会有执行意义。
以上就是今天的内容,希望对你有所帮助。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
该免费文章来自《极客视点》,如需阅读全部文章,
请先领取课程
免费领取
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
11
沉浸
阅读
分享
手机端
快捷键
回顶部