JavaScript学习笔记-(标准对象)
标准对象
我们用typeof操作符获取对象的类型,它总是返回一个字符串:
console.log(typeof NaN);// 'number'
console.log(typeof 'str');// 'string'
console.log(typeof true); // 'boolean'
console.log(typeof undefined);// 'undefined'
console.log(typeof Math.abs);// 'function'
console.log(typeof null);// 'object'
console.log(typeof []); // 'object'
console.log(typeof {}); // 'object'
1.包装对象
number、boolean和string都有包装对象。没错,在JavaScript中,字符串也区分string类型和它的包装类型。包装对象用new创建:
var a = new Number(123); // 123,生成了新的包装类型
console.log(a);//[Number: 123]
console.log(typeof a);//object
console.log(typeof 1234);//number
console.log('\n');
var b = new Boolean(true); // true,生成了新的包装类型
console.log(b);//[Boolean: true]
console.log(typeof b);//object
console.log(typeof true);//boolean
console.log('\n');
var c = new String('str'); // 'str',生成了新的包装类型
console.log(c);//[String: 'str']
console.log(typeof c);//object
console.log(typeof 'str');//string
console.log('\n');
//包装后类型变为object所以,包装对象和原始值用===比较会返回false
if (a===123){console.log('一样'); }else{console.log('不一样');};//不一样
一般不要使用包装对象!
此时,Number()、Boolean和String()被当做普通函数,把任何类型的数据转换为number、boolean和string类型(注意不是其包装类型)
var n = Number('123'); // 123,相当于parseInt()或parseFloat()
console.log(typeof n);//number
var n1 = String(123);
console.log(typeof n1);//string
注意点
- 不要使用new Number()、new Boolean()、new String()创建包装对象;
- 用parseInt()或parseFloat()来转换任意类型到number;
- 用String()来转换任意类型到string,或者直接调用某个对象的toString()方法;
- 通常不必把任意类型转换为boolean再判断,因为可以直接写if (myVar) {...};
- typeof操作符可以判断出number、boolean、string、function和undefined;
- 判断Array要使用Array.isArray(arr);
- 判断null请使用myVar === null;
- 判断某个全局变量是否存在用typeof window.myVar === 'undefined';
- 函数内部判断某个变量是否存在用typeof myVar === 'undefined'。
`转成string`
123..toString(); // '123', 注意是两个点!
(123).toString(); // '123'
===============================================
2.Date
Date对象用来表示日期和时间
//当前时间是浏览器从本机操作系统获取的时间,所以不一定准确
var now = new Date();
now; // Tue Aug 30 2016 14:36:44 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]时间的创建
1.使用Date()函数创建
var d = new Date(2015, 5, 19, 20, 15, 30, 123);
console.log(d);//Fri Jun 19 2015 20:15:30 GMT+0800 (CST)
注意创建的时候5就是5月,和获取的时候不一样
2.创建一个指定日期和时间的方法是解析一个符合ISO8601格式的字符串创建
var d = Date.parse('2015-12-24T19:49:22.875+08:00');
console.log(d);//是个时间戳1450957762875
var nomalTime = new Date(d);//时间戳转换成Date
console.log(nomalTime);
[2]时区
Date对象表示的时间总是按浏览器所在时区显示的,不过我们既可以显示本地时间,也可以显示调整后的UTC时间
var d = new Date(1435146562875);
console.log(d.toLocaleString());//6/24/2015, 7:49:22 PM 本地时间,显示的字符串与操作系统设定的格式有关
console.log(d.toUTCString()); // Wed, 24 Jun 2015 11:49:22 GMT
获取当前时间戳
if (Date.now) {
alert(Date.now()); // 老版本没有now()方法
} else {
alert(new Date().getTime());
}
3.RegExp
正则表达
\d
可以匹配一个数字
\w
可以匹配一个字母或数字
\s
可以匹配一个空格(也包括Tab等空白符)
.
可以匹配任意字符
\
转义特殊字符
^
表示行的开头,(举个栗子^\d
表示必须以数字开头)
$
表示行的结束,(举个栗子\d$
表示必须以数字结束)
[]
表示范围
*
表示任意个字符(包括0个)
+
表示至少一个字符
?
表示0个或1个字符
{n}
表示n个字符,
{n,m}
表示n-m个字符
JavaScript有两种方式创建一个正则表达式
1.直接通过/正则表达式/写出来
var re0 = /ABC\-001/;
var isOrNo = re0.test('ABC-001');
console.log(isOrNo);// true
2.new RegExp('正则表达式')创建一个RegExp对象
var re1 = new RegExp('ABC\\-001');//有两个`\`是因为JS中转义字符和正则表达式中的转义`\`
var isOrNo = re1.test('ABC-00');
console.log(isOrNo);// false
3.切分字符串
console.log('a b c'.split(' '));//[ 'a', 'b', '', '', 'c' ]
console.log('a b c'.split(/\s+/));//[ 'a', 'b', 'c' ]
4.分组
//正则表达式还有提取子串的强大功能。用()表示的就是要提取的分组会返回一个Array,第一个元素是正则表达式匹配到的整个字符串,后面的字符串表示匹配成功的子串。
var re = /^(\d{3})-(\d{3,8})$/;
var a = re.exec('010-12345'); // ['010-12345', '010', '12345']
console.log(a);//[ '010-12345', '010', '12345', index: 0, input: '010-12345' ]
var b = re.exec('010 12345'); // null
console.log(b);//null
5.贪婪匹配
正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。举例如下,匹配出数字后面的0
var re = /^(\d+)(0*)$/;
re.exec('102300'); // ['102300', '102300', '']
由于\d+采用贪婪匹配,直接把后面的0全部匹配了,结果0*只能匹配空字符串了。
必须让\d+采用非贪婪匹配(也就是尽可能少匹配),才能把后面的0匹配出来,加个?就可以让\d+采用非贪婪匹配:
var re = /^(\d+?)(0*)$/;
re.exec('102300'); // ['102300', '1023', '00']
6.全局搜索
JavaScript的正则表达式还有几个特殊的标志,最常用的是g,表示全局匹配:
全局匹配可以多次执行exec()方法来搜索一个匹配的字符串。当我们指定g标志后,每次运行exec(),正则表达式本身会更新lastIndex属性,表示上次匹配到的最后索引
var s = 'JavaScript, VBScript, JScript and ECMAScript';
var re=/[a-zA-Z]+Script/g;
// 使用全局匹配:
re.exec(s); // ['JavaScript']
re.lastIndex; // 10
re.exec(s); // ['VBScript']
re.lastIndex; // 20
re.exec(s); // ['JScript']
re.lastIndex; // 29
re.exec(s); // ['ECMAScript']
re.lastIndex; // 44
re.exec(s); // null,直到结束仍没有匹配到
4.JSON
在JSON中,一共就这么几种数据类型,以及任意组合
- number:和JavaScript的number完全一致;
- boolean:就是JavaScript的true或false;
- string:就是JavaScript的string;
- null:就是JavaScript的null;
- array:就是JavaScript的Array表示方式——[];
- object:就是JavaScript的{ ... }表示方式。
1.序列化(对象序列化成JSON格式的字符串)
function convert(key, value) {
if (typeof value === 'string') {
return value.toUpperCase();
}
return value;
}
var aDog = {
name: '单身狗',
age: '保密',
tags: ['性格好', '知书达理','😂','自己脸都红了'],
city: 'Shanghai',
form: '江苏',
hasCar: false,
zipcode: null,
fingers:20,
'ha-ha':"^_^"
};
>1. console.log(JSON.stringify(aDog));//{"name":"单身狗","age":"保密","tags":["性格好","知书达理","😂","自己脸都红了"],"city":"Shanghai","form":"江苏","hasCar":false,"zipcode":null,"fingers":20,"ha-ha":"^_^"}
>2. console.log(JSON.stringify(aDog,null,' '));//会好看点,传null
>3. console.log(JSON.stringify(aDog,['tags','age'],' '));//只想输出指定的属性tags age,传Arry
>4. console.log(JSON.stringify(aDog, convert, ' '));//如果key是string类型全部大写,传函数
>5. 如果想精确控制如何序列化(对象)aDog定义一个toJSON()的方法
var aDog = {
name: '单身狗',
age: '保密',
tags: ['性格好', '知书达理','😂','自己脸都红了'],
city: 'Shanghai',
form: '江苏',
hasCar: false,
zipcode: null,
fingers:20,
'ha-ha':"^_^",
toJSON:function(){
return {
'name': this.name//只输出name
};
}
};
console.log(JSON.stringify(aDog));//{"name":"单身狗"}
2.反序列化(JSON格式的字符串转成Js对象)
console.log(JSON.parse('[1,2,3,true]'));// [1, 2, 3, true]
console.log(JSON.parse('{"name":"小明","age":14}')); // Object {name: '小明', age: 14}
console.log(JSON.parse('true'));// true
console.log(JSON.parse('123.45')); // 123.45
>1. 直接使用JSON.parse()函数
>2. JSON.parse()还可以接收一个函数,用来转换解析出的属性
JSON.parse('{"name":"小明","age":14}', function (key, value) {
// 把number * 2:
if (key === 'age') {
return value + 30;
}
return value;
}); // Object { name: '小明', age: 44 }