JavaScript核心原理解析(一)

158 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情

代码的静态组织

JavaScript 的所谓 脚本代码,在引擎层面看来就是一段文本,JavaScript 解析引擎是 逐字符 地处理代码文本的。

JavaScript 是动态语言,表达式是一个很独特的东西,所有一切表达式运算的终极目的都是为了得到一个值(表达式的本质是求值运算)。

ECMAScript 的目的是描述 引擎如何实现,而不是 描述语言是什么

在任何语句执行并得到结果时,如果它当时是一个所谓的 引用,那么这个引用就必须先调用 GetValue(x) 来得到值,然后放到这个 value 域中去。因为 引用 是一个规范层面的东西,它不是 JavaScript 语言能理解的,也无法展示给开发者。

引用还是指向值、代表值的一个概念,它只是 获得值的访问能力 的一个途径。最终的结果仍然指向原点:计算值、求值。

有什么是可以销毁的

引用类型的结果,delete 的删除就是很好的解释。

在 JavaScript 的内部,所谓 引用 是可以转换为 ,以便参与值运算的。因为表达式的本质是求值运算,所以引用是不能直接作为最终求值的操作数的。这依赖于一个非常核心的、称为 GetValue() 的内部操作。所谓内部操作,也称为内部抽象操作(internal abstract operations),是 ECMAScript 描述一个符合规范的引擎在具体实现时应当处理的那些行为,GetValue() 是从一个引用中取出值来的行为。

obj.x 是一个表达式,一切表达式运算的终极目的都是为了得到一个值。obj.x 也是一个引用,属性存取("."运算符)”返回一个关于 x 的引用,引用只是在语法层面上表达它是对某种语法元素的引用,而与在执行层面的值处理或引用处理没关系,因为最后我们在页面看到的是一个结果,而不是地址的引用。

{} 一对大括号是表示一个字面量的对象,当它被作为表达式执行的时候,结果也是一个值,这类表达式称为 单值表达式 的原因,这里并没有所谓的 引用。可以准确地说,是 非引用类型

访问不存在的变量 x 报 ReferenceError 错误,其实是对 x 表达式的的 Result引用 做 getValue 的时候报的错误,然后为啥 typeof xdelete x 不报错,因为这两个操作没有求值。

所有赋值操作的含义,是将右边的,赋给左边用于包含该值的引用x = x 的语义并不是将 x 赋给 x,而是把值 x 赋给引用 x

所谓值类型中的字符串是按照引用来赋值和传递引用(而不是传递值)的。如果 x 的值是 1,那么 y = x 的话,就是把 1 这个值抄写到 y 里面去。这是正常值的处理方法,但是如果字符串值也这么处理就完蛋了,因为字符串可能无数多个字符,那么当 y = x 按照正常值的处理方法来实现的话,这个值复制的开销就受不了。所以值类型中的字符串,是指照引用来赋值和传递引用的;且它是只传递引用(而不是传递值)的。因为基本类型的值是不可改变的,所以修改的时候就是直接用新的直接替换掉 原始数据

个人总结

引用类型和基本类型只是在语法上面的表示,在执行层是没有关系的,最后我们看到的是一个结果值而不是一堆引用。