小程序脚本语言——SJS 语法参考

SJS(safe/subset javascript) 是小程序的一套脚本语言,结合 tyml,可以构建出页面的结构。

注意事项

  1. SJS 的运行环境和其他 JavaScript 代码是隔离的,SJS 中不能调用其他 JavaScript 文件中定义的函数,也不能调用小程序提供的 API
  2. SJS 与 JavaScript 在语法上并不和 JavaScript 完全一致。
  • SJS 模块
  • 变量
  • 注释
  • 运算符
  • 语句
  • 数据类型
  • 基础类库
  • 事件响应

SJS 模块

SJS 代码可以编写在 tyml 文件中的 <sjs> 标签内,或以 .sjs 为后缀名的文件内,每一个 .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,
};

require 函数

在 .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);
<!-- /page/index/index.tyml -->
<sjs src="./b.sjs" module="b" />

控制台输出:

hello tuya

<sjs> 标签
属性名类型默认值说明
modulestring当前 <sjs> 标签的模块名。必填字段。
srcstring引用 .sjs 文件的相对路径。仅当本标签为单闭合标签或标签的内容为空时有效。

module 属性

module 属性是当前 <sjs> 标签的模块名。在单个 tyml 文件内,建议其值唯一。有重复模块名则按照先后顺序覆盖(后者覆盖前者)。不同文件之间的 sjs 模块名不会相互覆盖。

module 属性值的命名必须符合下面两个规则:

首字符必须是:字母 (a-zA-Z),下划线(_) 剩余字符可以是:字母(a-zA-Z),下划线(_), 数字(0-9)

示例代码:

<!--tyml--><sjs module="foo">
var some_msg = "hello world";
module.exports = {msg : some_msg,
}
</sjs>
<view> {{foo.msg}} </view>

页面输出:

hello world

上面例子声明了一个名字为 foo 的模块,将 some_msg 变量暴露出来,供当前页面使用。

src 属性

src 属性可以用来引用其他的 sjs 文件模块。

引用的时候,要注意如下几点:

  • 只能引用 .sjs 文件模块,且必须使用相对路径。
  • sjs 模块均为单例,sjs 模块在第一次被引用时,会自动初始化为单例对象。多个页面,多个地方,多次引用,使用的都是同一个 sjs 模块对象。
  • 如果一个 sjs 模块在定义之后,一直没有被引用,则该模块不会被解析与运行。

示例代码:

// /pages/index/index.jsPage({data: {msg: "'hello world' from js",},
});
<!-- /pages/index/index.tyml --><sjs src="./../comm.sjs" module="some_comms"></sjs>
<!-- 也可以直接使用单标签闭合的写法
<sjs src="./../comm.sjs" module="some_comms" />
--><!-- 调用 some_comms 模块里面的 bar 函数,且参数为 some_comms 模块里面的 foo -->
<view> {{some_comms.bar(some_comms.foo)}} </view>
<!-- 调用 some_comms 模块里面的 bar 函数,且参数为 page/index/index.js 里面的 msg -->
<view> {{some_comms.bar(msg)}} </view>

页面输出:

'hello world' from comm.sjs
'hello world' from js

上述例子在文件 /page/index/index.tyml 中通过 <sjs> 标签引用了 /page/comm.sjs 模块。

注意事项

<sjs> 模块只能在定义模块的 tyml 文件中被访问到。使用 <include> 或 <import> 时,<sjs> 模块不会被引入到对应的 tyml 文件中。 <template> 标签中,只能使用定义该 <template> 的 tyml 文件中定义的 <sjs> 模块。

变量

SJS 中的变量均为值的引用。

语法规则
  • var 与 JavaScript 中表现一致,会有变量提升。
  • 支持 const 与 let,与 JavaScript 表现一致。
  • 只声明变量而不赋值,默认值为 undefined。
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 一致。

语句

if 语句

在 .sjs 文件中,可以使用以下格式的 if 语句 :

  • if (expression) statement : 当 expression 为 true 时,执行 statement。
  • if (expression) statement1 else statement2 : 当 expression 为 true 时,执行 statement1。 否则,执行 statement2。
  • if ... else if ... else statementN 通过该句型,可以在 statement1 ~ statementN 之间选其中一个执行。

示例语法:

