原始类型 | 对象类型 |
拥有方法的类型 | 不能拥有方法的类型 |
可变类型:对象、数组 | 不可变类型:字符串、布尔值、null、undefined |
3.1.1 整型直接量
JavaScript除了能表示十进制的整型直接量,同样能够识别十六进制的值,八进制不确定。
|
3.1.2 浮点型直接量
浮点型直接量可以含有小数点,一个实数由整数部分、小数点和小数部分组成。 3.14
还可以使用指数记数法表示浮点型直接量,即在实数后跟字母e或E,后面再跟正负号。 1.1457E-32
|
3.13 JavaScript中的算术运算
JavaScript使用语言本身的算术运算符来进行数字运算,+ - * / %
除了基本的运算符,还支持复杂的算术运算,这些复杂运算通过作为Math对象的属性定义的函数和常量来实现:
Math.pow(2,53); Math.round(.6);.....
JavaScript中的算术运算在溢出(overflow)、下溢(underflow)或被零整除时不会报错。当数字运算结果超过了JavaScript所能表示的数字上限,结果作为一个特殊的无穷大值,在JavaScript中以Infinity表示,负值超过了也是一样的算法。无穷大的特性:基于他们的加减乘除也是无穷大。
下溢是当运算结果无限接近于零并比JavaScript能表示的最小值还小的时候发生的一种情况,这种情况下,会返回0.当一个负数发生下溢时,JavaScript返回一个特殊的值“负零”,负零和正零几乎完全一样,很少用到。
被零整除在JavaScript并不报错,只是简单的返回无穷大或负无穷大;但有一个例外,0/0是无意义的,运算结果也是一个非数字值,用NaN表示。无穷大除以无穷大、给任意负数做开方运算或者算术运算符与不是数字或无法转换为数字的操作数一起使用时都将返回NaN.
JavaScript预定义了全局变量Infinity和NaN,用来表示正无穷大和非数字值。非数字值NaN有一点特殊:它和任何值都不相等,包括自身,没办法通过x==NaN来判断变量x是否是NaN
isNaN()---如果参数是NaN或者是一个非数字值(比如字符串和对象),则返回true;
isFinite()---在参数不是NaN、Infinity或-Infinity的时候返回true;
负零值同样有些特殊,它和正零值是相等的,但除了作为除数之外:
var zero = 0;
var negz = -0;
console.log(zero == negz); true
console.log(1/zero == 1/negz); false
|
3.1.4 二进制浮点数和四舍五入错误
JavaScript采用了IEEE-754浮点数表示法,这是一种二进制的 表示法,可以精确的表示分数,比如1/2、1/8和1/1024,但是我们常用的是十进制分数,1/10、1/100等,二进制并不能表示类似0.1这样简单的数字。
JavaScript中的数字有足够的精度,并且可以极其近似于0.1,但事实上并不等:
var x = .3 - .2;
var y = .2 - .1;
console.log(x); // 0.09999999999999998
console.log(y); // 0.1
x == y; //--false
在任何使用二进制浮点数的编程语言都会出现这个问题(可以采取分为单位,而不是元)
|
3.1.5 日期和时间
JavaScript语言核心包括Date()构造函数,用来创建表示日期和时间的对象,但不是基本数据类型。
var then = new Date(2011,0,1);//2011年1月1日
var later = new Date(2011,0,1,17,10,30);
//2011年1月1日下午5:10:30
var now = new Date();
var elapsed = now - then; //日期减法:间隔毫秒数
later.getFullYear(); //--2011
later.getMonth(); //--0 从0开始计算月份
later.getDate(); //--1 从1开始计算的
var day = later.getDay(); //--0代表星期天
console.log(day);
later.getHours();
later.getUTCHours(); //使用UTC表示小时的时间 基于时区
|
3.2.1 字符串直接量
在JavaScript程序中的字符串直接量,是由单引号或者双引号括起来的字符序列。由单引号定界的字符串刻印包含双引号,由双引号定界的字符串中也可以包含单引号。
在ECMAScript 3中,字符串直接量必须写在一行中,而在ECMAScript 5中,字符串直接量可以拆分成数行,每行必须以反斜线(\)结束,反斜线和行结束符都不算字符串直接量的内容。如果希望在字符串直接量中另起一行,可以使用转义字符 \n
*再用单引号的时候必须注意英文中的缩写和所有格写法 can't O'Relly's,此时必须使用反斜线(\)来转义。
*JavaScript代码和HTML代码都用单引号或者双引号,但最好各自使用个独立的引号风格。
|
3.2.2 转义字符
在JavaScript中,反斜线(\)有着特殊的用途,如在上文中转义:'can\'t ' ' O\'Relly\'s'
JavaScript转义字符
\o ---- NUL字符(\u0000)
\b ---- 退格符(\u0008)
\t ---- 水平制表符(\u0009)
\n ---- 换行符(\u000A)
\v ---- 垂直制表符(\u000B)
\f ---- 换页符 (\u000C)
\r ----- 回车符(\u000D)
\'' ---- 双引号(\u0022)
\' ----- 撇号或者单引号(\u0027)
\\ ----- 反斜线(\u005C)
\xXX ----- 由两位十六进制数XX指定的Latin-1字符
\uXXXX ---- 由四位十六进制数XXXX指定的Unicode字符
如果“\”字符没有在以上列表中出现,则忽略“\”
|
3.2.3 字符串的使用
JavaScript的内置功能之一就是字符串的连接,用“+”作用于字符串表示字符串连接
JavaScript字符串调用方法:
var s = "hello,world";
s.charAt(0); //第一个字符:h
s.substring(1,4); //第2-4个字符:ell
s.slice(1,4); //同上
s.slice(-3); //最后三个字符:rld
s.indexOf("l"); //字符"l"第一次出现:2
s.lastIndexOf("l"); //字符串"l"最后一次出现:9
s.indexOf("l",3); //在位置3后面首次出现"l"的位置:3
s.split(",");//按照","分割:['hello','world']
s.replace("h","H");//"h"全用"H"替代
s.toUpperCase();//纯大写
|
3.2.4 模式匹配
JavaScript定义了RegExp()构造函数,用来创建表示文本匹配模式的对象 ------ 称为‘正则表达式’
JavaScript采用Perl中的正则表达式语法,String和RegExp对象均定义了利用正则表达式进行模式匹配和查找与替换的函数
RegExp是JavaScript的特殊对象,虽然不是语言中的基本数据类型,但是具有直接量写法,可以直接在JavaScript程序中使
var text = "testing:1,2,3";
var pattern = /\d+/g; //匹配所有包含一个或多个数字的实例
pattern.test(text); // true
text.search(pattern); //首次匹配成功的位置:8
text.match(pattern); //所有匹配组成的数组 ['1','2','3']
|
布尔值代表真或假、开或关、是或否,只有两个值 true、false。
在JavaScript中,任意的JavaScript值都可以转换成布尔值:
undefined ,null ,0 ,-0 ,NaN ,“” 会被转换成false;
所有其他值,包括所有对象(数组)都会转换成true
假值(falsy value)--false和上面六个可以转换成false的值;
真值(truthy value) -- true和可以转换成true的值;
在JavaScript期望使用一个布尔值时,假值会被当成false,真值会被当成true。
if(o !== null)......只有当o不是null时才会执行之后的代码
if(o)......o不是任何假值都会执行之后的代码
|
null 是JavaScript的关键字,表示一个特殊值,常用来描述“空值”;、
表示数字、字符串和对象是“无值”的;
typeof(null) == "object" // "object" 返回字符串“object” ,也就是说,可以把null认为是一个特殊的对象值,含义是非对象。
undefined是预定义的全局变量,不是关键字,它的值就是“未定义”;
表明变量没有初始化,或者属性和元素不存在
typeof(undefined) // "undefined" 返回字符串“undefined” 这个值是这个类型的唯一成员
|