180306 表达式

javascript中解析四则运算表达式的算法和示例 在编写代码时我们有时候会碰到需要自己解析四则运算表达式的情况,本文简单的介绍使用JavaScript实现对简单四则运算表达式的解析。 一、熟悉概念 中缀表示法(或中缀记法)是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(例:3 + 4)。也就是我们最常用的算术表达式,中缀表达式对于人类来说比较容易理解,但是不易于计算机解析。 逆波兰表示法(Reverse Polish notation,RPN,或逆波兰记法),是一种是由波兰数学家扬·武卡谢维奇1920年引入的数学表达式方式,在逆波兰记法中,所有操作符置于操作数的后面,因此也被称为后缀表示法。逆波兰记法不需要括号来标识 立即下载

表达式是js中的一个短语,js解释器会将其计算出一个结果。

原始(原始值)表达式

  • 常量
  • 直接量
 1.23          //数字直接量
'hello'        //字符串直接量
/pattern/     //正则表达式直接量  
  • 关键字
true   //返回一个布尔值:真
false  //返回一个布尔值:假
null   //返回一个值:空
this   //返回'当前'对象
  • 变量
a            //返回变量a的值
undefined    //undefined是全局变量,它不是一个关键字
  • 当js中出现了标识符,js会将其当作变量而去查找它的值。如果变量名不存在,表达式运算结果为undefined。而在es5严格模式中,对不存在的变量进行求值会抛出一个错误异常。

对象和数组的初始化表达式

对象和数组的初始化表达式实际上是一个新创建的对象和数组。这些初始化表达式有时称作 ‘对象直接量 ’,‘数组直接量 ’。
和布尔值直接量不同,它们不是原始表达式,因为 它们所包含的成员或者元素都是子表达式。

  • 数组直接量中的列表逗号之间的元素可以省略,这时省略的空位会填充值undefined。
var s = [1,,,,5];
  • 对象直接量中的属性名可以是字符串而不是标识符。
var s = {'apple':{a:1,b:2}}

函数定义表达式

也可以叫做函数直接量

var square = function(x){return x * x};

属性访问表达式

属性访问表达式运算 得到一个对象属性或一个数组的值。

expression.identifer
expression[expression]   //如果属性名称是一个【1】保留字或者包含【2】空格和标点符号,或者是【3】数字(对于数组来说)则必须使用方括号。
var o = {x:1,y:{z:3}};
var a = {o,4,[5,6]};
o.x         // 1:表达式o的属性x
o.y.z       // 3:表达式o.y的z属性
o['x']      // 1:表达式o的属性x
a[1]        // 4:表达式a中索引为1的元素
a[2]['1']   // 6:表达式a[2]中索引为1的元素
a[0].x      // 1:表达式a[0]的x属性

调用表达式

是一种调用函数或方法的语法表示。函数表达式开始,表达式后跟随一个括号,括号内是一个以逗号隔开的参数列表。

f(0)  // f 是一个函数表达式,0是一个参数表达式
Math.max(x,y,z)  // Math.max 是一个函数;x,y,z是参数
a.sort()  // a.sort 是一个函数,它没有参数

如果函数使用return语句给出一个返回值,那么这个返回值就是整个调用表达式的值。

如果一个表达式是属性访问表达式,那么这个调用称做 ‘方法调用’。

在方法调用中,执行函数体的时候,作为属性访问主题的对象和数组便是其调用方法内this的指向。这种特性使得在面向对象编程范例中,函数可以调用其宿主对象。


对象创建表达式

创建一个对象并调用一个函数初始化新对象的属性。

调用的函数称作构造函数。

对象创建表达式和函数调用表达式非常相似,只是对象创建表达式之前多了一个关键字new,如果对象创建表达式不需要传如任何参数给构造函数的话,那么括号可以省略。

new Object()
new Point(2,3)
new Object
new Date

运算符概述

运算顺序

var a = 1;
var b =(a++)+a; //它这步a不变,这步结束a自增
console.log(b);

正确顺序:

  1. 计算b [b = (a++)+a]
  2. 计算a++ (设 c) [c = 1]
  3. 计算a [a = 2]
  4. 计算c+a [3]
  5. c+a结果赋值给b [3]

算数表达式

‘+’ 运算符

  • 加法或字符串连接。
  • 如果存在字符串或类字符串(对象转换为字符串),优先考虑字符串连接。
  • 加法操作符行为:
    如果其中一个操作数是对象,则根据对象到原始值的准换规则转换成原始值。【toString() valueOf()】
    转换后,如果其中一个操作数是字符串,另一个操作数也会被转换为字符串,然后进行连接。
    否则,都转换成数字加法操作。
