|
|
# JavaScript
|
|
|
|
|
|
## 运算符、数据类型和流程循环语句
|
|
|
|
|
|
switch case 采用的是===
|
|
|
|
|
|
default 没有选中的case
|
|
|
|
|
|
|
|
|
|
|
|
## String
|
|
|
|
|
|
字符串补全:str.padStart(length,"x")
|
|
|
|
|
|
Str.padEnd(length,"x")
|
|
|
|
|
|
## 函数与对象
|
|
|
|
|
|
### (1) 函数的声明
|
|
|
|
|
|
* 驼峰命名法
|
|
|
|
|
|
大驼峰:首字母大写
|
|
|
|
|
|
小驼峰:首字母小写
|
|
|
|
|
|
```js
|
|
|
function funName(参数){
|
|
|
|
|
|
}
|
|
|
```
|
|
|
|
|
|
当一个函数声明多次,后面的会覆盖
|
|
|
|
|
|
函数名的提升:所有的函数都会被提升带代码头部
|
|
|
|
|
|
不能再条件语句中声明函数
|
|
|
|
|
|
### (2)函数的属性和方法
|
|
|
|
|
|
内部属性
|
|
|
|
|
|
```js
|
|
|
function getName(){};
|
|
|
getName.name//这里会显示函数的名字
|
|
|
```
|
|
|
|
|
|
当这样子声明时,不能直接通过函数名调用
|
|
|
|
|
|
```
|
|
|
let a = function as(){}
|
|
|
a();//正确
|
|
|
as();//报错
|
|
|
```
|
|
|
|
|
|
### (3) 函数的作用域
|
|
|
|
|
|
全局作用域
|
|
|
|
|
|
局部作用域
|
|
|
|
|
|
### (4) 函数的参数
|
|
|
|
|
|
函数的参数可以省略,也可以多,缺少的undefined
|
|
|
|
|
|
查看函数有几个参数fun.length
|
|
|
|
|
|
数值,字符串,布尔值不会再函数中改变,这个原始类型,引用类型才会改变
|
|
|
|
|
|
|
|
|
|
|
|
读取参数
|
|
|
|
|
|
arguments,只有在函数内部才能出现
|
|
|
|
|
|
### (5) 其他
|
|
|
|
|
|
自调用
|
|
|
|
|
|
```js
|
|
|
(function a(){console.log("xsxsxsxs")}())
|
|
|
(function a(){console.log("xsxsxsxs")}()
|
|
|
```
|
|
|
|
|
|
Eval()将字符串当作语句执行
|
|
|
|
|
|
```js
|
|
|
eval(console.log("Hello World!"));//Hello World!
|
|
|
```
|
|
|
|
|
|
### (6) 闭包
|
|
|
|
|
|
函数嵌套,内部函数调用外部参数
|
|
|
|
|
|
函数变量一直在内存当中(一般函数执行完,变量会被回收,有必报的话,变量会一直存在于内存中)
|
|
|
|
|
|
### (7) 对象
|
|
|
|
|
|
```js
|
|
|
let a={
|
|
|
q:"sx",
|
|
|
"xsx":"xs"
|
|
|
}
|
|
|
a.q;
|
|
|
a["xsx"];//不能使用a."xsx";
|
|
|
|
|
|
|
|
|
Object.keys(a);//返回key数组
|
|
|
delete obj.p // true删除对象属性
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 标准库 Math和Date
|
|
|
|
|
|
### (1)Math
|
|
|
|
|
|
Math是 JavaScript 的**原生对象**,提供各种数学功能。**该对象不是构造函数**,不能生成实例,所有的属性和方法都必须在Math对象上调用。
|
|
|
|
|
|
#### 静态属性
|
|
|
|
|
|
Math对象的静态属性,提供以下一些数学常数。
|
|
|
|
|
|
> Math.E:常数e。
|
|
|
> Math.LN2:2 的自然对数。
|
|
|
> Math.LN10:10 的自然对数。
|
|
|
> Math.LOG2E:以 2 为底的e的对数。
|
|
|
> Math.LOG10E:以 10 为底的e的对数。
|
|
|
> Math.PI:常数 Pi。
|
|
|
> Math.SQRT1_2:0.5 的平方根。
|
|
|
> Math.SQRT2:2 的平方根。
|
|
|
|
|
|
```js
|
|
|
Math.E // 2.718281828459045
|
|
|
Math.LN2 // 0.6931471805599453
|
|
|
Math.LN10 // 2.302585092994046
|
|
|
Math.LOG2E // 1.4426950408889634
|
|
|
Math.LOG10E // 0.4342944819032518
|
|
|
Math.PI // 3.141592653589793
|
|
|
Math.SQRT1_2 // 0.7071067811865476
|
|
|
Math.SQRT2 // 1.4142135623730951
|
|
|
```
|
|
|
|
|
|
这些属性都是只读的,不能修改。
|
|
|
|
|
|
#### 静态方法
|
|
|
|
|
|
Math对象提供以下一些静态方法。
|
|
|
|
|
|
> Math.abs():绝对值
|
|
|
> Math.ceil():向上取整
|
|
|
> Math.floor():向下取整
|
|
|
> Math.max():最大值
|
|
|
> Math.min():最小值 Math.max方法返回参数之中最大的那个值,Math.min返回最小的那个值。如果参数为空, Math.min返回Infinity, Math.max返回-Infinity。
|
|
|
> Math.pow():指数运算 Math.pow方法返回以第一个参数为底数、第二个参数为幂的指数值。
|
|
|
> Math.sqrt():平方根
|
|
|
> Math.log():自然对数
|
|
|
> Math.exp():e的指数
|
|
|
> Math.round():四舍五入
|
|
|
> Math.random():随机数 返回0到1之间的一个伪随机数,可能等于0,但是一定小于1。
|
|
|
|
|
|
#### 三角函数方法
|
|
|
|
|
|
Math对象还提供一系列三角函数方法。
|
|
|
|
|
|
> Math.sin():返回参数的正弦(参数为弧度值)
|
|
|
> Math.cos():返回参数的余弦(参数为弧度值)
|
|
|
> Math.tan():返回参数的正切(参数为弧度值)
|
|
|
> Math.asin():返回参数的反正弦(返回值为弧度值)
|
|
|
> Math.acos():返回参数的反余弦(返回值为弧度值)
|
|
|
> Math.atan():返回参数的反正切(返回值为弧度值)
|
|
|
|
|
|
### (2) Date
|
|
|
|
|
|
#### 普通函数的用法
|
|
|
|
|
|
Date对象可以作为普通函数直接调用,返回一个代表当前时间的字符串。
|
|
|
|
|
|
```js
|
|
|
Date()
|
|
|
// "Tue Dec 01 2015 09:34:43 GMT+0800 (CST)"
|
|
|
```
|
|
|
|
|
|
注意,即使带有参数,Date作为普通函数使用时,返回的还是当前时间。
|
|
|
|
|
|
```js
|
|
|
Date(2000, 1, 1)
|
|
|
// "Tue Dec 01 2015 09:34:43 GMT+0800 (CST)"
|
|
|
```
|
|
|
|
|
|
上面代码说明,无论有没有参数,直接调用Date总是返回当前时间。
|
|
|
|
|
|
|
|
|
|
|
|
#### 构造函数的用法
|
|
|
|
|
|
Date还可以当作构造函数使用。对它使用new命令,会返回一个Date对象的实例。如果不加参数,实例代表的就是当前时间。
|
|
|
|
|
|
```js
|
|
|
var today = new Date();
|
|
|
```
|
|
|
|
|
|
Date实例有一个独特的地方。其他对象求值的时候,都是默认调用.valueOf()方法,但是Date实例求值的时候,默认调用的是toString()方法。这导致对Date实例求值,返回的是一个字符串,代表该实例对应的时间。
|
|
|
|
|
|
```js
|
|
|
var today = new Date();
|
|
|
|
|
|
today
|
|
|
// "Tue Dec 01 2015 09:34:43 GMT+0800 (CST)"
|
|
|
|
|
|
// 等同于
|
|
|
today.toString()
|
|
|
// "Tue Dec 01 2015 09:34:43 GMT+0800 (CST)"
|
|
|
```
|
|
|
|
|
|
作为构造函数时,Date对象可以接受多种格式的参数,返回一个该参数对应的时间实例。
|
|
|
|
|
|
```js
|
|
|
// 参数为时间零点开始计算的毫秒数
|
|
|
new Date(1378218728000)
|
|
|
// Tue Sep 03 2013 22:32:08 GMT+0800 (CST)
|
|
|
|
|
|
// 参数为日期字符串
|
|
|
new Date('January 6, 2013');
|
|
|
// Sun Jan 06 2013 00:00:00 GMT+0800 (CST)
|
|
|
|
|
|
// 参数为多个整数,
|
|
|
// 代表年、月、日、小时、分钟、秒、毫秒
|
|
|
new Date(2013, 0, 1, 0, 0, 0, 0)
|
|
|
// Tue Jan 01 2013 00:00:00 GMT+0800 (CST)
|
|
|
```
|
|
|
|
|
|
关于Date构造函数的参数,有几点说明。
|
|
|
|
|
|
第一点,参数可以是负整数,代表1970年元旦之前的时间。
|
|
|
|
|
|
```js
|
|
|
new Date(-1378218728000)
|
|
|
// Fri Apr 30 1926 17:27:52 GMT+0800 (CST)
|
|
|
```
|
|
|
|
|
|
第二点,只要是能被Date.parse()方法解析的字符串,都可以当作参数。
|
|
|
|
|
|
```js
|
|
|
new Date('2013-2-15')
|
|
|
new Date('2013/2/15')
|
|
|
new Date('02/15/2013')
|
|
|
new Date('2013-FEB-15')
|
|
|
new Date('FEB, 15, 2013')
|
|
|
new Date('FEB 15, 2013')
|
|
|
new Date('Feberuary, 15, 2013')
|
|
|
new Date('Feberuary 15, 2013')
|
|
|
new Date('15 Feb 2013')
|
|
|
new Date('15, Feberuary, 2013')
|
|
|
// Fri Feb 15 2013 00:00:00 GMT+0800 (CST)
|
|
|
```
|
|
|
|
|
|
上面多种日期字符串的写法,返回的都是同一个时间。
|
|
|
|
|
|
第三,参数为年、月、日等多个整数时,年和月是不能省略的,其他参数都可以省略的。也就是说,这时至少需要两个参数,因为如果只使用“年”这一个参数,Date会将其解释为毫秒数。
|
|
|
|
|
|
```js
|
|
|
new Date(2013)
|
|
|
// Thu Jan 01 1970 08:00:02 GMT+0800 (CST)
|
|
|
```
|
|
|
|
|
|
上面代码中,2013被解释为毫秒数,而不是年份。
|
|
|
|
|
|
```js
|
|
|
new Date(2013, 0)
|
|
|
// Tue Jan 01 2013 00:00:00 GMT+0800 (CST)
|
|
|
new Date(2013, 0, 1)
|
|
|
// Tue Jan 01 2013 00:00:00 GMT+0800 (CST)
|
|
|
new Date(2013, 0, 1, 0)
|
|
|
// Tue Jan 01 2013 00:00:00 GMT+0800 (CST)
|
|
|
new Date(2013, 0, 1, 0, 0, 0, 0)
|
|
|
// Tue Jan 01 2013 00:00:00 GMT+0800 (CST)
|
|
|
```
|
|
|
|
|
|
上面代码中,不管有几个参数,返回的都是2013年1月1日零点。
|
|
|
|
|
|
最后,各个参数的取值范围如下。
|
|
|
|
|
|
> 年:使用四位数年份,比如2000。如果写成两位数或个位数,则加上1900,即10代表1910年。如果是负数,表示公元前。
|
|
|
> 月:0表示一月,依次类推,11表示12月。
|
|
|
> 日:1到31。
|
|
|
> 小时:0到23。
|
|
|
> 分钟:0到59。
|
|
|
> 秒:0到59
|
|
|
> 毫秒:0到999。
|
|
|
|
|
|
注意,月份从0开始计算,但是,天数从1开始计算。另外,除了日期的默认值为1,小时、分钟、秒钟和毫秒的默认值都是0。
|
|
|
|
|
|
这些参数如果超出了正常范围,会被自动折算。比如,如果月设为15,就折算为下一年的4月。
|
|
|
|
|
|
```js
|
|
|
new Date(2013, 15)
|
|
|
// Tue Apr 01 2014 00:00:00 GMT+0800 (CST)
|
|
|
new Date(2013, 0, 0)
|
|
|
// Mon Dec 31 2012 00:00:00 GMT+0800 (CST)
|
|
|
```
|
|
|
|
|
|
上面代码的第二个例子,日期设为0,就代表上个月的最后一天。
|
|
|
|
|
|
参数还可以使用负数,表示扣去的时间。
|
|
|
|
|
|
```js
|
|
|
new Date(2013, -1)
|
|
|
// Sat Dec 01 2012 00:00:00 GMT+0800 (CST)
|
|
|
new Date(2013, 0, -1)
|
|
|
// Sun Dec 30 2012 00:00:00 GMT+0800 (CST)
|
|
|
```
|
|
|
|
|
|
#### 日期的运算
|
|
|
|
|
|
类型自动转换时,Date实例如果转为数值,则等于对应的毫秒数;如果转为字符串,则等于对应的日期字符串。所以,两个日期实例对象进行减法运算时,返回的是它们间隔的毫秒数;进行加法运算时,返回的是两个字符串连接而成的新字符串。
|
|
|
|
|
|
```js
|
|
|
var d1 = new Date(2000, 2, 1);
|
|
|
var d2 = new Date(2000, 3, 1);
|
|
|
|
|
|
d2 - d1
|
|
|
// 2678400000
|
|
|
d2 + d1
|
|
|
// "Sat Apr 01 2000 00:00:00 GMT+0800 (CST)Wed Mar 01 2000 00:00:00 GMT+0800 (CST)"
|
|
|
```
|
|
|
|
|
|
#### 静态方法
|
|
|
|
|
|
##### Date.now()
|
|
|
|
|
|
Date.now方法返回当前时间距离时间零点(1970年1月1日 00:00:00 UTC)的毫秒数,相当于 Unix 时间戳乘以1000。
|
|
|
|
|
|
```js
|
|
|
Date.now() // 1364026285194
|
|
|
```
|
|
|
|
|
|
##### Date.parse()
|
|
|
|
|
|
Date.parse方法用来解析日期字符串,返回该时间距离时间零点(1970年1月1日 00:00:00)的毫秒数。
|
|
|
|
|
|
日期字符串应该符合 RFC 2822 和 ISO 8061 这两个标准,即YYYY-MM-DDTHH:mm:ss.sssZ格式,其中最后的Z表示时区。但是,其他格式也可以被解析,请看下面的例子。
|
|
|
|
|
|
```js
|
|
|
Date.parse('Aug 9, 1995')
|
|
|
Date.parse('January 26, 2011 13:51:50')
|
|
|
Date.parse('Mon, 25 Dec 1995 13:30:00 GMT')
|
|
|
Date.parse('Mon, 25 Dec 1995 13:30:00 +0430')
|
|
|
Date.parse('2011-10-10')
|
|
|
Date.parse('2011-10-10T14:48:00')
|
|
|
```
|
|
|
|
|
|
上面的日期字符串都可以解析。
|
|
|
|
|
|
如果解析失败,返回NaN。
|
|
|
|
|
|
```js
|
|
|
Date.parse('xxx') // NaN
|
|
|
```
|
|
|
|
|
|
#### 实例方法
|
|
|
|
|
|
Date的实例对象,有几十个自己的方法,除了valueOf和toString,可以分为以下三类。
|
|
|
|
|
|
> to类:从Date对象返回一个字符串,表示指定的时间。
|
|
|
> get类:获取Date对象的日期和时间。
|
|
|
> set类:设置Date对象的日期和时间。
|
|
|
|
|
|
##### Date.prototype.valueOf()
|
|
|
|
|
|
valueOf方法返回实例对象距离时间零点(1970年1月1日00:00:00 UTC)对应的毫秒数,该方法等同于getTime方法。
|
|
|
|
|
|
```js
|
|
|
var d = new Date();
|
|
|
|
|
|
d.valueOf() // 1362790014817
|
|
|
d.getTime() // 1362790014817
|
|
|
```
|
|
|
|
|
|
预期为数值的场合,Date实例会自动调用该方法,所以可以用下面的方法计算时间的间隔。
|
|
|
|
|
|
```js
|
|
|
var start = new Date();
|
|
|
// ...
|
|
|
var end = new Date();
|
|
|
var elapsed = end - start;
|
|
|
```
|
|
|
|
|
|
##### get 类方法
|
|
|
|
|
|
Date对象提供了一系列get*方法,用来获取实例对象某个方面的值。
|
|
|
|
|
|
> getTime():返回实例距离1970年1月1日00:00:00的毫秒数,等同于valueOf方法。
|
|
|
> getDate():返回实例对象对应每个月的几号(从1开始)。
|
|
|
> getDay():返回星期几,星期日为0,星期一为1,以此类推。
|
|
|
> getYear():返回距离1900的年数。
|
|
|
> getFullYear():返回四位的年份。
|
|
|
> getMonth():返回月份(0表示1月,11表示12月)。
|
|
|
> getHours():返回小时(0-23)。
|
|
|
> getMilliseconds():返回毫秒(0-999)。
|
|
|
> getMinutes():返回分钟(0-59)。
|
|
|
> getSeconds():返回秒(0-59)。
|
|
|
> getTimezoneOffset():返回当前时间与 UTC 的时区差异,以分钟表示,返回结果考虑到了夏令时因素。
|
|
|
|
|
|
所有这些get*方法返回的都是整数,不同方法返回值的范围不一样。
|
|
|
|
|
|
> 分钟和秒:0 到 59 小时:0 到 23 星期:0(星期天)到 6(星期六) 日期:1 到 31 月份:0(一月)到 11(十二月) 年份:距离1900年的年数
|
|
|
|
|
|
```js
|
|
|
var d = new Date('January 6, 2013');
|
|
|
|
|
|
d.getDate() // 6
|
|
|
d.getMonth() // 0
|
|
|
d.getYear() // 113
|
|
|
d.getFullYear() // 2013
|
|
|
```
|
|
|
|
|
|
下面是一个例子,计算本年度还剩下多少天。
|
|
|
|
|
|
```js
|
|
|
function leftDays() {
|
|
|
var today = new Date();
|
|
|
var endYear = new Date(today.getFullYear(), 11, 31, 23, 59, 59, 999);
|
|
|
var msPerDay = 24 * 60 * 60 * 1000;
|
|
|
return Math.round((endYear.getTime() - today.getTime()) / msPerDay);
|
|
|
}
|
|
|
```
|
|
|
|
|
|
##### set 类方法
|
|
|
|
|
|
Date对象提供了一系列set*方法,用来设置实例对象的各个方面。
|
|
|
|
|
|
> setDate(date):设置实例对象对应的每个月的几号(1-31),返回改变后毫秒时间戳。
|
|
|
> setYear(year): 设置距离1900年的年数。
|
|
|
> setFullYear(year [, month, date]):设置四位年份。
|
|
|
> setHours(hour [, min, sec, ms]):设置小时(0-23)。
|
|
|
> setMilliseconds():设置毫秒(0-999)。
|
|
|
> setMinutes(min [, sec, ms]):设置分钟(0-59)。
|
|
|
> setMonth(month [, date]):设置月份(0-11)。
|
|
|
> setSeconds(sec [, ms]):设置秒(0-59)。
|
|
|
> setTime(milliseconds):设置毫秒时间戳。
|
|
|
|
|
|
这些方法基本是跟get*方法一一对应的,但是没有setDay方法,因为星期几是计算出来的,而不是设置的。另外,需要注意的是,凡是涉及到设置月份,都是从0开始算的,即0是1月,11是12月。
|
|
|
|
|
|
|
|
|
|
|
|
## DOM
|
|
|
|
|
|
|