aardio 文档

等式运算符

等式运算符比较两个操作数是否相等,并返回 boolean 类型的值(true 或 false)。

一. 全等式运算符 #

全等式又称为严格等式(Strict Equality),要求数据类型绝对相等(不执行隐式类型转换)、并且不会调用 _eq 元方法。因此也不能重载全等操作符。

运算符 说明
=== 全等
!== 不全等

如果是数字,字符串,指针,布尔值,在值与类型都相等时全等式返回真,返则返回假.
如果是其他传址对象,指向同一个对象返回真,否则返回假.

示例 结果
"abc" === "abc" true
null === false false

二. 等式运算符 #

等式运算符宽松比较(支持隐式类型转换)两个操作数是否相等。

运算符 说明
== 相等
!= 不相等

在无歧义时等式中的 = 被误为笔误并自动修正为 == ,这种替代写法是不推荐的,任何时候都应当明确区分 == 或 = 。 在表或数组构造器中分隔名值对的 = (例如 var array = [length=4] )不会被解析为 ==。

func( "键名"="值" ) 这种写法所传的函数参数是一个省略外层 {} 的表参数,而 func( "字符串1"=="字符串2" ) 这种写法所传的参数则是一个返回布尔值的等式。

全等与不全等操作符(=== 或 !==)不会执行隐式类型转换。 而等式与不等式允许类型自动转换,类型转换规则如下:

  1. 逻辑等式/不等式(Logical Equality): 任意值与 true,false 比较则先转换为布尔值。 #

    aardio 在条件上下文(逻辑操作符、逻辑等式与不等式、条件判断语句)中隐式转换类型的规则:

  2. 数值等式/不等式(Numeric Equality):非布尔值与数值比较,则先转换为数值,然后比较数值是否相等。 #

    例如 null == 0 就属于非布尔值与数值比较,而 null 转换为数值还是 null,null 与 0 不是相等的数值。所以 null == 0 会返回 false 。 再例如 ""== 0 或 ' \t\r\n'== 0 同样属于非布尔值与数值比较,空白字符串自动转换为数值时返回 0,所以 ""== 0 或 ' \t\r\n'== 0 都会返回 true。

    当等式或不等式的操作数中只有数值而没有出现布尔值,就不应当错误地根据条件上下文的规则去推导结果。

请参考: 隐式类型转换

1. 操作数的数据类型相同之间的等式比较规则

对于数值( type.number )、字符串( type.string )、指针( type.pointer ),布尔值( type.boolean )等传值类型比较值是否相等。

示例 结果
"abc" == "abc" true
123 != 456 true

对于 table、cdata、bufffer 等传引用类型,当引用同一个对象时相等。否则检查参考比较的两对象是否存在相同的 _eq 元方法 ,如果存在就调用 _eq 元方法判断是否相等。如果操作数不是同一个对象且没有相同的 _eq 元方法则不相等。

示例 结果 说明
::User32 != ::Kernel32 true 引用了不同的对象
{} == {} false 引用了不同的对象
raw.buffer("abc")==raw.buffer("abc") false 引用了不同的对象
time.now() == time.now() true 调用time.now()._eq元方法比较

2. 非布尔值与布尔值之间的等式比较规则

0, null 与 false 相等,而所有非零、非 false、非 null 值与 true 相等。

表达式 结果
0==false true
null==false true
1==false false
if( 1 ) console.log("true") 条件符合,执行代码 console.log("true")

3. 非布尔非数字值与数字值之间的等式比较规则

非布尔非数字值与数值比较,则先转换为数值,然后比较数值是否相等。 要注意字符串在自动转换为数值时,空白字符串会转换为 0,转换忽略 _tonumber 元主法。

表达式 结果
"123"==123 true
"abc"==123 false
""==0 true
'\r\n\t '==0 true
null==0 false

4. 其他不同类型的操作数之间的等式比较规则

如果数据类型不同、会尝试进行类型转换后进行比较。如果类型转换失败、也无适合的 _eq 元方法可以调用则返回 false。

Markdown 格式