JavaScript组成:
- 核心(ECMAScript)
- 文档对象模型(DOM)
- 浏览器对象模型(BOM)
ECMAScript ,由ECMA-262标准定义,提供核心语言功能。JavaScript实现了ECMAScript,Adobe ActionScript同样也实现了ECMAScript。
DOM,提供访问和操作网页内容的接口和方法。注意:DOM并不只是针对JavaScript的,很多别的语言也都实现了DOM。
BOM,提供访问和操作浏览器窗口的接口和方法。
在HTML中使用JavaScript
属性async
表示异步下载,立即执行脚本,但不应妨碍页面中的其他操作。只对外部脚本有效。
属性defer
表示开启新线程下载,延迟执行脚本。可以延迟到文档完全被解析和显示之后再执行。只对外部文件有效
HTML5规范引入了async属性,用于异步加载脚本。async和defer的相同点是采用并行下载,在下载过程中不会产生阻塞。区别在于执行时机不同,async是加载完成后立即执行。而defer需要等待页面加载完成后执行。《高性能JavaScript》
注意:带有src属性的<script>
元素不应该在其标签内包含额外的代码。否则嵌入的代码会被忽略,只执行外部脚本代码。
<noscript>
元素
包含在此元素中的内容,在下列情况下会显示出来:
- 浏览器不支持脚本
- 浏览器支持脚本,但脚本被禁用。
基本概念
语法
1.区分大小写
2.标识符
- 第一个字符必须是一个字母、下划线或者一个美元符号
- 其他字符可以是字母、下划线、美元或者数字
注意:不能把关键字、保留字、true
、false
和null
用作标识符
3.注释
// 单行注释
/*
多行注释
*/
4.严格模式
"use strict"
//或者
function doSomething(){
"use strict"
//函数体
}
5.语句
语句结尾增加分号
数据类型
5种基本数据类型:Undefined、Null、Number、Boolean、String
1种复杂数据类型:Object
typeof操作符
typeof是一个操作符而不是函数,因此圆括号可有可无
var message = 'something';
typeof message // -> "string"
typeof(message) // ->"string"
Undefined
在声明变量后未加以初始化时,这个变量的值是undefined
var age;
typeof age === 'undefined'; // true
age === undefined; //true
Null类型
null值表示一个空对象指针,而这正是使用typeof操作符检测null值时会返回object
的原因
typeof null // -> "object"
null == undefined // true
null === undefined // false
Boolean类型
转为false
的值有:""
(空字符串)、0
、NaN
、null
、undefined
、
Number类型
1.科学计数法
3.125e7 // 31250000
3e-7 // 0.0000003
2.数值范围
Number.MAX_VALUE
Number.MIN_VALUE
Number.NEGATIVE_INFINITY // -Infinity 负无穷大
Number.POSITIVE_INFINITY // Infinity 正无穷大
isFinite() // 此函数用于确定一个数值是不是有穷的,即是不是位于最小数和最大数之间
var result = Number.MAX_VALUE + Number.MAX_VALUE;
console.log(isFinite(result)); // false
3.NaN
即非数值(Not a Number)
在ECMAScript中,任何数值除以0会返回NaN,因此不会影响其他代码执行。
- 任何涉及与NaN的操作都返回NaN。
- NaN与任何值都不相等,包括NaN本身。
isNaN(true) // false
isNaN(false) // false
isNaN('') // false
true可以转换成数值1,false和‘’可以转换成数值0,因此函数返回false。
4.数制转换
有3个函数可以把非数值转为数值:Number()
、parseInt()
、parseFloat()
Number()可用于任何数据类型,其余两个专门用于把字符串转换成数值。
Number(null) // 0
Number(undefined) // NaN
Number('') // 0
语句
switch语句
var num = 25;
switch(true){
case num < 0:
console.log('Less than 0');
break;
case num <= 10:
console.log('between 0 and 10');
break;
case num <= 20:
console.log('between 10 and 20');
break;
default:
console.log('More than 20');
break;
}
switch语言传递的表达式为true,可以保证每个case按照顺序执行。
函数
ECMAScript函数不介意传递进来多少个参数,也不在乎传进来参数是什么数据类型。
在函数体内可以通过arguments
对象来访问这个参数数组。从而获取传递给函数的每一个参数。
变量、作用域和内存问题
基本类型和引用类型的值
复制变量值
当从一个变量向另一个变量复制引用类型的值时,同样也会将存储在变量对象中的值复制一份放到为新变量分配的空间中,不同的是这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一个对象。复制操作结束后,两个变量实际上将引用同一个对象,因此改变其中一个变量就会影响另一个变量。
var obj1 = new Object();
var obj2 = obj1;
obj1.name = 'jx';
obj2.name;// jx
传递参数
ECMAScript中所有函数的参数都是按值传递的。也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。
###垃圾收集
标记清除法 和 引用计数法(存在循环引用问题)
引用类型
Object类型
Array类型
检测数组
var value = [];
value instanceof Array //方式一
Array.isArray(value) //方式二
栈方法
- 先进后出
- push() 向数组的末尾添加一个或更多元素,并返回新的长度。
- pop() 删除数组的最后一个元素并返回删除的元素。
队列方法
- 先进先出
- shift() 删除并返回数组的第一个元素。
- unshift() 向数组的开头添加一个或更多元素,并返回新的长度。
重排序方法
reverse()和sort()方法
sort 默认按照字符串排序
var values = [0,1,5,15,10];
values.sort(function(a,b){
return a-b;//降序排列。如果按照升序排列,则改为return b-a;
});
操作方法
- contact()、连接返回新数组
- slice() 指定起始和结束索引,返回新数组
- splice()
- 删除:splice(0,2)。从索引值0开始,删除2项
- 插入:splice(2,0,‘red’)。从索引值2开始,删除0项,新增red
- 替换:splice(2,1,‘red’)。从索引值2开始,删除1项,新增red
位置方法
indexOf() 、lastIndexOf()
迭代方法
- every() 对数组中每一项运行给定的函数,如果该函数每一项都返回true,则返回true。
- some() 对数组中每一项运行给定的函数,如果该函数任一一项返回true,则返回true。
- filter()
- forEach()
- map()
缩小方法
- reduce()
- reduceRight()
Date类型
Date.parse('2018-08-27'); // 1535328000000
Date.UTC(2018,8,27); //1538006400000
//等价于
new Date('2018-08-27').getTime(); //1535328000000
new Date(2018,8,27)).getTime(); //1538006400000 GMT时间
RegExp类型
语法:
/正则表达式主体/修饰符(可选)
var expression = / pattern / flags
3个标志:
- g:表示全局模式(global),该模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止。
- i :表示不区分大小写模式(case-insensitive)
- m:表示多行模式(multiline)
实例方法
test() 方法是一个正则表达式方法。
test() 方法用于检测一个字符串是否匹配某个模式,如果字符串中含有匹配的文本,则返回 true,否则返回 false。
exec() 方法是一个正则表达式方法。
exec() 方法用于检索字符串中的正则表达式的匹配。
该函数返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。