学习的教程地址如下:JavaScript 教程
基本语法
变量声明
- 变量无论在哪声明都会提升到首行;
- 变量可以用
$
_
以及 任意的Unicode
字母,但不能是数字; - 一个 var 可以声明多个变量
var a, b = 1;
- 一行代码只有
;
时,表示空语句;;;;
这样就是3个空语句; - 如果变量声明没有赋值,值为
undefined
; - 区块
{}
并不会限制变量的作用域;
js使用html的注释
下面是html的注释
js也可以使用,比如
var x = 1; x = 3;
注意:
- x 的值是1;
-->
必须在行首,才会被当成单行注释,如果是写在代码中间,会可能被当成 -- 运算符;
function countdown(n) {
while (n --> 0) console.log(n);
}
countdown(3);
输出的是: 2 1 0
while 这行被解释成 n-- > 0
条件判断
- 优先使用
===
而不是==
做条件比较;
if (x = 2) { // 不报错,被当成赋值语句了
if (2 = x) { // 报错,这样可以避免被当成赋值语句
- if ... else ... 的结构建议使用
{}
,否则 else 会自动与他最近的 'if' 配对;
if (m !== 1) {
if (n === 2) {
console.log('hello');
}
} else {
console.log('world');
}
// 输出的值是 world
switch
语句内部采用的是“严格相等运算符”,不会发生成类型转换;
var x = 1;
switch (x) {
case true:
console.log('x 发生类型转换');
break;
default:
console.log('x 没有发生类型转换');
}
// x 没有发生类型转换
switch
与case
中都可以使用表达式
switch (1 + 3) {
case 2 + 2:
f();
break;
default:
neverHappens();
}
for
可以不写表达式,但;
不能省略;
for ( ; ; ){
console.log('Hello World');
}
break
语句用于跳出代码块或循环。continue
语句用于立即终止本轮循环,返回循环结构的头部,开始下一轮循环。- 如果存在多重循环,不带参数的
break
语句和continue
语句都只针对最内层循环。 label
标签通常与break
语句和continue
语句配合使用,跳出特定的循环。
top:
for (var i = 0; i < 3; i++){
for (var j = 0; j < 3; j++){
if (i === 1 && j === 1) break top;
console.log('i=' + i + ', j=' + j);
}
}
// i=0, j=0
// i=0, j=1
// i=0, j=2
// i=1, j=0
数据类型
分类
- 数值(number)、字符串(string)、布尔值(boolean)这三种类型,合称为原始类型
- 对象(object)是最复杂的数据类型,又可以分成三个子类型。
- 狭义的对象(object)
- 数组(array)
- 函数(function)
undefined
和null
,一般将它们看成两个特殊值。typeof
运算符可以返回一个值的数据类型。
typeof window // "object"
typeof {} // "object"
typeof [] // "object"
typeof null // "object",这个是历史原因造成的
typeof undefined
// "undefined"
function f() {}
typeof f
// "function"
typeof 123 // "number"
typeof '123' // "string"
typeof false // "boolean"
null
和 undefined
null
表示空值;undefined
表示“未定义”;
// 变量声明了,但没有赋值
var i;
i // undefined
// 调用函数时,应该提供的参数没有提供,该参数等于 undefined
function f(x) {
return x;
}
f() // undefined
// 对象没有赋值的属性
var o = new Object();
o.p // undefined
// 函数没有返回值时,默认返回 undefined
function f() {}
f() // undefined
布尔值
- 布尔值转换规则是除了下面六个值被转为
false
,其他值都视为true
。
undefined
null
false
0
NaN
""
或''
(空字符串)
空数组([]
)和空对象({}
)对应的布尔值,都是true
数值
- 所有数字都是以64位浮点数形式储存,所有数字都是小数(64位浮点数)。某些运算只有整数才能完成时,会自动把64位浮点数,转成32位整数,然后再进行运算;
1 === 1.0 // true
- 浮点数不是精确的值
0.1 + 0.2 === 0.3
// false
0.3 / 0.1
// 2.9999999999999996
(0.3 - 0.2) === (0.2 - 0.1)
// false
- 浮点数的64个二进制位,从最左边开始,是这样组成的。
- 第1位:符号位,
0
表示正数,1
表示负数 - 第2位到第12位(共11位):指数部分
- 第13位到第64位(共52位):小数部分(即有效数字
- 数值的精度 -2^53 到 2^53
- 数值范围 2^1024 到 2^-1023
- Number对象的MAX_VALUE和MIN_VALUE属性,返回可以表示的具体的最大值和最小值。
Number.MAX_VALUE // 1.7976931348623157e+308
Number.MIN_VALUE // 5e-324
- 数值可以用字面量(十进制、十六进制、八进制、二进制),也可以用科学计数法
- 十进制:没有前导0的数值。
- 八进制:有前缀
0o
或0O
的数值,或者有前导0、且只用到0-7的八个阿拉伯数字的数值。 - 十六进制:有前缀
0x
或0X
的数值。 - 二进制:有前缀
0b
或0B
的数值。
- JavaScript 会自动将数值转为科学计数法(小数点前的数字多于21位。,小数点后的零多于5个。)表示,其他情况都采用字面形式直接表示。
- 几乎所有场合,正零和负零都会被当作正常的
0
。唯一有区别的场合是,+0
或-0
当作分母,返回的值是不相等的。
(1 / +0) === (1 / -0) // false
上面的代码之所以出现这样结果,是因为除以正零得到+Infinity
,除以负零得到-Infinity
,这两者是不相等的
NaN
NaN
是 JavaScript 的特殊值,表示“非数字”0
除以0
也会得到NaN
。
0 / 0 // NaN
NaN
不是独立的数据类型,而是一个特殊数值
typeof NaN // 'number'
NaN
不等于任何值,包括它本身。
NaN === NaN // false
- 数组的
indexOf
方法内部使用的是严格相等运算符,所以该方法对NaN
不成立。
[NaN].indexOf(NaN) // -1
NaN
在布尔运算时被当作false
。
Boolean(NaN) // false
NaN
与任何数(包括它自己)的运算,得到的都是NaN
。
NaN + 32 // NaN
NaN - 32 // NaN
NaN * 32 // NaN
NaN / 32 // NaN
Infinity
// 场景一
Math.pow(2, 1024) // Infinity,超过最大值,或小于最小值
// 场景二
0 / 0 // NaN
1 / 0 // Infinity,非0除0
Infinity === -Infinity // false,有正负之分
1 / -0 // -Infinity
-1 / -0 // Infinity
Infinity > 1000 // true,正无穷大于任何值
-Infinity < -1000 // true,负无穷小于任何值
Infinity
与NaN
比较,总是返回false
。
Infinity > NaN // false
-Infinity > NaN // false
Infinity < NaN // false
-Infinity < NaN // false
运算规则
5 * Infinity // Infinity
5 - Infinity // -Infinity
Infinity / 5 // Infinity
5 / Infinity // 0
0乘以Infinity
,返回NaN
;0除以Infinity
,返回0
;Infinity
除以0,返回Infinity
。
0 * Infinity // NaN
0 / Infinity // 0
Infinity / 0 // Infinity
Infinity
加上或乘以Infinity
,返回的还是Infinity
。
Infinity + Infinity // Infinity
Infinity * Infinity // Infinity
Infinity
减去或除以Infinity
,得到NaN
。
Infinity - Infinity // NaN
Infinity / Infinity // NaN
Infinity
与null
计算时,null
会转成0,等同于与0
的计算。
null * Infinity // NaN
null / Infinity // 0
Infinity / null // Infinity
Infinity
与undefined
计算,返回的都是NaN
。
undefined + Infinity // NaN
undefined - Infinity // NaN
undefined * Infinity // NaN
undefined / Infinity // NaN
Infinity / undefined // NaN