SJS(safe/subset javascript)
是小程序的一套脚本语言,结合 tyml
,可以构建出页面的结构。
SJS
的运行环境和其他 JavaScript
代码是隔离的,SJS
中不能调用其他 JavaScript
文件中定义的函数,也不能调用小程序提供的 API
。SJS
与 JavaScript
在语法上并不和 JavaScript
完全一致。SJS
代码可以编写在 tyml
文件中的
标签内,或以 .sjs
为后缀名的文件内,每一个 .sjs
文件和
标签都是一个单独的模块。每个模块都有自己独立的作用域。即在一个模块里面定义的变量与函数,默认为私有的,对其他模块不可见。
一个模块要想对外暴露其内部的私有变量与函数,可以通过模块化语法 module.exports
export default
exports
导出。
export const message = 'hello tuya';
export const getMsg = (x) => x;
// export default
export default {
message,
getMsg,
};
// module.exports
module.exports = {
message,
getMsg,
};
在 .sjs
模块中引用其他 sjs
文件模块,可以使用 require
函数。
引用的时候,要注意如下几点:
.sjs
文件模块,且必须使用相对路径。sjs
模块均为单例,sjs
模块在第一次被引用时,会自动初始化为单例对象。多个页面,多个地方,多次引用,使用的都是同一个 sjs
模块对象。sjs
模块在定义之后,一直没有被引用,则该模块不会被解析与运行。示例代码
// /a.sjs
export const message = 'hello tuya';
// /b.sjs
var a = require('./a.sjs');
console.log(a.message);
控制台输出:
hello tuya
标签属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
module | string | 当前 标签的模块名。必填字段。 |
|
src | string | 引用 .sjs 文件的相对路径。仅当本标签为单闭合标签或标签的内容为空时有效。 |
module
属性是当前
标签的模块名。在单个 tyml
文件内,建议其值唯一。有重复模块名则按照先后顺序覆盖(后者覆盖前者)。不同文件之间的 sjs
模块名不会相互覆盖。
module
属性值的命名必须符合下面两个规则:
首字符必须是:字母 (a-zA-Z)
,下划线(_)
剩余字符可以是:字母(a-zA-Z)
,下划线(_)
, 数字(0-9)
示例代码:
var some_msg = "hello world";
module.exports = {
msg : some_msg,
}
{{foo.msg}}
页面输出:
hello world
上面例子声明了一个名字为 foo
的模块,将 some_msg
变量暴露出来,供当前页面使用。
src
属性src
属性可以用来引用其他的 sjs
文件模块。
引用的时候,要注意如下几点:
sjs
文件模块,且必须使用相对路径。sjs
模块均为单例,sjs
模块在第一次被引用时,会自动初始化为单例对象。多个页面,多个地方,多次引用,使用的都是同一个 sjs
模块对象。sjs
模块在定义之后,一直没有被引用,则该模块不会被解析与运行。示例代码:
// /pages/index/index.js
Page({
data: {
msg: "'hello world' from js",
},
});
{{some_comms.bar(some_comms.foo)}}
{{some_comms.bar(msg)}}
页面输出:
'hello world' from comm.sjs
'hello world' from js
上述例子在文件 /page/index/index.tyml
中通过
标签引用了 /page/comm.sjs 模块。
模块只能在定义模块的 tyml
文件中被访问到。使用
或
时,
模块不会被引入到对应的 tyml
文件中。 标签中,只能使用定义该
的
tyml
文件中定义的
模块。
SJS 中的变量均为值的引用。
var num = 1;
var str = 'hello tuya';
var undef; // undef === undefined
const n = 2;
let s = 'string';
变量命名必须符合下面两个规则:
(a-z,A-Z)
,下划线(_)
(a-z,A-Z)
,下划线(_)
,数字(0-9)
与 Javascript
语法规则一致
注释方法和 Javascript
一致,可以使用以下方法对 SJS
代码进行注释:
// page.sjs
// 方法一:这是一个单行注释
/*
方法二:这是一个多行注释
中间的内容都会被注释
*/
let h = 'hello';
const w = ' tuya';
var a = 10,
b = 20;
// 加法运算
console.log(30 === a + b); //true
// 减法运算
console.log(-10 === a - b); //true
// 乘法运算
console.log(200 === a * b); //true
// 除法运算
console.log(0.5 === a / b); //true
// 取余运算
console.log(10 === a % b); //true
加法 +
运算符可用作字符串拼接。
var a = 'hello',
b = ' tuya';
// 字符串拼接
console.log('hello tuya' === a + b); //true
var a = 10,
b = 20;
// 小于
console.log(true === a < b); //true
// 大于
console.log(false === a > b); //true
// 小于等于
console.log(true === a <= b); //true
// 大于等于
console.log(false === a >= b); //true
// 等号
console.log(false === (a == b)); //true
// 非等号
console.log(true === (a != b)); //true
// 全等号
console.log(false === (a === b)); //true
// 非全等号
console.log(true === (a !== b)); //true
var a = 10,
b = 20;
// 逻辑与
console.log(20 === (a && b)); //true
// 逻辑或
console.log(10 === (a || b)); //true
// 逻辑否,取反运算
console.log(false === !a); //true
var a = 10,
b = 20;
// 左移运算
console.log(80 === a << 3); //true
// 无符号右移运算
console.log(2 === a >> 2); //true
// 带符号右移运算
console.log(2 === a >>> 2); //true
// 与运算
console.log(2 === (a & 3)); //true
// 异或运算
console.log(9 === (a ^ 3)); //true
// 或运算
console.log(11 === (a | 3)); //true
var a = 10;
a = 10;
a *= 10;
console.log(100 === a); //true
a = 10;
a /= 5;
console.log(2 === a); //true
a = 10;
a %= 7;
console.log(3 === a); //true
a = 10;
a += 5;
console.log(15 === a); //true
a = 10;
a -= 11;
console.log(-1 === a); //true
a = 10;
a <<= 10;
console.log(10240 === a); //true
a = 10;
a >>= 2;
console.log(2 === a); //true
a = 10;
a >>>= 2;
console.log(2 === a); //true
a = 10;
a &= 3;
console.log(2 === a); //true
a = 10;
a ^= 3;
console.log(9 === a); //true
a = 10;
a |= 3;
console.log(11 === a); //true
var a = 10,
b = 20;
// 自增运算
console.log(10 === a++); //true
console.log(12 === ++a); //true
// 自减运算
console.log(12 === a--); //true
console.log(10 === --a); //true
// 正值运算
console.log(10 === +a); //true
// 负值运算
console.log(0 - 10 === -a); //true
// 否运算
console.log(-11 === ~a); //true
// 取反运算
console.log(false === !a); //true
// delete 运算
console.log(true === delete a.fake); //true
// void 运算
console.log(undefined === void a); //true
// typeof 运算
console.log('number' === typeof a); //true
var a = 10,
b = 20;
// 条件运算符
console.log(20 === (a >= 10 ? a + 10 : b + 10)); //true
var a = 10,
b = 20;
// 逗号运算符
console.log(20 === (a, b)); //true
SJS 运算符的优先级与 Javascript 一致。
在 .sjs 文件中,可以使用以下格式的 if 语句 :
示例语法:
// if ...
if (表达式) 语句;
if (表达式) 语句;
if (表达式) {
代码块;
}
// if ... else
if (表达式) 语句;
else 语句;
if (表达式) 语句;
else 语句;
if (表达式) {
代码块;
} else {
代码块;
}
// if ... else if ... else ...
if (表达式) {
代码块;
} else if (表达式) {
代码块;
} else if (表达式) {
代码块;
} else {
代码块;
}
示例语法:
switch (表达式) {
case 变量:
语句;
case 数字:
语句;
break;
case 字符串:
语句;
default:
语句;
}
default
分支可以省略不写。case
关键词后面只能使用:变量
,数字
,字符串
。示例代码:
var exp = 10;
switch (exp) {
case '10':
console.log('string 10');
break;
case 10:
console.log('number 10');
break;
case exp:
console.log('var exp');
break;
default:
console.log('default');
}
输出:
number 10
示例语法:
for (语句; 语句; 语句) 语句;
for (语句; 语句; 语句) {
代码块;
}
break
,continue
关键词。示例代码:
for (var i = 0; i < 3; ++i) {
console.log(i);
if (i >= 1) break;
}
输出:
0
1
示例语法:
while (表达式) 语句;
while (表达式) {
代码块;
}
do {
代码块;
} while (表达式);
表达式
为 true 时,循环执行 语句
或 代码块
。break
,continue
关键词。SJS
目前支持的数据类型、判断类型的方式与 JavaScript
相同。
String
)、数字(Number
)、布尔(Boolean
)、对空(Null
)、未定义(Undefined
)、Symbol
。Object
)、数组(Array
)、函数(Function
)。SJS
目前支持的基础类库与 JavaScript
相同。