1、JavaScript不区分整数值和浮点数值。JavaScript中的所有数字均用浮点数值表示。由于某些JavaScript的实现支持八进制直接量,而有些不支持,因此最好不要使用以0为前缀的整型直接量。在ECMAScript6的严格模式下,八进制直接量是明令禁止的。
2、浮点型直接量:3.14 2345.789 .333333333333 6.02e23 //6.02X10的23次方 1.444444E-32 //1.444444X10的负32次方
3、JavaScript中的算术运算在溢出(overflow)、下溢(underflow)或被零整除时不会报错。当数字运算结果超出了JavaScript所能表示的数字上限(溢出),结果为一个特殊的无穷大(infinity)值。负无穷大(-infinity)。基于无穷大的加减乘除运算结果还是无穷大(保留符号)。
4、下溢是当运算结果无限接近于零并比JavaScript能表示的最小值还小的时候发生的一种情形。此时JavaScript将会返回0。被零整除在JavaScript并不报错:只是简单的返回无穷大或负无穷大。零除以零无意义,运算结果是NaN(not a number)。无穷大除以无穷大、给任意负数作开方运算或算术运算符与不是数字或无法转换为数字的操作数一起使用时都将返回NaN。
5、JavaScript中的非数字值很特殊:它和任何值都不相等,包括自身。没办法通过x==NaN来判断x是否是NaN。相反,应当使用x!=x来判断,当且仅当x为NaN的时候,表达式的结果才为true。函数isNaN()的作用与此类似,如果参数是一个非数字值或NaN,则返回true,JavaScript中有一个类似的函数isFinite(),在参数不是NaN、Infinity或-Infinity的时候返回true。
负零值有些特殊,和正零值是相等的。var zero=0; var negz=-0; zero === negz;//=>true 1/zero === 1/negz;//=>false 正无穷大和负无穷大不等。
6、字符集,内码和JavaScript字符串
JavaScript采用UTF-16编码的Unicode字符集,JavaScript字符串是由一组无符号的16位值组成的序列。一个长度为2的JavaScript字符串(两个16位值)有可能表示一个Unicode字符。var p="e";e.length //=>2。
JavaScript定义的各式字符串操作方法均作用于16位值,而非字符,并不会对代理项做单独处理,同样JavaScript不会对字符串做标准化的加工,甚至不能保证字符串是合法的UTF-16格式。
7、在JavaScript中字符串是固定不变的,类似replace()和toUpperCase()的方法都返回新字符串,原字符串本身并没有发生改变。
8、全局对象
当JavaScript解释器启动时(或者任何web浏览器加载新页面的时候),它将创建一个新的全局对象,并给它一组定义的初始属性:
全局属性,比如underfind、Infinity 和 NaN
全局函数,比如isNan()、parseInt()和eval()
构造函数,比如Date()、RegExp()、String()、Object()和Array()
全局对象,比如Math和JSON
在代码的最顶级(不在任何函数内的JavaScript代码)可以使用JavaScript关键字this来引用全局变量:var global = this;//定义一个引用全局对象的全局变量
9、包装对象
通过String(),Number()或Boolean()构造函数来显示创建包装对象:
<script>
var s="test", n = 1, b = true;
var S = new String(s);
var N = new Number(n);
var B = new Boolean(b);
console.log(typeof(s));
console.log(typeof(S));
console.log(typeof(b));
console.log(typeof(B));
console.log(typeof(n));
console.log(typeof(N));
console.log(N==n);
console.log(N===n);
</script>
JavaScript会在必要时将包装对象转换为原始值,“==”等于运算符将原始值和包装对象视为相等,但“===”全等运算符将它们视为不等。通过typeof运算符可以看到原始值和其包装对象的不同。
10、不可变的原始值和可变的对象引用
原始值无法更改,原始值的比较是值的比较,只有他们的值相等时它们才相等。
对象和原始值不同,首先,它们是可变的,值可修改。对象的比较并非值的比较,即使两个对象包含同样的属性和相同的值,它们也不相等。通常称对象为引用类型。
var a=[];var b=a; b[0]=1; a[0] //=>1:变量a也会修改 a===b //=>true:a和b引用同一个数组,因此相等。
11、类型转换
一个值转换为另一个值并不意味着两个值相等。比如,如果在期望使用布尔值的地方使用了undefined,它会转变为false,但并不表明undefined==false。