数值
JS底层都是以64位浮点数储存,这意味着JS底层没有整数。某些运算只有整数才能完成,此时 JavaScript 会自动把64位浮点数,转成32位整数。
由于浮点数是不精确的,所以在JS涉及小数运算和比较时要特别注意!
{0.1 + 0.2 === 0.3 // false} {0.3 / 0.1 // 2.9999999999999996} {(0.3 - 0.2) === (0.2 - 0.1) // false}
唯一有区别的场合是,+0
或-0
当作分母,返回的值是不相等的。因为除以正零得到+Infinity
,除以负零得到-Infinity
NaN是 JavaScript 的特殊值,表示“非数字”(Not a Number),主要出现在将字符串解析成数字出错的场合。
parseInt
方法用于将字符串转为整数。对于那些会自动转为科学计数法的数字,parseInt
会将科学计数法的表示方法视为字符串,因此导致一些奇怪的结果。
parseInt(1000000000000000000000.5) // 1 // 等同于 parseInt('1e+21') // 1 parseInt(0.0000008) // 8 // 等同于 parseInt('8e-7') // 8
parseInt
方法还可以接受第二个参数(2到36之间),表示被解析的值的进制,返回该值对应的十进制数。默认情况下,parseInt
的第二个参数为10,即默认是十进制转十进制。
parseFloat
方法用于将一个字符串转为浮点数。如果字符串包含不能转为浮点数的字符,则不再进行往后转换,返回已经转好的部分。
如果参数不是字符串,或者字符串的第一个字符不能转化为浮点数,则返回NaN
。
注意,parseFloat
会将空字符串转为NaN
。这些特点使得parseFloat
的转换结果不同于Number
函数。
isFinite
方法返回一个布尔值,表示某个值是否为正常的数值。
除了Infinity
、-Infinity
、NaN
和undefined
这几个值会返回false
,isFinite
对于其他的数值都会返回true
。
运算符
加法运算符是在运行时决定,到底是执行相加,还是执行连接。也就是说,运算子的不同,导致了不同的语法行为,这种现象称为“重载”(overload)。由于加法运算符存在重载,可能执行两种运算,使用的时候必须很小心。
余数运算结果的正负号由第一个运算子的正负号决定,为了使运算结果绝对为正,我们可以使用绝对值函数 Math.abs()
自增和自减运算符有一个需要注意的地方,就是放在变量之后,会先返回变量操作前的值,再进行自增/自减操作;放在变量之前,会先进行自增/自减操作,再返回变量操作后的值。
var x = 1;x++ // 1; var y = 1; ++y // 2 (
x
是先返回当前值,然后自增,所以得到1
;y
是先自增,然后返回新的值,所以得到2
。)
‘=’、‘==’、‘===’、'!='、'!==' 符号分别表示:赋值符;相等运算符,严格相等运算符,不相等运算符,严格不相等运算符。
相等运算符会将两个值转换成相同类型再进行严格比较,而严格相等运算符遇到类型不同的两个值会直接返回false。
相等运算符隐藏的类型转换,会带来一些违反直觉的结果,容易使我们出错(例如2!=true;2!=false;false=='0';null==undefined),不同类型的值比较最好只使用严格相等运算符。
严格相等运算符在遇到两个复合类型(对象、数组、函数)的数据比较时,不是比较它们的值是否相等,而是比较它们是否指向同一个地址!
任何值(包括NaN
本身)与NaN
比较,返回的都是false
。
NaN
与任何值都不相等(包括自身)。另外,正0
等于负0
。
(&&) 如果第一个运算子的布尔值为true
,则返回第二个运算子的值(注意是值,不是布尔值);如果第一个运算子的布尔值为false
,则直接返回第一个运算子的值,且不再对第二个运算子求值。
(||)它的运算规则是:如果第一个运算子的布尔值为true
,则返回第一个运算子的值,且不再对第二个运算子求值;如果第一个运算子的布尔值为false
,则返回第二个运算子的值。
三元条件表达式与if...else
语句具有同样表达效果,前者可以表达的,后者也能表达。但是两者具有一个重大差别,if...else
是语句,没有返回值;三元条件表达式是表达式,具有返回值。所以,在需要返回值的场合,只能使用三元条件表达式,而不能使用if..else
。
位运算符直接处理每一个比特位(bit),所以是非常底层的运算,好处是速度极快,缺点是很不直观,许多场合不能使用它们,否则会使代码难以理解和查错。
有一点需要特别注意,位运算符只对整数起作用,如果一个运算子不是整数,会自动转为整数后再执行。另外,虽然在 JavaScript 内部,数值都是以64位浮点数的形式储存,但是做位运算的时候,是以32位带符号的整数进行运算的,并且返回值也是一个32位带符号的整数。
void
运算符的作用是执行一个表达式,然后不返回任何值,或者说返回undefined
。
逗号运算符用于对两个表达式求值,并返回后一个表达式的值。
圆括号不是运算符,而是一种语法结构。它一共有两种用法:一种是把表达式放在圆括号之中,提升运算的优先级;另一种是跟在函数的后面,作用是调用函数。
少数运算符的计算顺序是从右到左,即从右边开始计算,这叫做运算符的“右结合”(right-to-left associativity)。其中,最主要的是赋值运算符(=
)和三元条件运算符(?:
)。
上述部分笔记引用自——阮一峰《JavaScript 标准参考教程(alpha)》