aardio 文档

数据类型

aardio 数据类型

数据类型转换 #

显式类型转换

aardio 提供以下转换类型的函数

示例:

//转换一个变量为数字,如果失败返回 null 空值
var n = tonumber( "2" );

//转换一个变量为字符串,如果失败返回 null 空值
var str = tostring( 2 );

//转换为指针,如果失败返回 null 空值
var ptr = topointer( 123 );

另外,使用2个逻辑非操作符可以将任何值转换为布尔值,例如:

var num = !!0; 

隐式数据类型转换 #

aardio 也允许数据类型自动转换,规则如下:

  1. 在逻辑运算中,非 0. 非 null、非 false 值为 true,反之为 false。

  2. 使用 等式运算符 比较 2 个值时:

  3. 在算术运算、以及 math 库函数里无特别说明的数值参数都支持字符串自动转换为数值,转换失败则抛出异常。其他内置库、标准库函数一般都支持字符串自动转换为数值,有特别说明或对参数类型有特别要求的除外。

    字符串在自动转换为数值时,忽略首尾空白字符,空白字符串会转换为 0,而 tonumber 函数会将空白字符串转换为 null。而且 tonumber 函数会调用 _tonumber 元方法,但自动转换数据类型时并不会调用 _tonumber 元方法。

    示例:

    import console; 
    console.log( ("") + ('\r\n\t ') + 0 ); //显示 0
    console.log( tonumber("") === null ); //显示 true
    console.pause(true);
    

    通常用于检测参数类型的函数会明确区分字符串与数值,例如 math.isInteger() 函数。 检测与区分参数类型的原生 API 函数、COM 函数也会明确区分字符串与数值。

  4. 在字符串连接操作时,数值会自动转换为字符串。

    要特别注意字符串的字面值两侧的 + 会自动转换为 ++。
    例如 "1" + 0 会自动转换为 "1" ++ 0 做字符串连接操作,但 ("1") + 0 会执行加法运算。

函数参数或对象属性的类型转换

除非文档有特别说明,函数参数(或对象属性)应使用准确的类型。

少量函数(或对象属性)会支持可兼容的类型转换 —— 如果文档没有特别说明这一点,调用者不应当依赖这种转换(除非函数文档中有明确说明支持相应转换)。

过多地依赖类型转换是不必要的 —— 使用准确的类型是更好的选择。

原生数据类型中的类型转换

请参考:

使用 type 函数获取数据类型 #

  1. 函数原型:

    var dataType[,structType][,metaType] = type( any )

  2. 函数说明:

    type 函数返回对象的基本数据类型 dataType。
    如果对象是一个 struct 结构体,则返回结构体类型 structType。
    如果对象在元表中指定了 _type 字段的值,则返回元类型 metaType。

    aardio 用字符串描述类型,所以返回的类型都是字符串,
    如果没有任何参数,type 函数无返回值( 也就是返回 null 值 )。

  3. 调用示例:

    import console;
    
    //显示null , null
    console.log( type(null) , type.null );
    
    //显示 string , string
    console.log( type("Hello world") , type.string );
    
    //显示 number , number
    console.log( type(1000) , type.number );
    
    //function , function
    console.log( type(console.log) , type.function );
    
    //显示 class , class
    console.log( type( class{} ) , type.class );
    
    //boolean , boolean
    console.log( type(true) , type.boolean );
    
    //显示 cdata , cdata
    console.log( type( io.stdin ) , type.cdata );
    
    //显示 table , table
    console.log( type( {x=0;y=0} ) , type.table );
    
    //显示 pointer , pointer
    console.log( type( topointer( 1 ) ) , type.pointer );
    
    console.pause();
    

使用 type.eq 比较数据类型

  1. 函数原型:

    var eq = type.eq( obj,obj2 )

  2. 函数说明:

    比较参数 obj、参数 obj2 的类型、元类型、struct类型,如果完全相等返回true,否则返回false。

    请注意在 aardio 中如果一个函数说明会返回布尔值( true,false) ,如果未加特别说明则允许返回任何可自动转换为布尔值的其他数据类型的值。 例如 type.eq() 可能会返回 null 值以替代 false,aardio 中的函数说明不再重复说明此类自动类型转换规则。

  3. 调用示例:

    import console;
    import time.ole;
    
    var tmOle = time.ole();
    var tm = time();
    
    //type.eq 严格比较所有类型(基础类型、元类型、struct类型)
    if( type.eq( tmOle,tm ) ){
        console.log("tmOle,tm 类型相同")
    }
    else{
        console.log("tmOle,tm 类型不相同")
    }
    
    //time.istime 不比较元类型,因此兼容 oletime
    console.log( "是 time 对象吗?",time.istime(tmOle) )
    
    console.pause();
    

Markdown 格式