1.可选的分号
JavaScript只有在缺少分号就无法正确解析代码的时候才会填补分号,如下代码
var a
a
=
3
console.log(a)
JavaScript将其解析为:
var a; a=3; console.log(a)
因为JavaScript无法解析 var a a,所有在第一行换行处添加了分号。而第二个a可以与"="、“3"一起解析为"a=3”
①有些时候这些语句的分隔规则会导致一些情况
var y = x + f
(a+b).toString()
这段代码会被看做:
var y = x + f(a+b).toString()
代码被当做一个函数调用了
②如果当前语句和下一行语句合并无法合并解析,JavaScript则在第一行填补分号,这是一个通用规则,但是有两个列外,一个是涉及return,break,continue,一个是涉及"++“和”–"运算符时。
第一个列外:
return
true;
会被解析为:
retrun;
true;
而它的本意:
retrun true;
也就是说return,break,continue不会换行,如果换行了只有在特殊情况下才会报错,很难调试。
第二个列外:
x
++
y
解析为:
x;++y
而不是
x++;y
JavaScript的算术运算
JavaScript的算术运算在溢出,下溢以及被零整除时是不会报错的。
- 溢出:当数字运算结果超过了JavaScript所能表示的数字上限,结果为一个特殊的无穷大(infinity)值,如果是负数,则结果为负的无穷大。
- 下溢:是当运算结果无限接近零并比JavaScript能表示的最小值还小的一种情况,这种情况下,JavaScript会返回0,如果为负数,则是-0,-0与0几乎完全一样
NaN
对于NaN来说,它不与任何值相等,并且与自己也不相等,因此可以用x!= x来判断是否为NaN值,或者用函数isNaN()
0与-0
需要注意的是0与-0虽然几乎一样,但是当它们作为除数时,它们并不相等
var zero = 0
var negz = 0
zero === negz //=>true
1/zero === 1/negz //=>false 正无穷大与负无穷大不相等
包装对象
对于字符串来说,它并不是对象,可是它也有属性,那是因为当引用字符串的属性时,JavaScript会通过调用new String(“字符串”)临时将字符串包装成一个对象,这个对象有字符串的方法,当引用属性结束时,这临时对象就会被销毁。除了字符串,数字和布尔值也是同样的道理,通过Nmuber()和Boolean()构造函数临时创建一个对象。
注意:
var s = "test";
s.len = 4;
var t = s.len;
当执行这段代码时,t是undefined, 因为第二行临时创建了对象,并赋予len属性值为4,在随后便销毁了这个对象,所有当赋值给t时,其实len属性已经不存在了
声明提前
在JavaScript函数里声明的所有变量都被提前至函数体的顶部,如下:
var scope = "global";
function f(){
console.log(scope);
var scope = "loacal";
console.log(scope);
}
函数体内第一行输入的是undefined,因为函数作用域的特性,局部变量在整个函数体内是有定义的,也就是说局部变量覆盖了同名的全局变量,然而只有在执行到var时,局部变量才会被真正的赋值。所以变量是被提升到函数体顶部的,如下:
var scope = "global";
function f(){
var scope;
console.log(scope);
scope = "loacal";
console.log(scope);
}