1. 数据类型

① 数值(number)

var a = 10;
var b = 3.14;

② 字符串(string)

var a = 'hello world';    // 字符串为hello world
var b = "hello";          // 字符串为hello world
var c = "hello 'world'";  // 字符串为hello 'world'
var d = '"hello" world';  // 字符串为"hello" world

双引号和单引号均可以,但需要注意配对,单引号只能和单引号配对,双引号同理。

关于双引号和单引号的嵌套问题,可以是双引号嵌套单引号,也可以是单引号嵌套双引号,通常情况下采用双引号嵌套单引号。

③ 布尔值(boolean)

var flag = true;
var tag = false;

④ undefined:表示未定义或不存在

var a;    //a的数据类型为undefined

⑤ null:表示空值

var a = null;

⑥ 对象(object)

对象可以分为三个子类型:狭义的对象(object)、数组(array)和函数(function)。

var a = {
    name: "blank",
    age: 21
};

2. typeof运算符

typeof运算符用来确定一个值为何种数据类型。

var num = 10;
var str = "Hello World";
var flag = true;
function getName(){}
var age = undefined;
var obj = {};
var timer = null;
var arr = [1,2,3];

console.log(typeof num);     // number
console.log(typeof str);     // string
console.log(typeof flag);     // boolean
console.log(typeof getName);     // function
console.log(typeof undefined);     // undefined
console.log(typeof age);     // undefined
console.log(typeof names);     // undefined
console.log(typeof obj);     // object
console.log(typeof timer);     // object
console.log(typeof arr);    // object

3. 算术运算符

3.1 加法运算符

① 普通的数值相加

var a = 10;
var b = 10;
console.log(a + b);    //20

② 布尔值与布尔值相加 / 布尔值与数值相加

var flag = true;
var tag = false;
var num = 10;
console.log(flag + tag);    //1
console.log(flag + num);    //11

③ 字符串相加 / 字符串与变量名相加

var a = "hello";
var b = "world";
var c = 99;
console.log(a + b);    // helloworld
console.log(a + c + b);    // hello99world

④ 字符串与其他数据类型相加,任何数据类型都会被转换成字符串

var a = "string";
var b = 123;
var c;
var d = null;
var e = true;
console.log(a + b);    //string123
console.log(a + c);    //stringundefined
console.log(a + d);    //stringnull
console.log(a + e);    //stringtrue

可以通过加一个空串将一个非字符串类型的值转换为字符串类型

var a = 10;
console.log(typeof a);    //number
console.log(typeof (a + ""));    //string

⑤ 复合加法

console.log(1+2+"3");    // 33
console.log("1"+2+3);    // 123
console.log(1+"2"+3);    // 123

加法运算符是在运行时决定,到底是执行相加,还是执行连接。也就是说,运算子的不同,导致了不同的语法行为,这种现象称为“重载”(overload)。由于加法运算符存在重载,可能执行两种运算,使用的时候必须很小心。

除了加法运算符,其他算术运算符都不会发生重载,规则是,运算时将运算算子统一转换为数值类型,再进行运算。

console.log(1 - '2') // -1
console.log(1 * '2') // 2
console.log(1 / '2') // 0.5

3.2 减法运算符

console.log(2 - 1);    // 1
console.log(1 - '2');    // -1

3.3 乘法运算符

console.log(2 * 1);    // 2
console.log(1 * '2');    // 2

3.4 除法运算符

console.log(2 / 1);    // 2
console.log(1 / '-2');    // -0.5

3.5 取余运算符

需要注意的是,取余运算符结果的正负由第一个运算算子的正负决定。

console.log(1 % 2);    // 1
console.log(-1 % 2);    // -1
console.log(1 % -2);    // 1

3.6 自增运算符和自减运算符

自增运算符和自减运算符在前时,先++/--再运算;在后时,先运算后++/--。

var a = 10;
var b = 10;
console.log(++a);    // 11
console.log(b++);    // 10
console.log(b);    // 11

3.7 指数运算符

console.log(2 ** 4);    // 16
console.log((-2) ** 3);    // -8

4. 赋值运算符

var x = 1;
var y = x;

5. 比较运算符 

比较运算符用于比较两个值的大小,返回值为布尔值。

console.log(2 > 1);    // 大于运算符,true
console.log(2 < 1);    // 小于运算符,false
console.log(2 >= 1);    // 大于或等于运算符,true
console.log(2 <= 2);    // 小于或等于运算符,true
console.log(2 == "2");    // 相等运算符,true
console.log(2 === "2");    // 严格相等运算符,false
console.log(2 != "2");    // 不等于运算符,false
console.log(2 !== "2");    // 非严格等于运算符,true