// if ...
if (表达式) 语句;
if (表达式) 语句;
if (表达式) {代码块;
}
// if ... else
if (表达式) 语句;
else 语句;
if (表达式) 语句;
else 语句;
if (表达式) {代码块;
} else {代码块;
}
// if ... else if ... else ...
if (表达式) {代码块;
} else if (表达式) {代码块;
} else if (表达式) {代码块;
} else {代码块;
}

switch 语句

示例语法:

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 (语句; 语句; 语句) 语句;
for (语句; 语句; 语句) {代码块;
}
  • 支持使用 breakcontinue 关键词。

示例代码:

for (var i = 0; i < 3; ++i) {console.log(i);if (i >= 1) break;
}

输出:

0
1

while 语句

示例语法:

while (表达式) 语句;
while (表达式) {代码块;
}
do {代码块;
} while (表达式);
  • 当 表达式 为 true 时,循环执行 语句 或 代码块
  • 支持使用 breakcontinue 关键词。

数据类型

SJS 目前支持的数据类型​​​​​​​、判断类型的方式与 JavaScript 相同。

  • 值类型(基本类型):字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol
  • 引用数据类型:对象(Object)、数组(Array)、函数(Function)。

基础类库

SJS 目前支持的基础类库与 JavaScript 相同。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/656055.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

那些年与指针的情仇(二)---二级指针指针与数组的那点事函数指针