1 + 2 // 3 : 加法
'1' + '2' // '12' : 字符串连接
'1' + 2  // '12' : 数字转换为字符串后进行字符串拼接
1 + {} // '1[object Object]':对象转换为字符串后进行字符串连接
true + true // 2 : 布尔值转化为数字后做加法
2 + null // 2 : null转化为0后做加法
2 + undefined // NaN : undefined转换为NaN后做加法

一元算数运算符
’ + ’ ’ - ’ ’ ++ ’ ’ – ‘

  • 根据需要把操作数转换为数字。

位运算符


关系表达式

相等和不相等运算符

比较运算符

  • 更偏爱数字,只有两个都是字符串的时候才会进行字符串的比较
11 < 3 // 数字比较,false
'11' < '3' // 字符串比较,true
'11' < 3  // 数字的比较,false
'one' < 3 //数字的比较,'one'转换为NaN,false

in运算符

  • in运算符希望它的左操作数是一个字符串或可以转换为字符串,希望它的右操作数是一个对象。
  • 如果右侧的对象 拥有一个名为左操作数值的属性名(索引),那么表达式返回true
var point = {x:1,y:1};
'x' in point   // true : 对象有一个名为'x'的属性
'z' in point   // false : 对象中不存在名为'z'的属性
'toString' in point    // true : 对象继承了toString()方法
var data = [7,8,9];   
'0' in data    // true : 数组包含元素'0'
1 in data      // true : 数字转换为字符串
3 in data      // false : 没有索引为3的元素

instanceof运算符

  • instanceof运算符希望左操作数是一个对象,右操作数标识对象的类。
  • 如果左侧的对象是右侧的实例,则返回true。
  • JS中对象的类是通过初始化它们的构造函数来定义的,这样右操作数是一个函数。
var d = new Date();
d instanceof Date  // true : d是由Date()创建的
d instanceof Object  // true : 所有的对象都是Object()的实例
d instanceof Number  // false : d不是一个Number对象
var a = [1,2,3];
a instanceof Array  // true : a是一个数组
a instanceof Object // true : 所有的数组都是对象
a instanceof RegExp // false : 数组不是正则表达式
  • 所有的对象都是Object的实例。当通过instanceof判断一个对象是否是一个类的实例的时候,这个判断也会包含对‘父类’的检测。

逻辑表达式

逻辑与(&&)

并不总是返回true和false。

运算符首先计算左操作数的值,即首先计算’&&’左侧的表达式。如果计算结果是假值,那么整个表达式的结果一定也是假值,因此’&&’这时简单地返回左操作数的值,而并不会对右操作数进行计算。

如果左操作数是真值,那么整个表达式的结果则依赖于右操作数的值。如果右操作数是真值,那么整个表达式也是真值。因此,当左操作数的真值时,’&&’运算符计算右操作数的值并将其返回作为整个表达式的计算结果。

var a = 10 && 20;   20


var o = {x:1};
var p = null;
o && o.x  // 1:o是真值,因此返回值为o.x
p && p.x  // null:p是假值,因此返回值为p
// 计算表达式p.x会抛出一个错误异常,而使用逻辑与运算符避免了问题。

逻辑与运算是否继续执行,看左操作数是否为真值或转换为真值。
如果能,执行右操作数,返回右操作数的值;如果为假值或转换为假值,返回左操作数的值,不继续计算。

可以称这种特性为“短路”。

if (a == b) stop();
a == b && stop();

逻辑或(||)

首先计算第一个操作数的值,也就是说会首先计算左侧的表达式。如果计算结果为真值,那么返回这个真值。否则,再计算第二个操作数的值,并返回这个表达式的结果。

常用方式是用来从一组备选表达式中选出第一个真值表打式:

var a = 10 || 20;    10 遇到真就返回

//如果max_width已经定义了,直接使用它;否则再preferences对象中查找max_width
//如果没有定义它,则使用一个写死的常量
var max = max_width || preference.max_width || 500

或者用来给参数提供默认值:

// 将o的成员属性复制到p中,并返回p
function(o,p){
    p = p || {}; //如果向参数p没有传入任何对象,则使用一个新创建的对象
}

逻辑非(!)

首先将其操作数转换为布尔值,然后再对布尔值求反。也就是说’!’总是返回true或者false,并且可以通过使用两次逻辑非运算得到一个值的等价布尔值:!!x


赋值表达式

