WXS(WeiXin Script)是小程序的一套脚本语言,结合 WXML
,可以构建出页面的结构。
示例:
<wxs module="m1">
var msg = "hello world";
module.exports.message = msg;
wxs>
<view> {{m1.message}} view>
页面输出:
hello world
// page.js
Page({
data: {
array: [1, 2, 3, 4, 5, 1, 2, 3, 4]
}
})
<wxs module="m1">
var getMax = function(array) {
var max = undefined;
for (var i = 0; i < array.length; ++i) {
max = max === undefined ?
array[i] :
(max >= array[i] ? max : array[i]);
}
return max;
}
module.exports.getMax = getMax;
wxs>
<view> {{m1.getMax(array)}} view>
页面输出:
5
WXS 代码可以编写在 wxml 文件中的
标签内,或以 .wxs
为后缀名的文件内。
每一个 .wxs
文件和
标签都是一个单独的模块。
每个模块都有自己独立的作用域。即在一个模块里面定义的变量与函数,默认为私有的,对其他模块不可见。
一个模块要想对外暴露其内部的私有变量与函数,只能通过 module.exports
实现。
在微信开发者工具里面,右键可以直接创建 .wxs
文件,在其中直接编写 WXS 脚本。
示例代码:
// /pages/comm.wxs
var foo = "'hello world' from comm.wxs";
var bar = function(d) {
return d;
}
module.exports = {
foo: foo,
bar: bar
};
上述例子在 /pages/comm.wxs
的文件里面编写了 WXS 代码。该 .wxs
文件可以被其他的 .wxs
文件 或 WXML 中的
标签引用。
每个 wxs
模块均有一个内置的 module
对象。
exports
: 通过该属性,可以对外共享本模块的私有变量与函数。示例代码:
// /pages/tools.wxs
var foo = "'hello world' from tools.wxs";
var bar = function (d) {
return d;
}
module.exports = {
FOO: foo,
bar: bar,
};
module.exports.msg = "some msg";
<wxs src="./../tools.wxs" module="tools" />
<view> {{tools.msg}} view>
<view> {{tools.bar(tools.FOO)}} view>
页面输出:
some msg
'hello world' from tools.wxs
在.wxs
模块中引用其他 wxs
文件模块,可以使用 require
函数。
引用的时候,要注意如下几点:
.wxs
文件模块,且必须使用相对路径。wxs
模块均为单例,wxs
模块在第一次被引用时,会自动初始化为单例对象。多个页面,多个地方,多次引用,使用的都是同一个 wxs
模块对象。wxs
模块在定义之后,一直没有被引用,则该模块不会被解析与运行。示例代码:
// /pages/tools.wxs
var foo = "'hello world' from tools.wxs";
var bar = function (d) {
return d;
}
module.exports = {
FOO: foo,
bar: bar,
};
module.exports.msg = "some msg";
// /pages/logic.wxs
var tools = require("./tools.wxs");
console.log(tools.FOO);
console.log(tools.bar("logic.wxs"));
console.log(tools.msg);
<wxs src="./../logic.wxs" module="logic" />
控制台输出:
'hello world' from tools.wxs
logic.wxs
some msg
标签属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
module | String | 当前 标签的模块名。必填字段。 |
|
src | String | 引用 .wxs 文件的相对路径。仅当本标签为单闭合标签或标签的内容为空时有效。 |
module 属性是当前
标签的模块名。在单个 wxml 文件内,建议其值唯一。有重复模块名则按照先后顺序覆盖(后者覆盖前者)。不同文件之间的 wxs 模块名不会相互覆盖。
module 属性值的命名必须符合下面两个规则:
示例代码:
<wxs module="foo">
var some_msg = "hello world";
module.exports = {
msg : some_msg,
}
wxs>
<view> {{foo.msg}} view>
页面输出:
hello world
上面例子声明了一个名字为 foo
的模块,将 some_msg
变量暴露出来,供当前页面使用。
src 属性可以用来引用其他的 wxs
文件模块。
引用的时候,要注意如下几点:
.wxs
文件模块,且必须使用相对路径。wxs
模块均为单例,wxs
模块在第一次被引用时,会自动初始化为单例对象。多个页面,多个地方,多次引用,使用的都是同一个 wxs
模块对象。wxs
模块在定义之后,一直没有被引用,则该模块不会被解析与运行。示例代码:
// /pages/index/index.js
Page({
data: {
msg: "'hello wrold' from js",
}
})
<wxs src="./../comm.wxs" module="some_comms">wxs>
<view> {{some_comms.bar(some_comms.foo)}} view>
<view> {{some_comms.bar(msg)}} view>
页面输出:
'hello world' from comm.wxs
'hello wrold' from js
上述例子在文件 /page/index/index.wxml
中通过
标签引用了 /page/comm.wxs
模块。
模块只能在定义模块的 WXML 文件中被访问到。使用
或
时,
模块不会被引入到对应的 WXML 文件中。
标签中,只能使用定义该
的 WXML 文件中定义的
模块。undefined
。var foo = 1;
var bar = "hello world";
var i; // i === undefined
上面代码,分别声明了 foo
、 bar
、 i
三个变量。然后,foo
赋值为数值 1
,bar
赋值为字符串 "hello world"
。
变量命名必须符合下面两个规则:
以下标识符不能作为变量名:
delete void typeof null undefined NaN Infinity var if else true false require
this function arguments return for while do break continue switch case default
WXS 主要有 3 种注释的方法。
示例:
<wxs module="sample">
// 方法一:单行注释
/*
方法二:多行注释
*/
/*
方法三:结尾注释。即从 /* 开始往后的所有 WXS 代码均被注释
var a = 1;
var b = 2;
var c = "fake";
wxs>
基本运算符、一元运算符、位运算符、比较运算符、等值运算符、赋值运算符、二元逻辑运算符、其他运算符
优先级 | 运算符 | 说明 | 结合性 |
---|---|---|---|
20 | ( ... ) |
括号 | n/a |
19 | ... . ... |
成员访问 | 从左到右 |
... [ ... ] |
成员访问 | 从左到右 | |
... ( ... ) |
函数调用 | 从左到右 | |
17 | ... ++ |
后置递增 | n/a |
... -- |
后置递减 | n/a | |
16 | ! ... |
逻辑非 | 从右到左 |
~ ... |
按位非 | 从右到左 | |
+ ... |
一元加法 | 从右到左 | |
- ... |
一元减法 | 从右到左 | |
++ ... |
前置递增 | 从右到左 | |
-- ... |
前置递减 | 从右到左 | |
typeof ... |
typeof | 从右到左 | |
void ... |
void | 从右到左 | |
delete ... |
delete | 从右到左 | |
14 | ... * ... |
乘法 | 从左到右 |
... / ... |
除法 | 从左到右 | |
... % ... |
取模 | 从左到右 | |
13 | ... + ... |
加法 | 从左到右 |
... - ... |
减法 | 从左到右 | |
12 | ... << ... |
按位左移 | 从左到右 |
... >> ... |
按位右移 | 从左到右 | |
... >>> ... |
无符号右移 | 从左到右 | |
11 | ... < ... |
小于 | 从左到右 |
... <= ... |
小于等于 | 从左到右 | |
... > ... |
大于 | 从左到右 | |
... >= ... |
大于等于 | 从左到右 | |
10 | ... == ... |
等号 | 从左到右 |
... != ... |
非等号 | 从左到右 | |
... === ... |
全等号 | 从左到右 | |
... !== ... |
非全等号 | 从左到右 | |
9 | ... & ... |
按位与 | 从左到右 |
8 | ... ^ ... |
按位异或 | 从左到右 |
7 | ... | ... |
按位或 | 从左到右 |
6 | ... && ... |
逻辑与 | 从左到右 |
5 | ... || ... |
逻辑或 | 从左到右 |
4 | ... ? ... : ... |
条件运算符 | 从右到左 |
3 | ... = ... |
赋值 | 从右到左 |
... += ... |
赋值 | 从右到左 | |
... -= ... |
赋值 | 从右到左 | |
... *= ... |
赋值 | 从右到左 | |
... /= ... |
赋值 | 从右到左 | |
... %= ... |
赋值 | 从右到左 | |
... <<= ... |
赋值 | 从右到左 | |
... >>= ... |
赋值 | 从右到左 | |
... >>>= ... |
赋值 | 从右到左 | |
... &= ... |
赋值 | 从右到左 | |
... ^= ... |
赋值 | 从右到左 | |
... |= ... |
赋值 | 从右到左 | |
0 | ... , ... |
逗号 | 从左到右 |
在 WXS 中,可以使用以下格式的 if
语句 :
if (expression) statement
: 当 expression
为 truthy 时,执行 statement
。
if (expression) statement1 else statement2
: 当 expression
为 truthy 时,执行 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 (表达式) {
case 变量:
语句;
case 数字:
语句;
break;
case 字符串:
语句;
default:
语句;
}
default
分支可以省略不写。case
关键词后面只能使用:变量
,数字
,字符串
。示例语法:
for (语句; 语句; 语句)
语句;
for (语句; 语句; 语句) {
代码块;
}
break
,continue
关键词。示例语法:
while (表达式)
语句;
while (表达式){
代码块;
}
do {
代码块;
} while (表达式)
表达式
为 true 时,循环执行语句
或代码块
。break
,continue
关键词。WXS 语言目前共有以下几种数据类型:
number
: 数值string
:字符串boolean
:布尔值object
:对象function
:函数array
: 数组date
:日期regexp
:正则console.log
方法用于在 console 窗口输出信息。它可以接受多个参数,将它们的结果连接起来输出。
属性 |
方法 |
|
|
stringify(object)
: 将 object
对象转换为 JSON
字符串,并返回该字符串。parse(string)
: 将 JSON
字符串转化成对象,并返回该对象。示例代码:
console.log(undefined === JSON.stringify());
console.log(undefined === JSON.stringify(undefined));
console.log("null"===JSON.stringify(null));
console.log("111"===JSON.stringify(111));
console.log('"111"'===JSON.stringify("111"));
console.log("true"===JSON.stringify(true));
console.log(undefined===JSON.stringify(function(){}));
console.log(undefined===JSON.parse(JSON.stringify()));
console.log(undefined===JSON.parse(JSON.stringify(undefined)));
console.log(null===JSON.parse(JSON.stringify(null)));
console.log(111===JSON.parse(JSON.stringify(111)));
console.log("111"===JSON.parse(JSON.stringify("111")));
console.log(true===JSON.parse(JSON.stringify(true)));
console.log(undefined===JSON.parse(JSON.stringify(function(){})));
MAX_VALUE
MIN_VALUE
NEGATIVE_INFINITY
POSITIVE_INFINITY
parse
UTC
now
NaN
Infinity
undefined
parseInt
parseFloat
isNaN
isFinite
decodeURI
decodeURIComponent
encodeURI
encodeURIComponent
ES5
标准