一.坑爹的Javascript体系
之前我们提过,JS由三部分组成,分别是ECMAScript,DOM 和BOM。前面我们讲JS的数据类型,运算符,对象,变量,函数,执行结构等等都属于ECMAScript中定义的规范,但是DOM是W3C制定的规范,而BOM呢,至今还不是很规范。
二.BOM
之前我们说JavaScript的核心是ECMAScript,不过那只是他的语法核心。
BOM(Browser Object Document)是与浏览器窗口进行交互的对象,
所以JS真正在网页上的核心应该算是BOM.
BOM的结构图:
由图可见,BOM的顶级父类是window对象。但是window对象很有趣,
它既是通过javascript访问浏览器窗口的一个接口,又是ECMAScript规定的全局对象。
window对象表示浏览器的一个实例,代表当前窗口。
因为他是一个顶级对象,所以定义在全局作用域中的变量、函数都会变成window对象的属性和方法,在调用的时候可以省略window。 比如 document对象事实上就是window.document, alert()函数就是window.alert();
window对象有几个常用的属性和方法:
1.定时器(2种):setTimeout(),setInterval()
setTimeout() 表示在指定的毫秒数后调用函数或计算表达式;
setInterval()表示在每隔指定的毫秒数循环调用函数或表达式,直到clearInterval把它清除。
关于这2个方法的区别,看这里:http://blog.csdn.net/lijiajun_blog/article/details/53495543
一般浏览器都有这几个线程:
JS引擎线程(用于处理JS)
GUI渲染线程(用于页面渲染)
事件触发线程(用于控制交互)
HTTP请求线程(用于处理http请求)
其中,JS引擎线程与GUI渲染线程是互斥的,原因是JS引擎线程可以操作DOM,会影响GUI页面渲染。也就是说当JS引擎线程处于运行状态时,GUI渲染线程将处于挂起状态。
而JS引擎线程是基于事件驱动的,采用的是单线程运行机制。即JS引擎会按顺序的从任务列表中执行,然后唤醒池中的异步队列。
在HTML5 中提出了工作线程(Web Worker)的概念,可以在JS主线程中定义工作线程,给工作线程发送消息让其开始工作。还有什么回调函数之类的。
如果页面是由框架页组成的,那么各自的框架页都算一个window对象,并且保存在frames集合中。在frames集合中,可以通过数值索引(从0开始,从左到右,从上到下)或者框架名称来访问相应的window对象(例如window.frames[0])。每个window对象都有一个name属性,包含着框架页的名称。
top对象始终指向最外层的框架对象
parent对象始终指向当前window对象的父window对象
self对象始终指向window本身,self和window对象可以互换使用
2.location对象
location对象是window对象下的一个子对象,它表示载入窗口的URL。它既是window对象的属性,也是document对象的属性。window.location和document.location引用的是同一个对象。
常用属性与方法:
location.herf="www.baidu.com";//页面跳转到百度
location.reload(true); //从服务器重载当前页面
location.reload(false); //从浏览器缓存中重载当前页面
location.reload(); //从浏览器缓存中重载当前页面
3.history对象,navigator对象,screen对象
这3个都是window对象的子对象,不过都较少使用,navigator对象包含有关浏览器的信息,screen包含浏览器屏幕的信息
常用方法有:
history.go(-1); //后退一页
history.go(1);//前进一页
height: 获取整个屏幕的高。
screen.width : 获取整个屏幕的宽。
screen.availHeight: 整个屏幕的高减去系统部件的高
screen.availWidth : 整个屏幕的宽减去系统部件的宽
4.document对象
他是window对象的一个子对象,用来操作文档节点层次关系,我们一般用jQuery操作会比较多。
常见原生JS操作DOM
常见jQuery操作DOM
三.JS中的内置对象:这里说的内置对象是ES标准中的
1.Array,String,Map,Set(ES6新增):这些前面已经说过了。
2.Math对象(数学有关的):常用方法有:
Math.pow(n,m) n的m次方。
Math.abs(n) n到原点的距离(n的绝对值)。
Math.round(n) 四舍五入取整。
Math.floor(n) 地板函数(向下取整)。
Math.ceil(n) 天花板函数 (向上取整)。
Math.random() 返回0-1的随机数(取不到1)。
3.Date对象:日期有关,常用方法:
var date = new Date();
date.toLocaleString() 以当前本地格式显示时间。
date.getFullYear() 获取date对象的年份。
date.getMonth() 获取月份(0-11)对应1-12月。注意:月份从0开始
date.getDate() 获取日期。
date.getHours() 获取小时。
date.getMinutes() 获取分钟
date.getSeconds() 获取多少秒
date.getMilliSeconds() 毫秒数
date.getDay() 获取星期几(0-6) 对应 周天至周六。
date.getTime() 从1970年开始到时间日期的毫秒值(时间戳)
date.setFullYear 设置年份
4.RegExp(正则表达式)
创建正则表达式的2种方法:推荐用第1种
var re1 = /ABC-001/;
var re2 = new RegExp('ABC\-001');
re1; // /ABC-001/
re2; // /ABC-001/
其他的什么略过。。。
5.JSON(JavaScript Object Notation):
玩js不会JSON就相当于玩java不会面向对象。它是JS的一个子集,也就是说它的什么数据类型和JS是一样的。
JSON对象和JSON字符串的区别:
var jsonStr ='{"name":"Liza", "password":"123"}'; //JSON字符串
var jsonStr ={"name":"Liza", "password":"123"}; //JSON对象
//JSON数组
var packJson = [{"name":"Liza", "password":"123"}, {"name":"Mike", "password":"456"}];
常用方法:
1>把JS对象序列化成一个JSON格式的字符串:JSON.stringify(obj);
'use strict';
var xiaoming = {
name: '小明',
age: 14,
gender: true,
height: 1.65,
grade: null,
'middle-school': '"W3C" Middle School',
skills: ['JavaScript', 'Java', 'Python', 'Lisp']
};
var s = JSON.stringify(xiaoming); //{"name":"小明","age":14,"gender":true,"height":1.65,"grade":null,"middle-school":""W3C" Middle School","skills":["JavaScript","Java","Python","Lisp"]}
2>把JSON字符串反序列化为JS对象:JSON.parse()
JSON.parse('[1,2,3,true]'); // [1, 2, 3, true]
JSON.parse('{"name":"小明","age":14}'); // Object {name: '小明', age: 14}
JSON.parse('true'); // true
JSON.parse('123.45'); // 123.45
基础部分差不多了。。。