带操作的的赋值运算

  • 大多数情况下,表达式为:a op= b
    和下面的表达式等价:a = a op b

  • 注意:在第一行中,表达式计算了一次,第二行计算了两次。
    只有在a包含具有副作用的表达式(比如函数调用和赋值操作)的时候,两者才不等价。

  • a op= b + c -> a = a op (b + c)
var a = [10, 20, 30, 40];
var b = [10, 20, 30, 40];

var i = 0;   
var j = 0;

var test1 = a[i++] *= 2;
// a[0] = 10 * 2;
var test2 = b[j++] = b[j++] * 2;
// b[0] = b[1] * 2; 

i = 1; j = 2; test1 = 20; test2 = 40;
a = [20,20,30,40]; b = [40,20,30,40] 

表达式计算

eval()


其它运算符

  • 条件运算符
    条件运算符是JS中唯一一个三元运算符。
x > 0 ? x : -x  // 求绝对值

应用场景:判断一个变量是否有定义(并拥有一个有意义的真值)

greeting = 'hello' + (username ? username : 'there');
// 与下面等价,更简洁
greeting = 'hello';
if(username)
    greeting += username;
else
    greeting += 'there';
  • typeof运算符
x                typeof x
undefined       'undefined'
null            'object'
true false      'boolean'
数字,NaN        'number'
字符串           'string'
函数             'function'
内置对象          'object'
宿主对象          有编译器各自实现的字符串,但不是以上的返回值 

typeof最常用的用法是写在表达式中:

(typeof value == 'string') ? " ' " + value + " ' " : value

typeof可以带上括号,让其看起来像一个函数名:

typeof(i)

typeof对于区分原始值很有效,对于对象的类,则需要使用其他手段:instanceof运算符,class特性,constructor属性。数组会被返回为’object’。

  • delete运算符
var o = {x:1,y:2};
delete o.x;
'x' in o 

var a = [1,2,3];
delete a[2];
2 in a;   //false:元素2在数组中已经不存在了
a.length  //3:注意数组长度还是3,尽管删除了这个元素,但删除后留下了一个洞,没有修改数组长度。

注意:删除属性或者删除数组元素不仅仅是设置了一个undefined的值,这个属性将不再存在。读取一个不存在的属性将返回undefined,所以检测这个属性是否真正的消失可以通过in运算符。

  • void运算符

操作数正常计算,但忽略计算结果并返回undefined。由于void会忽略操作数的值,因此在操作数具有副作用的时候使用void来让程序更具语义。
这个运算符最常用在客户端的URL中—-JavaScript:URL中,在URL中可以写带有副作用的表达式,而void则让浏览器不必显示这个表达式的计算结果:

