运算
基础运算
加法
任何数据类型的值和字符串相加,结果都是字符串。
let a = 'str' + 'str';
let b = 'str' + undefined;
let c = 'str' + null;
console.log(a); // strstr
console.log(b); // strundefined
console.log(c); // strnull
let a = 1 + 1 + 'str' + (1 + 1);
console.log(a); // 2str2
除法
NaN是数字类型,表示的是非数,Not a Number。
c = 0 / 0;
console.log(c); // NaN
console.log(typeof(c)); //number
Infinity是数字类型,表示的正无穷,相对-1/0的结果就是负无穷。
c = 1 / 0;
console.log(c); // Infinity
console.log(typeof(c)); // number
取余
c = 5 % 2;
console.log(c); // 1
交换值
交换值的方法,一种是设置一个中间变量,另一种是通过加减运算交换。
let a = 1,
b = 2;
let c = a;
a = b;
b = c;
console.log(a, b); // 2 1
let a = 1,
b = 2;
a = a + b;
b = a - b;
a = a - b;
console.log(a, b); // 2 1
++ --
如果++号在后面则是先输出后运算。
let a = 1;
console.log(a++); // 1
console.log(a); // 2
如果++号在前面则是先运算后输出。
let a = 2;
console.log(--a); // 1
console.log(a); // 1
--号依次类推。
let a = 5,
b;
b = a-- + --a;
console.log(b, a); // 8 3
let a = 5,
b;
b = --a + --a;
console.log(b, a); // 7 3
比较运算符
比较运算符返回的是一个布尔值
let boo1 = 2 > 1;
let boo2 = 2 < 1;
console.log(boo1); // true
console.log(boo2); // false
如果是number类型和string类型数据比较,则会将字符串转换为number类型再比较。
let bool = 2 > '1';
console.log(bool); // true
如果是string类型和string类型数据比较,则是比较它们的ASCII码,如果是多个字符,则从左到右依次对比,直到比出大小为止。
let bool = '2' > '11';
console.log(bool); // true
相等==是不看数据类型的,全等===是需要看数据类型的。
let bool1 = 1 == '1';
let bool2 = 1 === '1';
console.log(bool1); // true
console.log(bool2); // false
NaN和任何东西都不相等,包括自己本身。
let bool = NaN == NaN;
console.log(bool); // false
两个空对象{}是不相等的,因为比较的是它们的内存地址,如果要使它们相等,需要进行赋值,将内存地址传递给另一个。
console.log({} == {}); // false
var obj1 = {},
obj2 = obj1;
console.log(obj1 == obj2); // true
逻辑运算符
逻辑运算符有三个,与&&或||非!。逻辑运算符常用于真假的判断,在JS中,undefined,null,NaN,"",0,false这些值都是假(false),除了上述这些,其它值都是真(true)。
使用与&&运算符时,遇到真就往后走,遇到假就返回当前的值,如果没有假就返回最后一个值。
原理是与表示列出的条件都要为真,所以只要有一个假,就可以返回进行判断了。
let a = 1 && 2;
console.log(a); // 2
let b = 1 && 2 && undefined && 10;
console.log(b); // undefined
使用或||运算符时,遇到假就往后走,遇到真就返回当前的值,如果没有真就返回最后一个值。
原理是或表示列出的条件中有一个为真就行,所以只要有一个是真,就可以返回进行判断了。
let a = 0 || null || 1 || 0;
console.log(a); // 1
三目运算符
var a = 5;
a > 0 ? console.log('yes')
: console.log('no');
三目运算是有return值的。
var a = 5;
var str = a > 0 ? 'yes' : 'no';
console.log(str); // 'yes'
条件判断
当我们使用条件判断相关语句时,要注意条件一定是具有互斥性的。
if else
if else语句适合用于范围值的判读,else if遇到满足的条件判断就会停止,如果全是if则会一直判断,同时要注意程序的完整性,如果数据有问题,则也要给出对应的返回结果,比如异常报错。
let score = 63;
if(score >= 90){
console.log('你的成绩等级为A');
}else if(score >= 80 && score < 90){
console.log('您的成绩等级为B');
}else if(score >= 70 && score < 80){
console.log('您的成绩等级为C');
}else if(score >= 60 && score < 70){
console.log('您的成绩等级为D');
}else if(score < 60){
console.log('您的成绩不合格!');
}else{
console.log('您的成绩出现异常!');
}
switch
switch语句适合用于特定值的判断,break语句用于断开循环,不然会输出所有语句,当所有条件都不满足时,会输出default的语句。
let city = window.prompt('请输入您的城市:');
switch(city){
case '南京':
console.log('秋天');
break;
case '哈尔滨':
console.log('冬天');
break;
case '昆明':
console.log('春天');
break;
case '深圳':
console.log('夏天')
break;
default:
console.log('一年四季');
}
循环
常见的循环体是for循环格式,括号内的代码顺序依次是变量,判断语句,变量变化。
for(var i = 0; i < 10; i++){
console.log(i);
}
本质上for循环就是先声明一个变量,然后进行条件判断,如果条件通过就执行语句。
// 声明变量i,初始值为0。
var i = 0;
// 判断i的值是否小于10
for(; i < 10;){
// 打印i
console.log(i);
// i++
i++;
}
for循环也可以转换为while循环。
var i = 0;
while(i < 10){
console.log(i);
i++;
}
只给定一个i值,输出1~10。这里的break语句也可以用i = 0代替,只要让条件判断为false就可以结束循环。
<script>
var i = 1;
for(; i ;){
console.log(i);
i++;
if(i == 11){
break; // i = 0;
}
}
</script>
100以内的数跳过可以被7整除或者个位数是7的数字,continue是跳过此次循环,直接开始下一轮循环。所以此处当i的值能被7整除或者个位数是7时,直接跳过,开始下一轮。
<script>
for(var i = 0; i < 100; i++){
if(i % 7 == 0 || i % 10 == 7){
continue;
}else{
console.log(i);
}
}
</script>
打印0-99的数,()中只能写一句,{}中不能有++--。
<script>
var i = 100;
// 将i--直接作为判断语句
for(; i--;){
console.log(i);
}
</script>
打印10的N次方。
var n = 5;
var num = 1;
for(var i = 0; i < n; i++){
num *= 10;
}
console.log(num); // 100000
打印n的阶乘
var n = 5;
var num = 1;
for(var i = 1; i <= 5; i++){
num *= i;
}
console.log(num);
将数字789变成987。
let num = 789;
let a = num % 10;
let b = (num - a) % 100 / 10;
let c = (num - a - b * 10) / 100;
console.log(a * 100 + b * 10 + c);
打印100以内的质数,质数是只能被1和自身整除的数。
// 声明一个变量计算一个数可以被多少个数整除
var count = 0;
for(var i = 2; i < 100; i++){
for(var j = 1; j <= i; j++){
if(i % j === 0){
// 当可以被整除时,count次数加1。
count++;
}
}
// 当count为2时,表示该数为质数。
if(count === 2){
console.log(i);
}
// 循环结束后要将count重置为0。
count = 0;
}
斐波那契数列
let n = parseInt(window.prompt('请输入N的值:'));
let arr = [];
for(let i = 0; i < n; i++){
if(i == 0 || i == 1){
arr[i] = 1;
}else{
arr[i] = arr[i - 2] + arr[i - 1];
}
}
console.log(arr[n - 1]);
字符编码
ASCII码 表1是0-127位 表2是128-255位 1个字节。
UNICODE码 涵盖ASCII码 2个字节。
写一个函数,接收任意一个字符串,算出这个字符串的总字节数。
function getBytes(str){
var sum = 0,
len = str.length;
for(var i = 0; i < len; i++){
var char = str.charCodeAt(i);
if(char > 255){
sum += 2;
}else{
sum++;
}
}
return sum;
}
console.log(getBytes('HelloWorld')); // 10