函数

函数

函数是可重用的代码块,通过调用函数名来执行特定任务。函数在定义之后可以多次调用,从而避免代码重复。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 提供了typeOfsleepsetTimeoutsetIntervalclearIntervalvalid共6个内置函数,开发者无需声明,可以在任何地方直接调用。

typeOf

typeOf可用来获取变量的类型。JavaScript中用来获取类型的方式是使用type of运算符,vino并不支持type of运算符,vino 提供了typeOf函数来获取对象类型,它将JavaScript中typeofinstanceof的功能集成到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
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 数据类型校验,支持:stringintfloatbooleannullarray
  • parse:string 数据类型转换,支持:stringintfloatboolean
  • 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. 没有任何元素的MapSet对象

示例

//以下结果都是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")))
更新时间 10/12/2024, 2:37:19 PM