深入理解JavaScript系列(19):求值策略(Evaluation strategy)详解

yizhihongxing

当JavaScript引擎要执行一段代码时,它会将代码中的表达式转换成值,这个转换的过程被称为求值。在求值的过程中,JavaScript引擎采用了不同的求值策略。本文将详细介绍JavaScript中的求值策略及其相关的知识点。

一、JavaScript中的表达式

在JavaScript中,表达式是由运算符和操作数组成的。表达式主要分为以下几类:

  1. 原始表达式:包括字面量和变量名。

  2. 对象和数组初始化表达式:包括对象字面量和数组字面量,它们会创建一个新的对象或数组。

  3. 函数调用表达式:由一个函数调用和一组参数组成。

  4. 属性访问表达式:由一个对象和一个属性名称组成。

  5. 运算符表达式:由一个或多个操作数和一个运算符组成。

二、JavaScript中的求值策略

JavaScript中的求值策略主要分为两类:短路求值和完全求值。

1. 短路求值

短路求值是JavaScript中常见的求值策略。它主要用于逻辑运算符和条件运算符中。当逻辑运算符和条件运算符的左操作数就能确定整个表达式的值时,右操作数的求值过程就可以省略掉。具体而言,以下面代码为例:

var a = 2, b = 3;
if (a > 0 && b > 0) {
    console.log('Both a and b are positive numbers');
}

在上面的代码中,逻辑与运算符左侧的表达式a > 0的结果已经是true,因此整个逻辑与运算的结果就已经可以确认是true,右侧的表达式b > 0的求值就可以省略掉了。

再看下面这个例子:

var a = 0;
if (a === 5 || a === 6) {    
   console.log('a is either 5 or 6');
}

在上面的代码中,条件操作符左侧的表达式a === 5的结果是false,但是右侧的表达式a === 6的结果还不确定,因此整个条件操作符的结果也还不确定。这时JavaScript引擎会继续求解右侧的表达式,最终确定整个条件操作符的结果为false。

2. 完全求值

完全求值是另一种JavaScript中的求值策略。它主要用于数值运算和字符串运算中。在完全求值的过程中,表达式中的所有运算符和操作数都会被完全求值。

例如:

var a = 10;
var b = a + 2 * 3;
console.log(b);    // 16

在上面的代码中,变量b的值会完全求值,首先先要求解2 * 3,得到值6,然后再将这个值加上变量a的值10,最终得到变量b的值16。

三、示例说明

1. 逻辑运算符中的短路求值

在逻辑运算符中,如果左侧的表达式已经可以确定整个运算符的结果时,右侧的求值过程可以省略掉。

例如:

var a = 5, b = null, c = undefined, d = '';
var result = (a > 0) && (b && c && d);
console.log(result);    // false

在上面的代码中,变量result的值为false,这是由于逻辑与运算符左侧的表达式a > 0的结果为true,而逻辑与运算符右侧的b && c && d的求值过程就可以省略掉。因为对于逻辑与运算符,只有左右两侧都为true时,整个运算符才会返回true,否则返回false。

2. 数值运算中的完全求值

在数值运算中,表达式中的所有运算符和操作数都会被完全求值。

例如:

var a = 5, b = 10;
var result = a++ + --b * 2 + 3;
console.log(result);    // 21

在上面的代码中,变量result的值为21,它的求值过程如下:

  • a++的值为5,然后将变量a的值加1。
  • --b的值为9,然后将变量b的值减1。
  • --b * 2的值为18。
  • a++ + --b * 2的值为23。
  • a++ + --b * 2 + 3的值为21。

四、总结

在JavaScript中,求值是将表达式转换成值的过程。JavaScript引擎采用不同的求值策略来决定表达式中各个部分的求值先后顺序。本文主要介绍了JavaScript中的求值策略及其相关的知识点。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入理解JavaScript系列(19):求值策略(Evaluation strategy)详解 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • js 中的switch表达式使用示例

    当我们需要根据不同的条件执行不同的代码块时,使用 switch 语句是一种比较方便的选择。在 JavaScript 中,switch 表达式使用示例如下: switch 语句的结构 switch (表达式) { case 标签1: 执行代码块 1; break; case 标签2: 执行代码块 2; break; … default: 执行代码块 n; …

    JavaScript 2023年5月28日
    00
  • JavaScript的console命令使用实例

    下面是关于“JavaScript的console命令使用实例”的攻略: 1. 什么是console命令 console命令是JavaScript中一个非常重要、强大的命令工具,通过调用console命令可以在浏览器的控制台显示输出信息,帮助开发者在调试Web应用时及时发现代码中的错误或获得有用的信息。 2. console命令使用方法 2.1 输出字符串 在…

    JavaScript 2023年5月28日
    00
  • JS获取url参数、主域名的方法实例分析

    JS获取URL参数的方法实例分析 在前端开发中,经常需要获取URL中的参数,以便进行相应的逻辑处理。下面我们将介绍JS获取URL参数的方法。 方法一:正则表达式获取 常见的方法是通过正则表达式获取。 /** * @description 通过正则表达式获取URL中指定参数的值 * @param {string} name 参数名 * @param {stri…

    JavaScript 2023年5月28日
    00
  • Ext JS框架中日期函数的用法及日期选择控件的实现

    Ext JS框架中提供了丰富的日期函数和日期选择控件,可以用于方便地处理日期相关的逻辑和交互。下面将分别详细介绍它们的用法和实现方式。 日期函数的用法 获取当前日期和时间 获取当前日期和时间可以使用 Ext.Date.now() 函数。它返回当前的时间戳,即距离1970年1月1日0时0分0秒的毫秒数。如果要将当前时间以指定格式显示,可以使用 Ext.Date…

    JavaScript 2023年6月10日
    00
  • Javascript中函数名.length属性用法分析(对比arguments.length)

    当我们在JavaScript中定义一个函数时,函数名上有一个属性length,它用来获取函数定义时的形参个数。这个length属性可以作为函数的一个属性被调用。 与之相似的,我们可以使用arguments.length来获取函数调用时实际传入参数的个数。下面将对这两者的用法进行详细的讲解,同时提供相应的示例。 Javascript中函数名.length属性 …

    JavaScript 2023年5月28日
    00
  • JavaScript中最简洁的编码html字符串的方法

    生成HTML字符串是JavaScript中非常常见的操作,下面分享一种简洁的方法来编写HTML字符串,步骤如下: 1. 使用模板字符串方式生成HTML字符串 在ES6中提供了模板字符串,使用模板字符串可以轻松地编写HTML字符串。所谓模板字符串,就是以反引号(`)为边界,内部可以包含变量,类似下面这样: const name = ‘John’; const …

    JavaScript 2023年5月18日
    00
  • JavaScript获取当前日期是星期几的方法

    当涉及到处理日期和时间时,JavaScript是开发人员的首选语言之一,可以轻松地获取当前日期是星期几。以下是获取当前日期是星期几的方法详细攻略。 1. 获取当前日期和星期 我们可以使用JavaScript内置的Date对象来获取当前日期和星期。 var date = new Date(); console.log(date); // 输出示例: Wed N…

    JavaScript 2023年5月27日
    00
  • 基于JS脚本语言的基础语法详解

    基于JS脚本语言的基础语法详解 介绍 JavaScript(简称JS)是一种脚本语言,常用于在Web浏览器中编程,用于处理交互式的前端逻辑。随着Node.js的流行,JS也在后端得到了广泛应用。本文将详细讲解JS的基础语法,包括变量、运算符、控制流、函数、对象等内容。 变量 在JS中,可以使用关键词var、let、const声明变量。其中,var是ES5引入…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部