在JavaScript的世界里,一切都是对象
一、对象类型:
有六种类型的对象:
number、string、boolean、function、undefined、object
typeof 123; // 'number'
typeof NaN; // 'number'
typeof 'str'; // 'string'
typeof true; // 'boolean'
typeof undefined; // 'undefined'
typeof Math.abs; // 'function'
typeof null; // 'object'
typeof []; // 'object'
typeof {}; // 'object'
typeof操作符可以判断出 number、boolean、string、function和undefined
判断 Array 使用 Array.isArray(arr);
判断 null 使用 myVar === null;
判断某个全局变量是否存在用 typeof window.myVar === 'undefined';
函数内部判断某个变量是否存在用 typeof myVar === 'undefined'
二、包装对象:
用new创建的对象
包装对象的类型变为了object。所以,包装对象和原始值用===比较会返回false
typeof new Number(123); // 'object'
new Number(123) === 123; // false
typeof new Boolean(true); // 'object'
new Boolean(true) === true; // false
typeof new String('str'); // 'object'
new String('str') === 'str'; // false
不要使用包装对象!尤其是针对string类型!
没有写new: Number()、Boolean和String()会把数据转换为number、boolean和string类型
1.不要使用new Number()、new Boolean()、new String()创建包装对象;
2.用parseInt()或parseFloat()来转换任意类型到number;
3.用String()来转换任意类型到string,或者直接调用某个对象的toString()方法;
【null和undefined没有toString()方法】
三、Date
var now = new Date();
now; // Wed Jun 24 2015 19:49:22 GMT+0800 (CST)
now.getFullYear(); // 2015, 年份
now.getMonth(); // 5, 月份,注意月份范围是0~11,5表示六月
now.getDate(); // 24, 表示24号
now.getDay(); // 3, 表示星期三
now.getHours(); // 19, 24小时制
now.getMinutes(); // 49, 分钟
now.getSeconds(); // 22, 秒
now.getMilliseconds(); // 875, 毫秒数
now.getTime(); // 1435146562875, 以number形式表示的时间戳
- 创建指定对象
1️⃣
月份值从0开始(0-11)
var d = new Date(2015, 5, 19, 20, 15, 30, 123);
d; // Fri Jun 19 2015 20:15:30 GMT+0800 (CST)
2️⃣
解析一个符合ISO 8601格式的字符串( 返回时间戳 )
var d = Date.parse('2015-06-24T19:49:22.875+08:00');
d; // 1435146562875
var d = new Date(1435146562875);
d; // Wed Jun 24 2015 19:49:22 GMT+0800 (CST)
d.getMonth(); // 5
使用Date.parse()时传入的字符串使用实际月份01-12,
转换为Date对象后 getMonth()获取的月份值为0~11。
- 时区转换
时间戳可以精确地表示一个时刻,并且与时区无关。
任何浏览器都可以把一个时间戳正确转换为本地时间。
时间戳是一个自增的整数,它表示从1970年1月1日零时整的GMT时区开始的那一刻,到现在的毫秒数。
var d = new Date(1435146562875);
d.toLocaleString(); // '2015/6/24 下午7:49:22',本地时间(北京时区+8:00),显示的字符串与操作系统设定的格式有关
d.toUTCString(); // 'Wed, 24 Jun 2015 11:49:22 GMT',UTC时间,与本地时间相差8小时
- 获取当前时间戳
if (Date.now) {
console.log(Date.now()); // 老版本IE没有now()方法
} else {
console.log(new Date().getTime());
}
四、RegExp 正则表达式
1️⃣ 一些规则:
-
\d
匹配一个数字,.
匹配任意字符,\s
匹配空白字符 -
\w
匹配一个字母或数字,\W
:匹配非单词字符,等价于[^a-zA-Z0-9_]
, -
用
*
表示任意个字符(包括0个),用+
表示至少一个字符,用?
表示0个或1个字符,用{n}
表示n个字符,用{n,m}
表示n-m个字符 -
特殊字符,要用
'\'
转义 -
用
[]
表示范围 -
断言:
^
表示行的开头,$
表示行的结束,\d$
表示必须以数字结束。
\b
匹配一个单词的边界,\B
匹配非单词边界
x(?=y)
:向前断言:x 被 y 跟随时匹配
x(?!y)
:向前否定断言: x 没有被 y 紧随时匹配
(?<=y)x
:向后断言: x 跟随 y 的情况下匹配
(?<!y)x
:向后否定断言: x 不跟随 y 时匹配
2️⃣ 创建正则表达式,两种写法是一样的
——直接通过/正则表达式/
写出来
——通过new RegExp('正则表达式')
创建一个RegExp对象
3️⃣ RegExp对象的 test() 方法用于测试给定的字符串是否符合条件。如果字符串中含有匹配的文本,则返回 true,否则返回 false。
search() 方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串,并返回子串的起始位置。
var n = str.search(/Runoob/i);
var n = str.search("Runoob");
replace() 方法用于在字符串中用一些字符串替换另一些字符串,或替换一个与正则表达式匹配的子串。
var txt = str.replace(/microsoft/i,"Runoob");
var txt = str.replace("Microsoft","Runoob");
match() :匹配,没有匹配到则返回null
4️⃣ 操作字符串
- 切分字符串
'a,b;; c d'.split(/[\s\,\;]+/); // ['a', 'b', 'c', 'd']
- 提取子串
用()表示要提取的分组,如果正则表达式中定义了组,就可以在RegExp对象上用exec()方法提取出子串来
var re = /^(\d{3})-(\d{3,8})$/;
re.exec('010-12345'); // ['010-12345', '010', '12345']
re.exec('010 12345'); // null
exec()方法在匹配成功后,会返回一个Array,第一个元素是正则表达式匹配到的整个字符串,后面的字符串表示匹配成功的子串。匹配失败时返回null。
5️⃣ 贪婪匹配
正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符
- 加个
?
就可以让\d+
采用非贪婪匹配
6️⃣ 全局搜索
g
,表示全局匹配
var r1 = /test/g;
// 等价于:
var r2 = new RegExp('test', 'g');
全局匹配可以多次执行exec()方法来搜索一个匹配的字符串。
当我们指定g标志后,每次运行exec()
,正则表达式本身会更新lastIndex
属性,表示上次匹配到的最后索引。
全局匹配类似搜索,因此不能使用/^...$/
,那样只会最多匹配一次。
7️⃣ 其他
i
标志,表示忽略大小写
m
标志,表示执行多行匹配
五、JSON
JSON定死了字符集必须是UTF-8
字符串规定必须用双引号"“,Object的键也必须用双引号”"。
JavaScript内置了JSON的解析。
- 对象序列化成JSON格式的字符串
var s = JSON.stringify(data);
有第二个参数:
可用于筛选键值,如果我们只想输出指定的属性,可以传入Array
还可以传入一个函数,这样对象的每个键值对都会被函数先处理
- 反序列化
将JSON格式的字符串变成JavaScript对象
JSON.parse()
JSON.parse()还可以接收一个函数,用来转换解析出的属性
var obj = JSON.parse('{"name":"小明","age":14}', function (key, value) {});