函数
函数
函数是可重用的代码块,通过调用函数名来执行特定任务。函数在定义之后可以多次调用,从而避免代码重复。vino
的函数声明和JavaScript完全相同。
语法
函数声明
通过 function
关键字来声明
function functionName(parameter1, parameter2) {
// 函数体
return parameter1 + parameter2;
}
函数表达式
函数也可以作为表达式赋值给变量。
const functionName = function (parameter1, parameter2) {
// 函数体
return parameter1 + parameter2;
};
箭头函数
箭头函数是一种更简洁的定义函数的语法
const functionName = (parameter1, parameter2) => {
// 函数体
return parameter1 + parameter2;
};
匿名函数
匿名函数是没有名称的函数,通常用作回调函数。
setTimeout(function () {
console.log('This is an anonymous function');
}, 1000);
函数参数
函数可以接受参数,这些参数在函数体内作为局部变量使用
function greet(name) {
return 'Hello, ' + name;
}
console.log(greet('Vino')); // 输出: Hello, Vino
可以在函数体内通过变量arguments
获取所有参数。
function greet() {
//["Hello","Vino"]
console.log(arguments);
}
console.log(greet("Hello", "Vino"));
返回值
函数可以使用 return 关键字返回值。如果没有 return 语句,函数返回 undefined。
function add(a, b) {
return a + b;
}
console.log(add(2, 3)); // 输出: 5
console.log(add(2)); // 输出: NaN,因为 b 是 undefined
函数作用域
函数内部声明的变量在函数外部是不可见的,这称为函数作用域
function example() {
let x = 10;
console.log(x); // 输出: 10
}
console.log(x); // 抛出 ReferenceError: x 未定义
Rest 参数
函数的形参前面的 ...
称为 Rest 参数,用于接收不定数量的参数并将它们打包为一个数组。Rest 参数让函数可以接收可变数量的参数,而无需手动定义所有参数。 当你在函数的参数列表中使用 ...
,它会将传入的剩余参数收集到一个数组中。Rest 参数必须是参数列表中的最后一个参数。
function test(a, b, ...args) {
console.log(args)
}
test(1, 2, 3, 4); // 输出:[3,4]
test(5, 10); // 输出:[]
内置函数
vino 提供了typeOf
、sleep
、setTimeout
、setInterval
、clearInterval
、valid
共6个内置函数,开发者无需声明,可以在任何地方直接调用。
typeOf
typeOf
可用来获取变量的类型。JavaScript
中用来获取类型的方式是使用type of
运算符,vino
并不支持type of
运算符,vino
提供了typeOf
函数来获取对象类型,它将JavaScript中typeof
和instanceof
的功能集成到1个函数中。
示例
let str = "hello vino";
let type = typeOf(str);
console.log(type);
// 输出:
// {
// type: 1,
// typeString: string,
// name: string,
// native: true,
// }
返回值
typeOf
返回值为一个对象,对象结构如下:
{
name: "",
//对象名
type: "",
//对象类型
native: true,
//是否原生
typeString: ""
//类型字符串表示
}
type
属性的取值范围:
null
空string
字符串int
整数float
浮点数boolean
布尔值bigint
大整数object
对象array
数组function
函数class
类
sleep
sleep()
函数可以让当前线程睡眠,这也是vino
多线程的一个重要标志。
语法
sleep(time?:int);
- time:线程睡眠的时间,单位:毫秒
当不传递time参数或time小于等于0时,线程将永久等待。
示例
//线程睡眠1000毫秒
sleep(1000);
//线程永久睡眠
sleep()
vino
中的sleep
函数参考了Java和Golang的设计思想:
- Java
Thread.sleep(1000);
- Golang
time.Sleep(1000 * time.Millisecond)
setTimeout
setTimeout
函数用于在指定的时间间隔之后执行一次指定的代码或函数的方法。它会在一定的延迟之后执行指定的代码块。
语法
setTimeout(callback, delay | Date, taskId);
- callback:要执行的函数或代码块。
- delay:延迟的时间,以毫秒为单位。
- Date:未来的一个时间对象
- taskId:可选的参数,用于标识定时任务的ID,如果不传,则会随机生成任务ID。
返回值
返回一个唯一的标识符(称为定时器 ID),可以用于在之后取消该定时器。
let taskId = setTimeout(function () {
console.log("xxx");
}, 1000);
clearInterval(taskId);
创建一个定时器,指定定时任务ID;如果该定时任务ID已存在,则返回undefined
。
let taskId = "11223344";
let taskId1 = setTimeout(function () {
console.log("xxx");
}, 1000, taskId);
// 此时,taskId = taskId1 = "11223344"
let taskId2 = setTimeout(function () {
console.log("xxx");
}, 1000, taskId);
// 此时,taskId2 为 undefined
clearInterval(taskId);
创建一个定时器,指定未来的时间执行。
// 未来的5秒钟
let newDate = new Date().add(5, "second");
let taskId2 = setTimeout(() => {
console.log('hello world', new Date());
}, newDate);
注意事项
setTimeout函数在执行回调函数时会开启一个子线程来执行。
setInterval
setInterval
函数用于周期性地重复执行指定的代码或函数的方法。它会在每隔一定的时间间隔之后执行一次指定的代码块,直到被取消或页面被关闭。
语法
setInterval(callback, delay | cron, taskId);
- callback:要重复执行的函数或代码块。
- delay:执行 callback 的时间间隔,以毫秒为单位。
- cron:cron表达式,用于指定定时任务的执行时间。
- taskId:可选的参数,用于标识定时任务的ID,如果不传,则会随机生成任务ID。
返回值
返回一个唯一的标识符(称为定时器 ID),可以用于在之后取消该定时器
示例
创建一个定时器,每隔1秒打印一次"xxx"
let timeoutID = setInterval(function () {
console.log("xxx");
}, 1000);
sleep(5000)
clearInterval(timeoutID);
创建一个定时器,使用cron表达式指定执行周期,每隔1秒打印一次"xxx";并指定任务ID。
let taskId = setInterval(() => {
console.log('hello world', new Date());
}, "* * * * * *", "112233445566778899");
console.log("taskId:", taskId); // 输出: taskId: 112233445566778899
clearInterval(taskId);
注意事项
setInterval函数在执行回调函数时会开启一个子线程来执行。
clearInterval
clearInterval()
函数用于清除由 setInterval()
和 setTimeout()
创建的定时器。
语法
clearInterval(taskId);
- taskId:用于标识定时任务的ID
返回值
boolean
值或者undefined
示例
创建一个定时器,系统返回的定时器ID
let taskId = setTimeout(function () {
console.log("xxx");
}, 1000);
let res = clearInterval(taskId);
console.log(res) // 输出true
let res1 = clearInterval(taskId);
console.log(res1) // 输出undefined
wait();
valid
valid
函数用于对object
中的属性值进行校验。
语法
valid(obj:object,rules:object,throw?:boolean):object;
参数
- obj:object 待校验的目标对象.(只支持对象)
- rules:object 校验规则对象。语法:
{key:[rule...]}
,其中key
为目标对象的属性名//校验目标对象 let obj={ name:"张三", age:15, } //校验规则 let rules={ age:[ {min:10,message:"年龄不能小于10岁"}, {max:100,message:"年龄不能大于100岁"} ], name:[ {notEmpty:true,message:"姓名不能为空"} ] }
- throw:boolean (可选) 校验失败后是否抛异常,默认:true
返回值
{
result: boolean,
//校验结果:true通过校验,false未通过校验
name: string,
//校验失败时,返回失败的字段名
rule: object
//校验失败时,返回失败的规则对象
}
//示例
{
result: false,
name: "age",
rule: {
parse: "int",
message: "类型转换错误"
}
}
支持的规则
- type:string 数据类型校验,支持:
string
、int
、float
、boolean
、null
、array
- parse:string 数据类型转换,支持:
string
、int
、float
、boolean
- notNull:boolean 不为null校验
- notEmpty:boolean 不为空校验,包括:
null
、undefied
、空字符串、制表符、回车换行 - min:int 最小长度或大小。当校验目标是
string
类型时,校验字符串长度;当校验目标为int时,校验数值大小 - max:int 最大长度或大小。当校验目标是
string
类型时,校验字符串长度;当校验目标为int时,校验数值大小 - pattern:RegExp 正则表达式对象
- in:[]any 校验数据是否在给定数组中存在
- default:any 如果校验失败,则修改对象中的属性值为默认值。
- message:string 校验失败提示
示例
//校验目标对象
let obj={
name:"张三",
age:4,
}
//校验规则
let rules={
age:[
{min:10,max:100,message:"年龄在10-100岁之间"},
],
name:[
{notNull:true,message:"不能为null"},
{type:"string",message:"姓名必须为字符串"},
{min:2,message:"姓名最小2个字符"},
{notEmpty:true,message:"姓名不能为空"},
{pattern:\hello\,message:"正则校验失败"}
]
}
try {
valid(obj, rules)
} catch (e) {
//当valid校验失败会抛出异常,异常message内容为rule中的message
console.log(e.message)
}
isEmpty
isEmpty
函数用于对任意值进行空值判定。
语法
isEmpty(...v: any[]):boolean;
参数
- v: 任何类型的数据,如果有多个值,其中任意一个为空,函数返回true
返回值
- boolean: 如果值为空,则返回true,否则返回false
控制的定义
- 空字符串
- 只包含空格的字符串
- 只包含空白字符
\r
、\t
、\n
的字符串 - 只包含Unicode控制字符
null
和undefiend
- 没有任何属性的对象
{}
- 没有任何元素的数组
[]
- 没有任何元素的
Map
和Set
对象
示例
//以下结果都是true
console.log(isEmpty(""))
console.log(isEmpty(" "))
console.log(isEmpty("\r"))
console.log(isEmpty("\t"))
console.log(isEmpty("\n"))
console.log(isEmpty("\r\n \t "))
console.log(isEmpty(null))
console.log(isEmpty(undefined))
console.log(isEmpty({}))
console.log(isEmpty([]))
console.log(isEmpty(new Map()))
console.log(isEmpty(new Set()))
console.log(isEmpty("abc", [1], {}))//可以同时传递多个参数,任意一个值为空则返回true
//以下结果都是false
console.log(isEmpty("1"))
console.log(isEmpty("1 "))
console.log(isEmpty("\r 1"))
console.log(isEmpty("\t 2"))
console.log(isEmpty("\n 3"))
console.log(isEmpty({name: ""}))
console.log(isEmpty([1]))
console.log(isEmpty(new Map().set("3", 3)))
console.log(isEmpty(new Set().add("3")))