函数

函数

函数是可重用的代码块,通过调用函数名来执行特定任务。函数在定义之后可以多次调用,从而避免代码重复。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 语句,函数返回 null

function add(a, b) {
	return a + b;
}

console.log(add(2, 3)); // 输出: 5
console.log(add(2)); // 输出: NaN,因为 b 是 null

函数作用域

函数内部声明的变量在函数外部是不可见的,这称为函数作用域

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、isEmpty共7个内置函数,开发者无需声明,可以在任何地方直接调用。

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属性的取值范围:

  1. null 空
  2. string 字符串
  3. int 整数
  4. float 浮点数
  5. boolean 布尔值
  6. bigint 大整数
  7. object 对象
  8. array 数组
  9. function 函数
  10. class 类

sleep

sleep() 函数可以让当前线程睡眠,这也是vino多线程的一个重要标志。

语法

sleep(time?:int);
  • time:线程睡眠的时间,单位:毫秒

当不传递time参数或time小于等于0时,线程将永久等待。

示例

//线程睡眠1000毫秒
sleep(1000);
//线程永久睡眠
sleep()

vino中的sleep函数参考了Java和Golang的设计思想:

  1. Java
Thread.sleep(1000);
  1. 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已存在,则返回null。

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 为 null

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值或者null

示例

创建一个定时器,系统返回的定时器ID

let taskId = setTimeout(function () {
	console.log("xxx");
}, 1000);
let res = clearInterval(taskId);
console.log(res)    // 输出true

let res1 = clearInterval(taskId);
console.log(res1)    // 输出null
sleep(5000);

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、空字符串、制表符、回车换行
  • 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

控制的定义

  1. 空字符串
  2. 只包含空格的字符串
  3. 只包含空白字符\r、\t、\n的字符串
  4. 只包含Unicode控制字符
  5. null
  6. 没有任何属性的对象{}
  7. 没有任何元素的数组[]
  8. 没有任何元素的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({}))
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")))
更新时间 6/10/2026, 7:09:46 PM