来自《JavaScript 标准参考教程(alpha)》,by 阮一峰
***********************************************************************************************************************************
变量提升
变量提升只对var命令声明的变量有效,如果一个变量不是用var命令声明的,就不会发生变量提升。
console.log(b);
b = 1;
上面的语句将会报错,提示“ReferenceError: b is not defined”,即变量b未声明,这是因为b不是用var命令声明的,JavaScript引擎不会将其提升,而只是视为对顶层对象的b属性的赋值。
变量名
中文是合法的标识符,可以用作变量名。
注释
由于历史上JavaScript兼容HTML代码的注释,所以<!--和-->也被视为单行注释。需要注意的是,-->只有在行首,才会被当成单行注释,否则就是一个运算符。如
x = 1; <!-- x = 2;
--> x = 3;
switch
switch语句后面的表达式与case语句后面的表示式,在比较运行结果时,采用的是严格相等运算符(===),而不是相等运算符(==),这意味着比较时不会发生类型转换。switch结构不利于代码重用,往往可以用对象形式重写。
var o = {
banana: function (){ return },
apple: function (){ return },
default: function (){ return }
};
if (o[fruit]){
o[fruit]();
} else {
o['default']();
}
标签
JavaScript语言允许,语句的前面有标签(label)。标签通常与break语句和continue语句配合使用,跳出特定的循环。
数据类型
JavaScript语言的每一个值,都属于某一种数据类型。JavaScript的数据类型,共有六种。(ES6又新增了第七种Symbol类型的值)。
JavaScript判断值类型的三个方法。
- typeof运算符
- instanceof运算符
- Object.prototype.toString方法
typeof 123 // "number"
typeof "123" // "string"
typeof false // "boolean"
typeof(function f(){})// "function"
typeof undefined// "undefined"
typeof window // "object"
typeof {} // "object"
typeof [] // "object"
typeof null // "object"
<div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="kd">var</span> <span class="nx">o</span> <span class="o">=</span> <span class="p">{};</span>
<span class="kd">var</span> <span class="nx">a</span> <span class="o">=</span> <span class="p">[];</span>
<span class="nx">o</span> <span class="k">instanceof</span> <span class="nb">Array</span> <span class="c1">// false</span>
<span class="nx">a</span> <span class="k">instanceof</span> <span class="nb">Array</span> <span class="c1">// true</span></code>
null和undefined的区别
null | undefined | |
意义 |
表示空值,即该处的值现在为空,表示"无"的对象
|
表示不存在值,就是此处目前不存在任何值,表示"无"的原始值 |
用 | 作为函数的参数,表示该函数的参数是一个没有任何内容的对象 | 变量被声明了,但没有赋值时,就等于undefined |
作为对象原型链的终点 | 调用函数时,应该提供的参数没有提供,该参数等于undefined | |
对象没有赋值的属性,该属性的值为undefined | ||
法 | 函数没有返回值时,默认返回undefined | |
数值 | 0 | NaN |
boolean | false | false |
对比 | null==false //true | null==false //true |
boolean转换
undefined,null,NaN,false,0,"" -> false
[],{} -> true
结尾的分号
do...while循环,函数表达式是有分号的。
分号的自动添加
JavaScript引擎的特点,在应该写分号却没写的情况下,它会自动添加(Automatic Semicolon Insertion,简称ASI),这种自动添加不是绝对的。自动添加分号 |
不自动添加分号 |
下一行的开始与本行的结尾,无法放在一起解释 | 下一行的开始可以与本行的结尾可以连在一起解释 |
一行的起首是“自增”(++)或“自减”(--)运算符,则它们的前面会自动添加分号 | 起首的是(、 [ 、+、-、/这五个字符中的一个 |
如果continue、break、return和throw这四个语句后面,直接跟换行符 |
未书写分号所产生的错误实例
var a = b + c有些JavaScript代码压缩器不会自动添加分号,因此遇到没有分号的结尾,就会让代码保持原状,而不是压缩成一行
(d+e).toString();
/* 结果报错,因为两行连在一起,
解释为c(d+e),
即对函数 c 的调用 */
a = b
/hi/g.exec(c).map(d);
/* 解释为 a = b / hi / g.exec(c).map(d),
即把正则表达式的斜杠当作除法运算符 */
var a = "b"
[ "red", "green" ].forEach(function(c) { console.log(c) })
/* 结果报错,因为两行连在一起,
解释为"b"["red", "green"],
即把字符串当作一个数组,按索引取值 */
var a = 0;
var f = function(x) { return x }
(a++)
/* f等于0,因为(a++)被
* 视为匿名函数的调用 */
return a +
b;
return (a
+ b)
obj.foo(arg1,
arg2)