相等运算符只比较数值,严格相等运算符既比较数值又比较数据类型。

6. 布尔运算符

布尔运算符用于将表达式转化为布尔值。

console.log(!true);    // 取反运算符,false
console.log(true && false);    // 与运算符,false
console.log(true || false);    // 或运算符,true
console.log(2>1 ? 'yes' : 'no');    // 三元运算符,yes

只有以下六个值取反后为true,其他取反结果都为false

console.log(!false);
console.log(!"");
console.log(!null);
console.log(!undefined);
console.log(!NaN);    // NaN表示运算错误
console.log(!0);

7. 位运算符

位运算是非常底层的运算,优点是速度极快,缺点是不直观。

console.log(5 & 1);    // AND运算符,0101 & 0001 = 0001,1
console.log(5 | 1);    // OR运算符,0101 | 0001 = 0101,5
console.log(5 ^ 1);    // XOR运算符,0101 ^ 0001 = 0100,4
console.log(~5);    // NOT运算符,~0101 = 1010,10
console.log(5 << 1);    // 零填充左移运算符,0101 << 1 = 1010,10
// 通过从右推入零向左位移,并使最左边的位脱落
console.log(5 >> 1);    // 有符号右移运算符,0101 >> 1 = 0010,2
// 通过从左推入最左位的拷贝来向右位移,并使最右边的位脱落
console.log(5 >>> 1);    // 零填充右移运算符,0101 >>> 1 = 0010,2
// 通过从左推入零来向右位移,并使最右边的位脱落

8. 运算符优先级

运算符

描述

. [] ()

字段访问、数组下标、函数调用以及表达式分组

++ -- - ~ ! delete new typeof void

一元运算符、返回数据类型、对象创建、未定义值

/ * %

乘法、除法、取模

+ - +

加法、减法、字符串连接

<< >> >>>

移位

< <= > >= instanceof

小于、小于等于、大于、大于等于、instanceof

== != === !==

等于、不等于、严格相等、非严格相等

&&

逻辑与

||

逻辑或

?:

三元运算符

通常利用小括号提升运算的优先级。 

9. 数据类型转换

9.1 强制类型转换

9.1.1 Number()函数

// 数值:转换后还是原来的值
Number(324) // 324

// 字符串:如果可以被解析为数值,则转换为相应的数值
Number('324') // 324

// 字符串:如果不可以被解析为数值,返回 NaN
Number('324abc') // NaN

// 空字符串转为0
Number('') // 0

// 布尔值:true 转成 1,false 转成 0
Number(true) // 1
Number(false) // 0

// undefined:转成 NaN
Number(undefined) // NaN

// null:转成0
Number(null) // 0

9.1.2 String()函数

String(123) // "123"
String('abc') // "abc"
String(true) // "true"
String(undefined) // "undefined"
String(null) // "null"
String({a: 1}) // "[object Object]"
String([1, 2, 3]) // "1,2,3"

9.1.3 Boolean()函数 

Boolean(undefined) // false
Boolean(null) // false
Boolean(0) // false
Boolean(NaN) // false
Boolean('') // false

9.2 自动类型转换

9.2.1 不同类型的数据相互运算

123 + 'abc' // "123abc"
"123" - 1    // 122

9.2.2 对非布尔值类型的数据求布尔值

if ('abc') {    // true
  console.log('hello')
}

10. 条件语句

10.1 if...else...

if(/*条件*/) {
    // 语句
} else {
    // 语句
}

10.2 switch

switch(/*变量*/) {
    case /*条件*/:    /*语句*/
                    break;
    case /*条件*/:    /*语句*/
                    break;
    //...
    default:    break;
}

switch语句后面的表达式,与case语句后面的表示式比较运行结果时,采用的是严格相等运算符,而不是相等运算符,这意味着比较时不会发生类型转换。

11. 循环语句

11.1 for

for (/*初始化表达式*/; /*条件*/; /*递增表达式*/) {
  // 语句
}

 三个部分均可不写,但分号不可以不写。

11.2 while

while (/*条件*/) {
  // 语句
}

11.3 do...while

do {
  // 语句
} while (/*条件*/);

do...while与while的区别是:do...while循环体中的内容至少执行一次。

注意do...while最后的分号不可以省略。

12. break和continue

for (var i = 0; i < 5; i++) {
    if (i === 3){
        break;
    }
    console.log(i);
}

执行到第三次就终止整个循环,输出0,1,2。

for (var i = 0; i < 5; i++) {
    if (i === 3){
        continue;
    }
    console.log(i);
}

执行到第三次循环时终止当次循环,开始下次循环,输出0,1,2,4。