JavaScript基础

95 阅读6分钟

运算

基础运算

加法

任何数据类型的值和字符串相加,结果都是字符串。

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中,undefinednullNaN""0false这些值都是假(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,初始值为0var 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