关注小庄 顿顿解馋(&#xff61;&#xff65;∀&#xff65;)&#xff89;&#xff9e; 欢迎回到我们的大型纪录片《那些年与指针的爱恨情仇》&#xff0c;在本篇博客中我们将继续了解指针的小秘密&#xff1a;二级指针&#xff0c;指针与数组的关系以及函数指针。请放心食用&a…

【AI量化分析】小明在量化中使用交叉验证原理深度分析解读

进行交叉验证好处 提高模型的泛化能力&#xff1a;通过将数据集分成多个部分并使用其中的一部分数据进行模型训练&#xff0c;然后使用另一部分数据对模型进行测试&#xff0c;可以确保模型在未见过的数据上表现良好。这样可以降低模型过拟合或欠拟合的风险&#xff0c;提高模…

浅谈MySQL3种日志

浅谈MySQL3种日志 日志是mysql数据库的重要组成部分&#xff0c;记录着数据库运行期间各种状态信息。mysql日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。作为开发&#xff0c;我们重点需要关注的是二进制日志(binlog)和事务日志(包括redo log和un…

Qt|QPushButton控件讲解

前提 按钮分为了四种状态&#xff1a;常态、聚焦、按下、禁用 前一段时间更新了MFC框架下CButton的自绘。因为MFC框架下的按钮限制性很高&#xff0c;所以只能由自绘实现各种风格&#xff0c;但是QT框架完美的解决了这个问题&#xff0c;我们只需要了解如何调用&#xff0c;就…

springboot 个人网盘系统 java web网盘文件分享系统 web在线云盘

springboot 个人网盘系统 java web网盘文件分享系统 web在线云盘 开发工具&#xff1a;Eclipse/idea Java开发环境&#xff1a;JDK8.0 Web服务器:Tomcate9.0。 数据库&#xff1a;MySQL数据库。 技术框架&#xff1a;Struts2SpringHibernate和JSP 有详细的源码&#xff0…

MySQL 函数参考手册

目录 MySQL 字符串函数 MySQL 数值函数 MySQL 日期函数 MySQL 高级函数 MySQL 字符串函数 函数描述ASCII返回特定字符的 ASCII 值CHAR_LENGTH返回字符串的长度&#xff08;以字符为单位&#xff09;CHARACTER_LENGTH返回字符串的长度&#xff08;以字符为单位&#xff09;…

【机器学习前置知识】隐变量

隐变量又称潜变量&#xff0c;顾名思义就是隐藏着的随机变量&#xff0c;它不能通过观测来得到&#xff0c;或者说它产生的过程是不可观测的&#xff0c;然而它却可以在潜移默化中影响可观测变量。 我们用抛硬币为例来解释什么是隐变量。假设有 A 、 B 、 C A、B、C A、B、C …

使用nginx对视频、音频、图片等静态资源网址,加token签权

目前很多静态资源,都可以无权限验证,进行访问或转发,对有价值的资源进行签权,限制转发无法在代码中实现拦截,我们可以使用nginx对视频、音频、图片等静态资源网址,加token签权 如: http://192.168.1.22/123.mp3 http://192.168.1.22/123.m3u8 http://192.168.1.22/1…

十一、C++核心编程(1)内存分区模型

本阶段主要针对面向对象程技术做详细讲解&#xff0c;探讨C中的核心和精髓。 一、内存分区模型 1、C程序在执行时&#xff0c;将内存大方向划分为4个区域&#xff1a; 代码区:存放函数体的二进制代码&#xff0c;由操作系统进行管理的全局区:存放全局变量和静态变量以及常量…

qt5-入门

参考&#xff1a; qt学习指南 Qt5和Qt6的区别-CSDN博客 Qt 学习之路_w3cschool Qt教程&#xff0c;Qt5编程入门教程&#xff08;非常详细&#xff09; 本地环境&#xff1a; win10专业版&#xff0c;64位 技术选择 Qt5力推QML界面编程。QML类似HTML&#xff0c;可以借助CSS进…

【超详细教程】GPT-SoVITs从零开始训练声音克隆教程(主要以云端AutoDL部署为例)

目录 一、前言 二、GPT-SoVITs使用教程 2.1、Windows一键启动 2.2、AutoDL云端部署 2.3、人声伴奏分离 2.4、语音切割 2.5、打标训练数据 2.6、数据集预处理 2.7、训练音频数据 2.8、推理模型 三、总结 一、前言 近日&#xff0c;RVC变声器的创始人&#xff08;GitH…

Linux——Ubuntu安装MySQL并设置远程登录

1、安装mysql8.0.35 1.更新包列表&#xff0c;首先&#xff0c;确保您的系统已更新到最新状态。运行以下命令来更新包列表和安装最新的软件包&#xff1a; sudo apt update sudo apt upgrade2.安装MySQL服务器&#xff1a;运行以下命令来安装MySQL服务器&#xff1a; sudo a…

【C++】this指针

this指针&#xff01; 目录 this指针的引出&#xff1a;从C语言中理解this指针&#xff1a; this指针的特性&#xff1a;练习&#xff1a; this指针的引出&#xff1a; 我们知道&#xff0c;类中的成员函数是有专门的存放区&#xff1a;公共代码区&#xff0c;这也就意味着我…

方案:将vue项目放在SpringMVC中,并用tomcat访问

需要先将项目生成一次war包才能访问项目的webapp文件夹下的资源&#xff0c;否则tomcat的webapp文件夹下面不会生成对应资源文件夹就无法访问。 问题&#xff1a;目录如下&#xff1a; 今天我测试了一下将vue打包后&#xff0c;放入webapp下面访问&#xff0c;却发现vue项目无…

第九节HarmonyOS 常用基础组件13-TimePicker

1、描述 时间选择组件&#xff0c;根据指定参数创建选择器&#xff0c;支持选择小时以及分钟。默认以24小时的时间区间创建滑动选择器。 2、接口 TimePicker(options?: {selected?: Date}) 3、参数 selected - Date - 设置选中项的时间。默认是系统当前的时间。 4、属性…

软件工程学科的本质

软件工程学科的本质是分析与设计&#xff0c;是画图&#xff0c;是进行软件架构设计&#xff0c;进行进行软件项目管理。而非写代码。 分析有结构化分析&#xff0c;面向对象分析法&#xff0c;都用图来描述表达。 设计有结构化设计&#xff0c;面向对象设计法&#xff0c;都…

云计算运维 · 第三阶段 · git

学习b记 第三阶段 三、持续集成 1、git #安装 yum -y install git[rootgit-git ~]# git config –-global user.name "qxl" # 配置git使用用户 [rootgit-git ~]# git config –-global user.email "qxlmail.com" # 配置git使用邮箱 [rootgit-git ~]# g…

面试题 02.07. 链表相交(力扣LeetCode)

文章目录 面试题 02.07. 链表相交题目描述解题思路c代码优化后c代码 面试题 02.07. 链表相交 题目描述 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c1 …

java代码中直接调用存储过程

开启数据库语句批处理 url: jdbc:mysql://192.168.0.xxx:3306/xxx?useSSLfalse&useUnicodetrue&characterEncodingutf-8&zeroDateTimeBehaviorCONVERT_TO_NULL&serverTimezoneUTC&allowMultiQueriestrue 重点&#xff1a; allowMultiQueriestrue mysql…