JavaScript-标准对象
标准对象
JS中,一切皆对象
.
使用typeof
操作符可以获取对象类型.
1 |
|
null
,array
,通常意义的对象{}
都是object
包装对象
除了上面的类型,JS还提供包装对象
.
1 |
|
虽然包装对象的出来的值可以与原来的保持一致,但是对象类型一律都会变为object
,如果与原始值用===
比较会返回false
.
所以不要使用包装对象!尤其是针对string类型
new
操作符主要用于创建一个用户定义的对象类型的实例,如果不用new
, Number()
,Boolean()
,String()
就会被当做普通函数,把任何类型的数据转换成Number
,Boolean
和string
.
1 |
|
总结一下:
不要使用
new Number()
,new Boolean()
,new String()
创建包装对象用
parseInt()
或parseFloat()
来转换任意类型到number
用
String()
或来转换任意类型到string
,或者直接调用对象的toString()
方法除了
null
和undefined
,任何对象都有toString()
方法number
对象直接调用toString
方法会报错,需要用两个点
或者加括号
来调用1
2
3123.toString(); // SyntaxError
123..toString(); // 正确
(123).tiString(); // 正确不要问为什么,这就是JS.
通常不用把任意类型转换成
boolean
再判断,可以直接写if (myVar) {...}
typeof
可以判断出number
、boolean
、string
、function
和undefined
判断
Array
是使用Array.isArray(arr)
判断
null
请使用myVar === null
判断某个全局变量
是否存在
使用typeof window.myVar === 'undefined'
函数内部判断某个变量
是否存在
用typeof myVar == 'undefined'
Date
Date
对象用来表示日期和时间
1 |
|
新建一个指定日期时间的Date
对象
1 |
|
**注意:**是的没错,JS的月份范围是0-11
,0
是一月份
.
第二种创建指定日期和时间的方法是: 解析一个符合ISO 8601格式的字符串
1 |
|
**注意:**是的没错,获取的月份会-1
这是一个很坑爹的设计,估计当时JS设计者脑子一抽写成这样,但是现在要改回来已经是不可能了.
时区
date
对象表示的时间总是按浏览器所在时区显示.
1 |
|
正则表达式
RegExp
JS中使用正则有两种方式:
/正则表达式/
new RegExp('正则表达式')
1 |
|
第二种写法中,字符串转义,所以是\\
不论那种写法,都是RegExp
对象.
匹配
test()
方法判断是否匹配
1 |
|
切分字符串
1 |
|
\s
: 匹配空格
+
: 至少一个
1 |
|
[\s\,]
空格或者逗号
1 |
|
分组
()
表示要提取的分组(Group)
1 |
|
如果正则中定义了组,就可以在RegExp
对象上用exec()
方法提取子串.
exec()
匹配成功会返回一个Array,第一个元素就是整个字符串,后面就是匹配成功的分组子串
exec()
匹配失败返回null
下面看一个识别合法时间
的例子:
1 |
|
正则表达有时候写起来其实会很复杂,但是现在有AI.
贪婪匹配
正则默认是贪婪匹配
模式: 匹配尽可能多的字符
1 |
|
可以看到\d+
采用贪婪匹配,所以把后面的0
全匹配了,所以0*
就什么都匹配不到.
通过在量词
后面加?
停止贪婪匹配(尽可能少匹配)
1 |
|
非贪婪会导致更多回溯,也就是更多的性能消耗,所以尽可能用更精确的pattern而不是用非贪婪.
全局匹配
JS的特殊标记: g
表示全局匹配
1 |
|
全局匹配通过多次执行exec()
方法来搜索匹配到的字符.另外每次执行exec()
,都会更新lastIndex
属性,表示本次匹配到的最后索引
1 |
|
全局匹配类似搜索,所以不能使用
/^...$/
,那样只会最多匹配一次.
其他标志:
i
标志: 忽略大小写m
标志: 执行多行匹配
JSON
全称: JavaScript Object Notation,是一种数据交换格式.
在JSON出现之前,大家一直用XML来传递数据。因为XML是一种纯文本格式,所以它适合在网络上交换数据。XML本身不算复杂,但是,加上DTD、XSD、XPath、XSLT等一大堆复杂的规范以后,任何正常的软件开发人员碰到XML都会感觉头大了,最后大家发现,即使你努力钻研几个月,也未必搞得清楚XML的规范。
终于,在2002年的一天,道格拉斯·克罗克福特(Douglas Crockford)同学为了拯救深陷水深火热同时又被某几个巨型软件企业长期愚弄的软件工程师,发明了JSON这种超轻量级的数据交换格式.
JSON实际上JS的一个子集.在JSON中,一共就这么几种数据类型:
- number:和JavaScript的
number
完全一致; - boolean:就是JavaScript的
true
或false
; - string:就是JavaScript的
string
; - null:就是JavaScript的
null
; - array:就是JavaScript的
Array
表示方式——[]
; - object:就是JavaScript的
{ ... }
表示方式。 - 以及上面的任意组合.
同时JSON定死了字符集必须是UTF-8
,支持多语言.字符串和object的键也规定一定要使用""
,统一解析.
几乎所有语言都有解析JSON的库,在JS中,可以直接使用JSON,因为JS内置解析.
序列化
将编程语言的数据类型转成JSON类型,称为序列化
.
1 |
|
第二个参数
可用于筛选对象键值,比如只想输出name
和skills
:
1 |
|
还可以传入一个函数
,对象的每个键值对都会被函数优先处理
1 |
|
第三个参数
表示缩进,上面表示每层缩进
两个空格.
还可以通过定义一个toJSON
的方法,精确控制JSON想要序列化的数据
1 |
|
反序列化
将JSON转换成编程语言的对象,称为反序列化
JS使用JSON.parse()
实现
1 |
|
可以看出JSON.parse()
不仅可以转化json.
它还可以接收一个函数,用来转换解析出来的属性
1 |
|