前言
这是对平时的一些读书笔记和理解进行整理的第二部分,第一部分请前往:JS知识点整理(一)。本文包含一些易混淆、遗漏的知识点,也会配上一些例子,也许不是很完整,也许还会有点杂,但也许会有你需要的,后续会持续更新,喜欢就关注一下喽!
三、运算符
3.1运算符
1.易忽略的例子:
let obj = { x: 1, y: 2};
"toString" in obj; //true obj继承了toString()方法且in能遍历原型上的不可枚举属性
let arr =[ 3, 6 ,8];
"0" in arr; //true 数组包含有0索引属性
2.运算子的不同,导致了不同的语法行为,这种现象称为“重载”(overload)。加号会发生重载,因为加号可当成加法运算,也可作为字符串连接符,而减法,除法和乘法不会发送重载,因为都是作为数学运算使用。
3.余数运算符(%)的运算结果的正负号由第一个运算子的正负号决定:
-1 % 2 // -1
1 % -2 // 1
10 % 0 // NaN
10 % '0' // NaN
10 % 1 // 0
2 % 3 // 2
-
with
:用于设置代码在特定对象中的作用域。 -
eval
:可计算某个字符串,并执行其中的的 JavaScript 代码。 -
void
:作用是执行一个表达式,然后不返回任何值,或者说返回undefined。 -
逗号运算符:用于对两个表达式求值,并返回后一个表达式的值。
'a', 'b' // "b"
var x = 0;
var y = (x++, 10);
x; // 1
y; // 10
5.优先级:!> && > || > 三目运算符,等号优先级较低,逗号优先级更低。
//例一:
true || false && false
//相当于:
true || (false && false) // true
//例二:
var a = 42, b;
b = (a++, a); // 因为括号包了起来,优先级比=高,所以优先运算括号内的结果,先a++,然后再a,得到结果后再赋值给b
a; // 43
b; // 43
6.三目运算符可适当代替if else。
四、内置对象
4.1 Date
1.Date
对象是JavaScript原生的时间库。它以1970年1月1日00:00:00作为时间的零点,可以表示的时间范围是前后各1亿天(单位为毫秒),是构造函数。
2.直接调用Date总是返回当前时间,为字符串,且传入参数无效:
Date(); // "Wed Feb 19 2018 16:57:42 GMT+0800 (中国标准时间)"
Date(2000, 1, 1); // "Wed Feb 19 2018 16:57:42 GMT+0800 (中国标准时间)"
3.new Date()
返回当前日期,为对象,也可接受多种格式的参数,返回一个该参数对应的时间实例:
- ①不传入参数:
new Date(); // Wed Dec 19 2018 17:03:59 GMT+0800 (中国标准时间)
- ②参数为时间零点开始计算的毫秒数:
new Date(1378218728000); // Tue Sep 03 2013 22:32:08 GMT+0800 (中国标准时间)
- ③参数也可为负整数,代表1970年元旦之前的时间:
new Date(-1378218728000); // Fri Apr 30 1926 17:27:52 GMT+0800 (中国标准时间)
- ④参数为多个整数,代表年、月、日、小时、分钟、秒、毫秒:
new Date(2018, 0, 1, 0, 0, 0, 0); // Mon Jan 01 2018 00:00:00 GMT+0800 (中国标准时间)
- ⑤参数为日期字符串,可以以空格隔开或者逗号隔开,可以2018,1,2顺序或者1,2,2018顺序,如果输入数值不规范,会自动溢出,如2月没有30号,会自动溢出为3月1号:
new Date('January 6, 2018'); // Sat Jan 06 2018 00:00:00 GMT+0800 (中国标准时间)
- ⑥只要是能被Date.parse()方法解析的字符串,都可以当作参数:
new Date('2018-2-15')
new Date('2018/2/15')
new Date('02/15/2018')
new Date('2018-FEB-15')
new Date('FEB, 15, 2018')
new Date('FEB 15, 2018')
new Date('Feberuary, 15, 2018')
new Date('Feberuary 15, 2018')
new Date('15 Feb 2018')
new Date('15, Feberuary, 2018')
// Thu Feb 15 2018 00:00:00 GMT+0800 (中国标准时间)
4.Date.now()
:
//Date.now方法返回当前时间距离时间零点(1970年1月1日 00:00:00 UTC)的毫秒数
Date.now() // 1545211158395
Date.now() === new Date().getTime() // true
5.Date.parse()
:
Date.parse
方法用来解析日期字符串,返回该时间距离时间零点(1970年1月1日 00:00:00)的毫秒数:
Date.parse('Aug 9, 2018')
Date.parse('January 26, 2018 13:51:50')
Date.parse('Mon, 25 Dec 2018 13:30:00 GMT')
Date.parse('Mon, 25 Dec 2018 13:30:00 +0430')
Date.parse('2018-10-10')
Date.parse('2018-10-10T14:48:00')
6.数据接口一般使用时间戳,因为时间戳在哪个时区都是一样的。
7.可以将日期的内部表达形式当成一个整数类型的timestamp
, 而其他的表达形式只不过是这种内部形式的‘糖衣’,所以new Date()
实例的valueOf()
返回的是一个timestamp
就很容易理解了:
new Date().valueOf(); // 1542004695697
// 所以new Date()转换为整型只需要一个加号+,因为会自动调用valueOf()方法。
//以上等同于以下方式:
var d = new Date();
d.valueOf(); // 1542004695697
d.getTime(); // 1542004695697
Date.parse(d); // 1542004695697
Date.now(); // 1542004695697
8.get
方法:
getTime()
:返回实例距离1970年1月1日00:00:00的毫秒数,等同于valueOf方法。getYear()
:返回距离1900的年数。getFullYear()
:返回四位的年份。getMonth()
:返回月份(0表示1月,11表示12月)。getDate()
:返回实例对象对应每个月的几号(从1开始)。getDay()
:返回星期几,星期日为0,星期一为1,以此类推。getHours()
:返回小时(0-23)。getMinutes()
:返回分钟(0-59)。getSeconds()
:返回秒(0-59)。getMilliseconds()
:返回毫秒(0-999)。getTimezoneOffset()
:返回当前时间与 UTC 的时区差异,以分钟表示,返回结果考虑到了夏令时因素。
9.set
方法:
setTime(milliseconds)
:设置毫秒时间戳。setYear(year)
: 设置距离1900年的年数。setFullYear(year [, month, date])
:设置四位年份。setMonth(month [, date])
:设置月份(0-11)。setDate(date)
:设置实例对象对应的每个月的几号(1-31),返回改变后毫秒时间戳。setHours(hour [, min, sec, ms])
:设置小时(0-23)。setMinutes(min [, sec, ms])
:设置分钟(0-59)。setSeconds(sec [, ms])
:设置秒(0-59)。setMilliseconds()
:设置毫秒(0-999)。
var d = new Date();
// 将年份设为去年:
d.setFullYear(d.getFullYear() - 1);
// 将日期向后推1000天:
d.setDate(d.getDate() + 1000);
// 将时间设为6小时后:
d.setHours(d.getHours() + 6);
10.UTC时间比北京时间晚8小时。
4.2 Math
1.Math
是 JavaScript 的原生对象,提供各种数学功能。该对象不是构造函数,不能生成实例,所有的属性和方法都必须在Math对象上调用。
2.Math.random()
得到的是包括0但不包括1的随机数。
- ①取随机数: [2, 10)
Math.random() * 8 + 2; // 因为至少是大于或等于2,所以要加上2,同时又不能大于10,所以只能乘上8来保证小于8,然后加上2得到小于10的数
- ②取随机数:(2, 10]
function f() {
let a = Math.random() * 8 + 2, b;
b = 12 - a; // a肯定是一个大于等于2但小于10的数,所以b为大于2但小于等于10的数
return b;
}
f(); // 8.199542416221309
- ③取随机数:(2, 10)
function getNumber() {
let a = Math.random(), b = 2, c;
while(a === 0){
a = Math.random();
}
c = a * 8 + b;
return c;
}
getNumber(); // 6.153494475244344
- ④取随机整数: [2, 10]的整数
Math.floor(Math.random() * 9 + 2); // 乘以个数再加上第一个数(第一个可能的值)
// 加2保证了至少等于2,而随机数乘9能得到不到于9的数,然后两者相加取整后能保证最大就是10
3.Math.max()
- ①取最大数:
Math.max.apply(null, [1,2,3]);
- ②确保一个合法的月份值:
Math.max(Math.min(1, 'input输入值如果不在1-2的范围内)', 12);
4.3 RegExp
1.全称:regular expression。
2.修饰符:g, i, m, u, y
3.元字符:
- ①点字符
.
匹配除回车( )、换行( ) 、行分隔符(u2028)和段分隔符(u2029)以外的所有字符。 - ②
^
表示字符串的开始位置。/^test/.test('test123'); // true
- ③
$
表示字符串的结束位置。/test$/.test('new test'); // true
- ④竖线符号
|
在正则表达式中表示"或关系"(OR)。/11|22/.test('911') // true
4.量词符:用来设定某个模式出现的次数。
?
问号表示某个模式出现0次或1次,等同于{0, 1}*
星号表示某个模式出现0次或多次,等同于{0,}+
加号表示某个模式出现1次或多次,等同于{1,}
// t 出现0次或1次
/t?est/.test('test') // true
/t?est/.test('est') // true
// t 出现0次或多次
/t*est/.test('test') // true
/t*est/.test('ttest') // true
// t 出现1次或多次
/t+est/.test('test') // true
/t+est/.test('ttest') // true
/t+est/.test('est') // false
5.转义符:
需要反斜杠转义的一共有12个字符:^、.、[、$、(、)、|、*、+、?、{、\
6.特殊字符:
[]
匹配退格键(U+0008),不要与混淆v
匹配垂直制表符(U+000B)f
匹配换页符(U+000C)