<a href="javascript: window.open();">打开一个窗口</a>
javascript属性访问表达式用法分析 本文实例讲述了javascript属性访问表达式用法。分享给大家供大家参考。具体分析如下: 属性访问表达式运算得到一个对象属性或一个数组元素的值。js为属性访问定义了2中语法: expression.identifier expression["expression"] 不管使用何种形式属性访问表达式,在.和[之前的表达式钟会首先计算,如果计算结果是null或undefined,则表达式会抛出一个类型错误异常,因为这两个值都不能包含任意属性。 显然.identifier的写法更加简单,单这种方法只适用于要访问的属性名称是合法的标示符,且需要知道要访问的属性名字。如果属性名称是一个保留字或包 立即下载

相关推荐

ADS RFpro 射频阻抗仿真步骤

导入器件后,在库里面选取器件的对应模型,如图所示我们选取10pf 系统自带的村田模型。选取网络上的器件,拖入到下面component Models。导入成功后,截取需要仿真的区域(不截取仿真时间会非常长),可以生成对应如下原理图,通过原理图继续调整仿真。图上找到需要仿真链路上的网络,右键设置为信号。的叠层信息,按照PCB板厂提供信息填写完整。选择仿真的频率范围和频点数,生成如下图的RFPro仿真界。,然后再把GND也添加到下面。按图设置截取需要仿真的部分。添加成功后 网络就有了,15 双击run开始仿真。

m0_72954480的博客 3216

javascript解析_使用JavaScript解析数学表达式

javascript解析by Shalvah 由Shalvah 使用JavaScript解析数学表达式 (Parsing math expressions with JavaScript) A while ago, I wrote about tokenizing a math expression, with Javascript as the language of choice. The...

1936

《通信工程施工与管理》

制作馈线接头必须使用专用的工具,专用工具包括:馈线切割刀、馈线安全刀、小金属丝毛刷、固定尺寸或大号活动扳手、小号扁锉刀、细齿小手锯、接头扩孔器、3M防水胶或防水接头盒;如图所示,详情如表所示。

2302_78710464的博客 1653

JS前端之三元表达式解析

三元表达式 又叫三元运算符,必须有三个操作数参与的运算 操作符号:? : 表达式:在参与 js 程序时,都必须先计算出表达式结果,才能参与后续程序 由于三元表达式具备了一些选择的效果,所以也是一种条件分支语句 语法 boolean_expression ? true_value : false_value; boolean_expression: 布尔表达式,表达式在参与三元运算中必须求得一个布尔类型的值,要么是 true,要么是 false,结果作为判断依据,判断到底去:前面的值还是后面的值 tru

weixin_42024074的博客 7296

U8+ 新建账套

一、登录 账套主管:demo 对账套有修改权限,有账套库权限 系统管理员:admin 其他所有权限 二、新建账套 admin登录–>点击系统管理–>账套–>建立 选择了参照已有账套结转期初:就是上一个的期末数据作为这一次新表的期初数据 启用会计期一旦选择更改不了。 ...

茶茶很困i 3693

如何运用好DeepSeek为自己服务:智能增强的范式革命 || 目录

1.1 认知增强的三次浪潮1.2 DeepSeek认知增强模型1.3 人机认知耦合协议1.4 认知增强的数学基础。

𝓓𝓸𝓶𝓲𝓷𝓪𝓽𝓲𝓷𝓰 𝓐𝓵𝓵 𝓣𝓱𝓲𝓷𝓰𝓼 1220

js实现解析四则运算表达式并计算结果

【代码】js实现解析四则运算表达式并计算结果。

蒾酒的博客 659

VECTOR硬件VN1600系列对比:VN1610、VN1611、VN1630A、VN1640A、VN1630log、VN1670

VN16系列说不清道不明的区别和关系

AmorRun的博客 2万+

js中globalThis

参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/globalThis 全局属性globalThis包含全局的this值,类似于全局对象(global object)。 例子: const log = console.log; function canMakeHTTPRequest() { return globalThis; } console.log(canM...

wulong710的专栏 994

Cibersort免疫浸润 --- 详细教程

免疫浸润是指免疫细胞如淋巴细胞、浆细胞、巨噬细胞等进入到组织或器官中,并在这些组织或器官中发挥免疫功能的过程。免疫细胞的浸润可以是炎症反应的一部分,也可以是针对感染、肿瘤或其他疾病的免疫应答的一部分。免疫浸润通过调节免疫反应和炎症反应的程度和类型,起到维护机体免疫平衡和清除异常细胞或病原体的作用。在某些情况下,免疫浸润可能导致炎症反应过度,引起组织损伤,例如自身免疫性疾病。因此,免疫浸润在许多疾病的诊断和治疗中都具有重要的意义。免疫浸润可以通过组织切片染色和免疫组织化学等方法观察和分析。

ZxVSaccount的博客 9107

基于STM32控制直流电机加减速正反转仿真设计

*单片机设计介绍,基于STM32控制直流电机加减速正反转仿真设计。

2201_75940997的博客 1603

JS的语法

详细介绍了JS的相关语法和运算符的规则

qq_60754128的博客 602

第18章:Ingestion Pipeline 数据摄取流水线

本文介绍了LlamaIndex的IngestionPipeline如何解决合同文档处理中的四大核心问题:不可重复、无追溯、无容错和无法缓存。通过标准化数据处理流程,将手工操作升级为工厂流水线模式,实现数据的可复用、可追踪和高效处理。文章详细阐述了Pipeline的设计原理,包括Transformation的串行编排、缓存机制(基于输入和Transformation的哈希值)以及数据血缘追踪(通过Node的metadata记录处理过程)。

davidwang456的专栏 62

2023-7-9 SpringTask学习

cron表达式是一个字符串,通过cron表达式可以定义任务触发的时间构成规则:分为6,7个域,空格隔开,每个域有不同的含义这些域分别为:秒 分 时 日 月 周 年。

qq_47442941的博客 139

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【10.0】前端基础之JavaScript进阶

【10.0】前端基础之JavaScript进阶 【一】自定义对象 可以看成Python中的字典,但是在JS中的自定义对象要比Python里面的字典操作起来更方便 【1】创建自定义对象方式一 var d = {"键":"值",}; 操作方法 var dict = {"name":"dream","age":18}; var dict = {"name":"dream","age":18};...

Chimengmeng的博客 48

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【16.0】JavaScript之对象

【一】对象 js中的对象是无序的属性集合 我们可以把js中的对象想象成键值对,其中值可以是数据或者函数 特征-在对象中属性表示 行为-在对象中用方法表示 可以看成Python中的字典,但是在JS中的自定义对象要比Python里面的字典操作起来更方便 【二】对象创建 【1】对象字面量(Object Literal) 直接使用花括号 {} 来创建一个空对象,或者初始化对象时在花括号内直接指...

Chimengmeng的博客 1013

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Photoshop内容感知移动工具实战:5分钟学会足球位置调整与删除(附详细步骤图)

本文详细介绍了Photoshop内容感知移动工具的实战应用,通过足球位置调整与删除的案例,帮助用户快速掌握这一高效功能。从工具原理到具体操作步骤,包括精确创建选区、参数设置技巧、拖动微调及最终融合处理,全面提升图片编辑效率。特别适合处理草地纹理等复杂背景,是设计师的必备技能。

5b6n7m8的博客 280

js 解析表达式,js的算法案例

Emiter。

阿发狗伪原创 252

如何在JavaScript中解析S表达式

这是一种数据格式,其中所有内容都由括号包围的原子或列表创建(其他列表的原子之间由空格分隔)。数字字符串符号 - 它们类似于字符串,但没有引号,可以被解释为不同语言的变量名。此外,您还可以使用特殊的点运算符来创建一对。(1 . b)您可以将列表表示为点对(表示它们实际上是一个链接列表数据结构)。(1 2 3 4)nil是表示空列表的列表的末尾的特殊符号。使用这种格式,您可以创建任何二叉树。但我们在解析器中不使用这种点记法,以免复杂化问题。

晓风晓浪 767

浅谈 js表达式

转自:微点阅读https://www.weidianyuedu.com/content/2217370341742.html 表达式 运算符概述表达式是各种数值、变量、运算符的综合体,最简单的表达式可以是常量或者变量名称。 表达式的值是表达式运算的结果,常量表达式的值就是常量本身,变量表达式的值则是变量引用的值。 在实际编程中,可以使用运算数和运算符建立复杂的表达式,运算数是一个表达式内的变量和常量,运算符是表达式中用来处理运算数的各种符号。 常量表达式:“skycobra” 变量表达式:e...

ysds20211402的博客 296

JavaScript基础之运算符,表达式及语句详解

JavaScrip基础,运算符优先级,逻辑运算符使用,逻辑运算符短路,分支语句,三元运算符,单分支,多分支,while循环,循环语句

weixin_40630195的博客 1851

全国计算机等级考试python题库

1、循环队列的存储空间为Q(1:50),初始状态为空。经过一系列正常的入队与退队操作后,front=24,rear=25。此时该循环队列中的元素个数为______。A.1B.49C.50D.25本题考查知识点是循环队列。 循环队列是将队列存储空间的最后一个位置绕道第一个位置,形成逻辑上的环状空间,供队列循环使用。循环队列的初始状态为空,经过一系列的入队操作和退队操作后,头指针(front=24)尾指针(rear=25)说明入队25次,退队24次,此时队列中有1个元素。 所以本题答案是A。2、设某树的度为3,

斌擎科技 5033

JS解析表达式

// var express = "num1+num2*(num3-num_4)"; // var express = "num1+num2*(num3*(num_4-num5))"; var express = "(num1+num2)*(num3*(num_4-num5))-78"; // 以运算符为分组单位,提取变量(变量不可能连续出现,所以这样可以成功) var operato

a ray of sunshine 2183

js(表达式)

表达式与数学中的定义相似,表达式是指具有一定的值、用操作符把常数和变量连接起来的代数式。一个表达式可以包含常数或变量。我们先看看下面的JavaScript语句:生活中“再见”表达方法很多,如:英语(goodbye)、网络语(88)、肢体语(挥挥手)等。在JavaScript表达式无处不在,所以一定要知道可以表达哪些内容,看看下面几种情况:注意:串表达式中mychar是变量 注意:数值表达式中num...

qq_42453950的博客 3312

解析js代码,正则表达式

var template = function(tpl, data) { var re = /{{(.+?)}}/g, cursor = 0, reExp = /(^( )?(var|if|for|else|switch|case|break|{|}|;))(.*)?/g, code = 'var r=[];\n'; // 解析html functio

blackberry的博客 2892
上一篇: 180203 类型、值和变量
下一篇: 180309 语句
simpleone_
博客等级 码龄9年 14粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值