js

自动化脚本和微服务都使用js语言,是我们自己实现的一个标准ECMAScript(JavaScript)的子集,比标准JavaScript简单很多,没有编程基础的同学也能很快掌握;支持标准JavaScript函数库;支持多线程并发编程,在线编辑、动态部署并立即生效。

1.例子(可直接运行)

启动微信并滚动微信页面(点击展开)
function main() {
    // 启动微信
    var ret = launchApp('com.tencent.mm', 'txt*:微信', {maxStep: 40, afterWait: 2000});
    if (1 == ret) {
        console.log('进入微信成功');
        var index = 0;
        /* 滚动三次微信 */
        while (index < 3) {
            scroll('up', {distance: Math.random() * 0.5 + 0.45, duration: parseInt(Math.random() * 200 + 300), afterWait: 2000});
            ++index;
            console.log('滚动:' + index);
        }
        console.log('任务结束,退出');
    } else {
        console.log('启动微信失败');
    }
}
                            

2.数据类型及常量

类型名 说明
number 包括整型,和浮点型,例:整型常量 12,浮点型 3.4。
boolean 支持常量true,false,分别表示真和假,用于if语句的条件表达式。
string 字符串常量用''或""表示,例:'hello'。支持模版字符串,用``(两个反引号)表示,可以嵌入变量,例:`hello ${name}`,在执行过程中会动态解析字符串值。
array json数组类型,用[]创建json数组,可以用[]操作符访问数组,第一个元素从0开始,依此类推。注意:数组支持负索引,比如arr[-1]表示取arr的最后一个元素,-2表示倒数第二个元素,依次类推。例:var arr =['z', 12];var a=arr[-1];var b = arr[0];。
object json对象类型,其本质是键值对,用{}创建json对象,可以用.和[]操作符访问属性。例:var obj = {name:'a', value:12};var a = obj.name; var b = obj['name'];。

3.运算符

运算符用于赋值、比较值、执行算术运算等。
类型 运算符
算数运算符 +、-、*、/、%、++、--
比较运算符 >、>=、<、<=、!=、==(注意这里取消了繁杂的===和!==)
逻辑运算符 &&、||、!
赋值运算符 =、+=、-=、*=、/=、%=
字符串运算符 +、+=
三元运算符 ?:
其他运算符 typeof、delete、new
下表从最高到最低的优先级列出js运算符,具有相同优先级的运算符按从左至右的顺序求值。
运算符 说明
()、[]、. 函数调用以及表达式分组、数组访问、对象字段访问
++、--、!、delete、new、typeof 一元运算符,只有一个操作数
*、/、% 二元运算符,乘法、除法、取模
+、- 二元运算符,加法、减法
==、!= 二元运算符,等于、不等于
&& 二元运算符,逻辑与
|| 二元运算符,逻辑或
?: 三元运算符,条件
=、+=、*=... 二元运算符,赋值、运算赋值

4.语句

语句 说明
var 声明变量,变量必须先声明才能使用。例:var a = 1, b, c = 'demo';
表达式 表达式用于实现基本的计算。例:b = 1 + a * 5;
if(条件)、 else if(条件)、 else 根据条件执行语句块。例:if (a == 'str') {...} else if (a == 'hello') {...} else {...}
switch(条件) 根据条件选择一个语句块执行。例:switch (a) {case 1:break;}
for...of遍历 遍历可迭代对象,支持数组、对象、字符串等。例:for(var item of container){...}
for循环 循环。例:for(var i = 0; i < 10; ++i){...}
while(条件){} 条件为true时执行语句块。例:while(a < 10){...}
do{...}while(条件) 先执行语句块,再判断条件,若为true则继续执行语句块。例:do{...}while(a < 10)
function 函数声明,支持默认参数。例:function main(a = 1, b = 'hello'){...}
break 退出循环,用于逻辑控制。
continue 中断一次循环,并继续循环中的下一次迭代,用于逻辑控制。
return 停止执行函数并从该函数返回值,用于逻辑控制。
import 导入其他脚本,import 脚本名表达式,支持本地js文件,使用asset:前缀(在打包apk时添加的js文件),比如:import 'asset:temp.js';直接使用手机本地js文件,比如:import '/sdcard/temp.js';。例:import 'Xiaomi_runtime'; import 'asset:test.js';

5.脚本特性

变量必须先声明才能使用。例:var a = 10;。
支持//和/**/注释。
if、for、while、do-while等,即使仅有一条子语句也必须使用{}。
不支持匿名函数和闭包,但支持自定义函数赋值给变量或作为函数参数传递。
暂不支持位运算。
不支持===、!==,直接统一使用==、!=,简化使用。
支持函数默认参数。
支持import语句,导入脚本。注意:可以使用user.scriptName来访问一个团队内部其他成员的脚本。
支持模版字符串。
新增编译指令:__global、__permanent、__day(仅用于移动端脚本),用于 var后,分别表示声明全局变量,持久变量和day变量,全局变量可以在多个模块间共享,可以在不同线程间通信,例:var __global text;持久变量永久存在,在当前脚本文件可见,除非卸载程序;day变量作用域为一天,在当前脚本文件可见,每天0点day变量复位为初始值。
默认main函数为入口函数,外部可以传递参数给main函数,main返回值为脚本的返回值,可以使用callScript函数可以调用其他脚本。
支持系统事件回调,cbNotification(textList, className, packageName, rawEvent)、cbWindowChange(textList, className, packageName, rawEvent)、cbMessage(msgId, param1...),开发者可以在脚本中定义这三个函数,当系统收到通知消息或窗口改变事件后,会自动调用回调函数。注意事件回调函数和main函数不在一个线程中执行,可以通过__global变量来进行通信。

6.系统内置常量

系统内置常量以rs开头,可以直接在脚本中使用。
常量名 类型 说明
rsCurPackageName string 当前app的包名(仅用于移动端端脚本)
rsCurWindowClassName string 当前的窗口的类名(仅用于移动端端脚本)
rsScreenWidth integer 屏幕宽,单位像素(仅用于移动端端脚本)
rsScreenHeight integer 屏幕高,单位像素(仅用于移动端端脚本)
rsDensity float 屏幕密度 dp和px转换公式:px=dp*rsDensity(仅用于移动端端脚本)
rsUsername string 登录当前设备的用户名(仅用于移动端端脚本)
rsPhoneNumber string 当前设备的电话号码(仅用于移动端端脚本)
rsWX string 当前设备的微信名(仅用于移动端端脚本,仅供联系用)
rsDeviceName string 当前设备名(仅用于移动端端脚本)
rsUUID string 当前设备的uuid(仅用于移动端端脚本)
rsOpenId string 当前用户的openId(仅用于后端脚本)
rsIsDev boolean 当前是否处于调试状态(仅用于后端脚本)