1
变量的声明和赋值,是分开的两个步骤,上面的代码将它们合在了一块儿,实际的步骤是下面这样。javascript
var a; a = 1;
若是只是声明变量而没有赋值,则该变量的值是undefined
。undefined
是一个 JavaScript 关键字,表示“无定义”。
2
若是变量赋值的时候,忘了写var命令,这条语句也是有效的。html
var a = 1; // 基本等同 a = 1;
可是,不写var的作法,不利于表达意图,并且容易不知不觉地建立全局变量,因此建议老是使用var命令声明变量。java
JavaScript 是一种动态类型语言,也就是说,变量的类型没有限制,变量能够随时更改类型。数组
var a = 1; a = 'hello';
JavaScript 引擎的工做方式是,先解析代码,获取全部被声明的变量,而后再一行一行地运行。这形成的结果,就是全部的变量的声明语句,都会被提高到代码的头部,这就叫作变量提高(hoisting)。浏览器
console.log(a); var a = 1;
上面代码首先使用console.log方法,在控制台(console)显示变量a的值。这时变量a尚未声明和赋值,因此这是一种错误的作法,可是实际上不会报错。由于存在变量提高,真正运行的是下面的代码。app
var a; console.log(a); a = 1;
最后的结果是显示undefined
,表示变量a已声明,但还未赋值。函数
第一个字符,能够是任意 Unicode 字母(包括英文字母和其余语言的字母),以及美圆符号($
)和下划线(_
)。
第二个字符及后面的字符,除了 Unicode 字母、美圆符号和下划线,还能够用数字0-9
。
arg0 _tmp $elem π
上面都合法学习
else
代码块老是与离本身最近的那个if
语句配对。测试
var m = 1; var n = 2; if (m !== 1) if (n === 2) console.log('hello'); else console.log('world');
上面代码不会有任何输出,else
代码块不会获得执行,由于它跟着的是最近的那个if
语句,至关于下面这样。ui
if (m !== 1) { if (n === 2) { console.log('hello'); } else { console.log('world'); } }
若是想让else
代码块跟随最上面的那个if
语句,就要改变大括号的位置。
if (m !== 1) { if (n === 2) { console.log('hello'); } } else { console.log('world'); } // world
switch
结构多个if...else
连在一块儿使用的时候,能够转为使用更方便的switch
结构。
switch (fruit) { case "banana": // ... break; case "apple": // ... break; default: // ... }
上面代码根据变量fruit
的值,选择执行相应的case
。若是全部case
都不符合,则执行最后的default
部分。须要注意的是,每一个case
代码块内部的break
语句不能少,不然会接下去执行下一个case
代码块,而不是跳出switch
结构。
须要注意的是,switch
语句后面的表达式,与case
语句后面的表示式比较运行结果时,采用的是严格相等运算符(===
),而不是相等运算符(==
),这意味着比较时不会发生类型转换。
var x = 1; switch (x) { case true: console.log('x 发生类型转换'); default: console.log('x 没有发生类型转换'); } // x 没有发生类型转换
上面代码中,因为变量x
没有发生类型转换,因此不会执行case true
的状况。这代表,switch语句内部采用的是“严格相等运算符”,详细解释请参考《运算符》一节。
?:
JavaScript还有一个三元运算符(即该运算符须要三个运算子)?:
,也能够用于逻辑判断。
(条件) ? 表达式1 : 表达式2
上面代码中,若是“条件”为true
,则返回“表达式1”的值,不然返回“表达式2”的值。
var even = (n % 2 === 0) ? true : false;
上面代码中,若是n能够被2整除,则even等于true,不然等于false。它等同于下面的形式。
var even; if (n % 2 === 0) { even = true; } else { even = false; }
这个三元运算符能够被视为if...else...
的简写形式,所以能够用于多种场合。
var myVar; console.log( myVar ? 'myVar has a value' : 'myVar do not has a value' ) // myVar do not has a value
上面代码利用三元运算符,输出相应的提示。
var msg = '数字' + n + '是' + (n % 2 === 0 ? '偶数' : '奇数');
上面代码利用三元运算符,在字符串之中插入不一样的值。
break
语句和continue
语句都具备跳转做用,可让代码不按既有的顺序执行。
break
语句用于跳出代码块或循环。
var i = 0; while(i < 100) { console.log('i 当前为:' + i); i++; if (i === 10) break; }
上面代码只会执行10次循环,一旦i等于10,就会跳出循环。
for循环也可使用break语句跳出循环。
for (var i = 0; i < 5; i++) { console.log(i); if (i === 3) break; } // 0 // 1 // 2 // 3
上面代码执行到i等于3,就会跳出循环。
continue语句用于当即终止本轮循环,返回循环结构的头部,开始下一轮循环。
var i = 0; while (i < 100){ i++; if (i % 2 === 0) continue; console.log('i 当前为:' + i); }
上面代码只有在i为奇数时,才会输出i的值。若是i为偶数,则直接进入下一轮循环。
若是存在多重循环,不带参数的break语句和continue语句都只针对最内层循环。
null
与undefined
均可以表示“没有”,含义很是类似.将一个变量赋值为undefined
或null
,老实说,语法效果几乎没区别。if
语句中,它们都会被自动转为false
,相等运算符(==
)甚至直接报告二者相等。if (!undefined) { console.log('undefined is false'); } // undefined is false if (!null) { console.log('null is false'); } // null is false undefined == null // true
null
转为数字时,自动变成0
Number(null) // 0 5 + null // 5
上面代码中,null
转为数字时,自动变成0
。
undefined
是一个表示”此处无定义”的原始值,转为数值时为NaN
。Number(undefined) // NaN 5 + undefined // NaN
null
在调用函数时的用法null
表示空值,即该处的值如今为空。调用函数时,某个参数未设置任何值,这时就能够传入null
,表示该参数为空。好比,某个函数接受引擎抛出的错误做为参数,若是运行过程当中未出错,那么这个参数就会传入null
,表示未发生错误。
undefined
表示“未定义”,下面是返回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
NaN
的值表示不是一个数字(Not-A-Number).NaN
是一个全局对象的属性。NaN
属性的初始值就是 NaN
,和Number.NaN
的值同样。在现代浏览器中(ES5中), NaN
属性是一个不可配置(non-configurable),不可写(non-writable)的属性。编码中不多直接使用到 NaN
。
Math
的某个方法的返回值出现的(例如:Math.sqrt(-1)
)parseInt("blabla")
)。在执行自比较之中:NaN,也只有NaN,比较之中不等于它本身。
NaN === NaN; // false Number.NaN === NaN; // false isNaN(NaN); // true isNaN(Number.NaN); // true function valueIsNaN(v) { return v !== v; } valueIsNaN(1); // false valueIsNaN(NaN); // true valueIsNaN(Number.NaN); // true
本身的测试:
两元逻辑运算符: && (And),|| (Or)
前置逻辑运算符: ! (Not)
相等运算符:===,!==,==,!=
比较运算符:>,>=,<,<=
false
,其余值都视为true
。undefined null false 0 NaN ""或''(空字符串)
注意,空数组([]
)和空对象({}
)对应的布尔值,都是true
。
if ([]) { console.log('true'); } // true if ({}) { console.log('true'); } // true