前言:
JavaScript权威指南作为前端人员必读书籍之一,对整个JavaScript做了详细的介绍,鄙人从今天开始每天研读一下,希望能够提高自己的水平。
第一天
一、语法结构
1、区分大小写
JavaScript严格区分大小写,对于关键字、变量、函数名和所有标识符都必须采用一致的大小写形式
注意:在html代码中并不区分大小写(xml区分!),在运行时浏览器会统一转换为小写,为了防止代码混乱,建议html中代码遵循JavaScript书写规范。
2、注释
JavaScript支持两种格式的注释,“//”和“/* */”,“//”为单行注释,“/* */”可以多行注释但注意不可嵌套注释
注意:区分html、css和JavaScript注释的区别
html注释 <!-- -->
css注释 /* */ 没有单行注释!!!!
3、变量的声明
JavaScript中标志符(即变量名)必须以字母、下划线(_)或$开头,后续可以是字母,数字,下划线和$
注意:JavaScript内置有保留字、关键字、全局变量和函数,不要使用他们作为变量名!
如有兴趣可以自行百度JavaScript保留字!
4、可选分号
分号(;)用于将语句分隔开,虽然可以省略,(如:a=3 b=2 ),但笔者不建议省略,不利于代码的维护和阅读!
二、类型、值和变量
1、数据分类
1.1 JavaScript的数据类型可以分为两类:原始类型和对象类型
原始类型:数字、字符串和布尔值(本书中将null和undefined定义为特殊原始值)
对象类型:除原始类型以外的值,对象本质上是属性的集合,每个属性由“名/值对”组成
1.2 JavaScript的变量也可分为可变类型和不可变类型
可变类型:对象和数组
不可变类型:数字,布尔值、null和undefined
注意:字符串作为特殊的类型,可以看做是字符组成的数组,你可能认为它是可变的,然而,在JavaScript中字符串 是 不可变的,未提供修改字符串内容的方法!!
2、数字
JavaScript采用IEEE 754标准定义64位浮点格式表示数字,这意味着它的最大值为±1.7976931348623157*10 ^308,
其最小所能表示的小数为±5*10^-324,这两个边界值可以分别通过访问Number对象的 MAX_VALUE属性和MIN_VALUE属 性来获取。对于整数范围是从-2^53~2^53,包含边界值。超出此范围无法保证低位数字的精度。
2.1、算术运算
JavaScript提供了简单的+、-、*、/和%运算符,除此之外,对于复杂的运算可以使用Math对象(内置全局对象)的方法和常量实现。
Math 对象方法
方法 | 描述 |
---|---|
abs(x) | 返回数的绝对值。 |
acos(x) | 返回数的反余弦值。 |
asin(x) | 返回数的反正弦值。 |
atan(x) | 以介于 -PI/2 与 PI/2 弧度之间的数值来返回 x 的反正切值。 |
atan2(y,x) | 返回从 x 轴到点 (x,y) 的角度(介于 -PI/2 与 PI/2 弧度之间)。 |
ceil(x) | 对数进行上舍入。 |
cos(x) | 返回数的余弦。 |
exp(x) | 返回 e 的指数。 |
floor(x) | 对数进行下舍入。 |
log(x) | 返回数的自然对数(底为e)。 |
max(x,y) | 返回 x 和 y 中的最高值。 |
min(x,y) | 返回 x 和 y 中的最低值。 |
pow(x,y) | 返回 x 的 y 次幂。 |
random() | 返回 0 ~ 1 之间的随机数。 |
round(x) | 把数四舍五入为最接近的整数。 |
sin(x) | 返回数的正弦。 |
sqrt(x) | 返回数的平方根。 |
tan(x) | 返回角的正切。 |
toSource() | 返回该对象的源代码。 |
valueOf() | 返回 Math 对象的原始值。 |
注意:由于JavaScript本身采用的数字表示法是二进制表示法,对于0.1这样简单的数字并不能精确表示,
我们可以看一个例子:
var x=.3-.2;
var y=.2-.1;
x==y //==>false
x==.1 //==>false
y==.1 //==>true
对于这种问题的处理,应该使用大整数进行运算,避免小数的计算!
2.2、Infinity和NaN
算术运算时,若出现溢出、下溢或被零整除,程序不会报错,而是会返回一个特殊的无穷大的值,以infinity表示,对于负数以-Infinity表示,基于他们的运算永远返回Infinity(保留正负号)。
NaN表示非数字值,其本质上还是一个数字,但它和任何值都不相等,包括自身,对于NaN的判断可以使用如下方法:
var x=NaN;
x!=x; //==>true 当且仅当x为NaN时才会返回true
isNaN(x); //==>true 参数为NaN或非数字值时返回true
isFinite(x); //==>false 参数不是NaN,Infinity或-INfinity时返回true
//顺便一提 -0与0是相等的
-0===0 //==>true
3、日期和时间
JavaScript提供了Date()构造函数,用于构造一个日期对象,可以通过对象中的方法获取相应的日期和时间。(后续介绍)
4、文本
JavaScript中通过字符串类型表示文本,字符串的长度是其所包含16位值的个数。
字符串的索引从零开始,空字符串长度为0。
4.1、字符串直接量
字符串直接量由单引号或双引号括起来的字符序列,单引号和双引号可以嵌套。
在ES5中,字符串直接量可以拆分成数行,每行必须以反斜线(\)结束 ,如果需要另起一行可以使用转义字符\n
"tow\nline"; //==>"tow
// line"
"one\
long\
line"; //==>"onelongline"
注意:字符串在JavaScript中是固定不变的(即上文提到过的不可变类型),使用字符串包装对象的内置方法修改字符串本质上返回的都是新字符串,原字符串不受影响!
5、模式匹配(正则表达式)
JavaScript中定义了RegExp()构造函数,用于创建文本匹配模式对象(称为正则表达式)
RegExp与Date类似属于JavaScript的特殊内置对象,语法较为复杂,这里不做详细介绍,仅介绍其字面量写法。
var pattern=/\d+/g; //匹配所有包含一个或多个数字的实例
6、布尔值
布尔值用于表示真假,只有两个值,true和false,通常用于控制语句(if)中。
在JavaScript中,只有以下值会被转为false:
- undefined
- null
- 0,-0
- NaN
- “” //空字符串
其他所有值,包括空数组和空对象都会转为true。
6.1、逻辑运算符
6.1.1、&&(and)运算符
当且仅当两个操作符都为真时返回true,当第一个值为false时,不会执行第二条语句,即俗称的短路
6.1.2、||(or)运算符
如果两个操作数其中之一为true时返回true,当第一个值为true时,第二条语句不会执行
6.1.3、!(not)运算符
对操作数取反,操作数为真时返回false,如果是假时返回true
7、包装对象
在使用字符串或数字等原始类型的方法时,有没有好奇为什么可以像对象类型一样使用?
那是因为在引用这些方法时,JavaScript会通过Number()或String()构造函数创建一个临时变量,这些方法就是定义在这些临时对象上的,这些临时对象在使用完成后就会自动销毁,因此对这些值进行操作是没有意义的.
当然你可以通过对象构造的方法显式构造包装对象,但构造出的值与原始类型值并不相同。
8、类型转换
附上类型转换表:
原始类型和对象类型 | 转换成String: | 转换成Number | 转换成Boolean | 转换成Object |
---|---|---|---|---|
undefined | "undefined" | NaN | false | throws TypeError |
null | "null" | 0 | false | throws TypeError |
true | "true" | 1 | new Boolean(true) | |
false | "false" | 0 | new Boolean(false) | |
"" (empty string) | 0 | false | new String("");Object("") | |
"1.2" (nonempty, numeric) | 1.2 | true | new String("1.2");Object("1.2") | |
"one" (nonempty, non-numeric) | NaN | true | new String("one");Object("one") | |
0 | "0" | false | new Number(0);Object(0) | |
-0 | "0" | false | new Number(-0);Object(-0) | |
NaN | "undefined" | false | new Number(NaN);Object(NaN) | |
Infinity | "Infinity" | true | new Number(Infinity);Object(Infinity) | |
-Infinity | "-Infinity" | true | new Number(-Infinity);Object(-Infinity) | |
1 (finite, non-zero) | "1" | true | new Number(1);Object(1) | |
{} (any object) | NaN | true | ||
[] (empty array) | "" | 0 | true | |
[9] (1 numeric elt) | "9" | 9 | true | |
['a'] (any other array) | use join() method | NaN | true | |
function(){} (any function | "undefined" | NaN | true |
8.1、隐式转换
除了上述的转换方法之外,某些运算符会做隐式的类型转换。
x+"" //等价于String(x)
+x //等价于Number,也可以写成x-0
!!x //等价于Boolean(x)
//数字转为字符串时控制输出的小数点或有效数字位数时,可以使用一下方法
//这三个方法都会根据位数进行四舍五入或填充0
var n=123456.789;
n.toFixed(0); //"123456"
n.toFixed(2); //"123456.79"
n.toExponential(1); //"1.2e+5"
n.toExponential(3); //"1.235e+5"
n.toPrecision(4); //"1.235e+5"
n.toPrecision(7); //"123456.8"
//全局对象中提供了两个方法用于转换字符串为数字
parseInt("11",2); //==>3 以二进制转换,当无法被转换时返回NaN
parseInt("0x11"); //==>17 以十六进制转换
parseInt("0x11",2); //==>0 省略后面无法被解析的字符串
parseFloat(".1"); //==>0.1