8.1 伪随机数
有时候程序员会遇到一些看起来很简单的任务:“从特定列表中选择一个随机电影来晚上观看”、“选择一个彩票的赢家”、“在手机摇晃时打乱歌曲列表”、“选择一个随机数来加密消息”等等。每次他都会有一个很合理的问题:如何获得这个随机数呢?
其实,如果你需要一个“真正的随机数”,这是相当困难的。甚至到了电脑中内置特定的数学协处理器来生成这些数,以满足“真正随机性”的所有要求。
因此,程序员想出了自己的解决方案——伪随机数。伪随机数是一种序列,在表面上看这些数似乎是随机的,但专家经过详细分析后能发现其中的某些规律。用于加密机密文件的数字就不适合,而用来模拟游戏中掷骰子就很好用了。
有很多生成伪随机数序列的算法,几乎所有这些算法都是基于前一个数及一些辅助数来生成下一个随机数的。
比如,这个程序会在屏幕上输出1000个不重复的数:
let a = 41;
let c = 11119;
let m = 11113;
let seed = 1;
function getNextRandom() {
seed = (a * seed + c) % m;
return seed;
}
for (let t = 0; t < 1000; t++) {
let x = getNextRandom();
console.log(x);
}
对了,我们讲的不是伪随机数,而是这种数的序列,因为看一个数是无法判断它是否随机的。
随机数可以通过多种方式获得:
function getNextRandom() {
return 4; # 这是个真随机数(我通过掷骰子得到的)
}
8.2 switch操作符
switch操作符用于根据表达式的值执行多个代码块中的一个。在需要比较一个值与多个可能选项时,它特别有用。
语法:
switch(expression) {
case value1:
// 如果 expression === value1,则执行的代码
break;
case value2:
// 如果 expression === value2,则执行的代码
break;
// ...
default:
// 如果没有匹配的值,则执行的代码
}
例子:
let day = 3;
let dayName;
switch (day) {
case 1:
dayName = "周一";
break;
case 2:
dayName = "周二";
break;
case 3:
dayName = "周三";
break;
case 4:
dayName = "周四";
break;
case 5:
dayName = "周五";
break;
case 6:
dayName = "周六";
break;
case 7:
dayName = "周日";
break;
default:
dayName = "无效的日子";
}
console.log(dayName); // "周三"
8.3 操作符 ??
??操作符,或nullish coalescing operator,用于在左操作数为null或undefined时指定默认值。它避免了为其他假值如0、false或空字符串("")指定默认值。
语法:
let result = value1 ?? value2;
如果value1不是null或undefined,result将是value1。否则,result将是value2。
例子:
let foo = null ?? 'default';
console.log(foo); // 'default'
let bar = 0 ?? 'default';
console.log(bar); // 0 (0不为null或undefined)
let baz = undefined ?? 'default';
console.log(baz); // 'default'
与逻辑或 (||) 的区别
||操作符也可以用于设置默认值,但它为任何假值如0,""或NaN返回右操作数。
比较示例:
let value = 0 || 'default';
console.log(value); // 'default' (因为0为假值)
let value2 = 0 ?? 'default';
console.log(value2); // 0 (因为0不为null或undefined)
使用情况
??操作符在只需为null或undefined设置默认值,而保留假值如0或""的情况下很有用。
实际使用示例
示例1. 配置对象的默认值:
function configure(settings) {
settings = settings ?? {};
let timeout = settings.timeout ?? 1000;
let color = settings.color ?? 'blue';
// 其他配置逻辑
}
示例2. 函数的默认参数:
function printMessage(message) {
message = message ?? 'No message provided';
console.log(message);
}
printMessage(null); // 'No message provided'
printMessage('Hello'); // 'Hello'
用??操作符可以写出更简洁和可预测的代码,特别是在只考虑值不存在(null或undefined)的情况下。
GO TO FULL VERSION