目录
1. Java基础语法
1.1 编写位置
我们的JS代码需要编写到
<script>
标签中
我们一般将script标签写到head中。(和style标签有点像)
属性:
type:默认值
text/javascript
可以不写,不写也是这个值。
src:当需要引入一个外部的js文件时,使用该属性指向文件的地址。
<script type="text/javascript">
// 控制浏览器弹出窗口
alert("hello world");
//向页面输出
document.write("hello world2");
//向控制台输出
console.log("hello world3");
</script>
1.2 严格区分大小写
JavaScript是严格区分大小写的,也就是abc和Abc会被解析器 认为是两个不同的东西
1.3 注释
JS中的注释和Java的的一致,分为两种:
单行注释:
//注释内容
多行注释:
/*注释内容*/
1.4 标识符
所谓标识符,就是指变量、函数、属性的名字,或函数的参数
按照惯例,ECMAScript 标识符采用
驼峰命名法
。
但是要注意的是JavaScript中的标识符不能是
关键字
和
保留字符
。
1.5 变量
变量的声明:
使用
var
关键字声明一个变量。
var a;
变量的赋值:
使用
=
为变量赋值。
a=123;
声明和赋值同时进行:
var a = 123;
1.6 数据类型
JavaScript中一共有5种基本数据类型:
字符串型(String)
数值型(Number)
布尔型(Boolean)
null型(Null)
undefined型(Undefined)
1.7 typeof运算符
使用
typeof
操作符可以用来检查一个变量的数据类型。
使用方式:
typeof 数据
,例如 typeof 123。
1.8 String
String
用于表示一个字符序列,即字符串。
字符串需要使用
’
或
“
括起来。
将其他数值转换为字符串有三种方式:
toString()
、
String()
、
拼串
1.9 Number
Number
类型用来表示整数和浮点数,最常用的功能就是用来 表示10进制的整数和浮点数。
Number表示的数字大小是有限的,范围是: ± 1.7976931348623157e+308
如果超过了这个范围,则会返回±
Infinity
。
NaN
,即非数值(Not a Number)是一个特殊的数值,JS中当对数值进行计算时没有结果返回,则返回NaN。
1.10 数值的转换
有三个函数可以把非数值转换为数值:
Number()
、
parseInt()
和
parseFloat()
。
Number()可以用来转换任意类型的数据,而后两者只能用于转换字符串。
parseInt()只会将字符串转换为整数,而parseFloat()可以转换为浮点数
1.11 Boolean(布尔型)
布尔型
也被称为逻辑值类型或者真假值类型。
布尔型只能够取
真(true)
和
假(false)
两种数值。除此以外, 其他的值都不被支持。
其他的数据类型也可以通过
Boolean()
函数转换为布尔类型。
转换规则:
1.12 Undefined
Undefined
类型只有一个值,即特殊的 undefined 。
在使用 var 声明变量但未对其加以初始化时,这个变量的值就 是 undefined。例如:
var message;
message 的值就是 undefined。
需要注意的是typeof对没有初始化和没有声明的变量都会返回 undefined
1.13 Null
Null
类型是第二个只有一个值的数据类型,这个特殊的值是 null
从语义上看null表示的是一个空的对象。所以使用typeof检查 null会返回一个Object。
undefined值实际上是由null值衍生出来的,所以如果比较 undefined和null是否相等,会返回true
1.14 运算符
JS中为我们定义了一套对数据进行运算的 运算符。
这其中包括:算数运算符、位运算符、关系运算符等。
1.14.1 算数运算符
算数运算符
顾名思义就是进行算数操作的运算符。
•
JS中为我们提供了多种算数运算符。
自增和自减
自增
++
自减
--
自增和自减分为前置运算和后置元素。
所谓的前置元素就是将元素符放到变量的前边,而后置将元素符放到变 量的后边。
例子:
前置自增:++a
后置自减:a—
运算符在前置时,表达式值等于变量原值。
运算符在后置时,表达式值等于变量变更以后的值。
1.14.2 逻辑操作符
一般情况下使用逻辑运算符会返回一个布尔值。
逻辑运算符主要有三个:非、与、或。
在进行逻辑操作时如果操作数不是布尔类型则会将其转换
布尔类型在进行计算。
非使用符号
!
表示,与使用
&&
表示,或使用
||
表示
非
非运算符使用 ! 表示。
非运算符可以应用于任意值,无论值是什么类型,这个运 算符都会返回一个布尔值。
非运算符会对原值取反,比如原值是true使用非运算符会 返回false,原值为false使用非运算符会返回true
与
与运算符使用 && 表示。
与运算符可以应用于任何数据类型,且不一定返回布尔值。
对于非布尔值运算,会先将非布尔值转换为布尔值。
对布尔值做运算时,如果两个值都为true则返回true, 否则返回false。
非布尔值时:
如果两个都为true,则返回第二个值
,如果
两个值中有false则返回靠前的false的值
或
或运算符使用 || 表示。
或运算符可以应用于任何数据类型,且不一定返回布尔值。
对于非布尔值运算,会先将非布尔值转换为布尔值。
对布尔值进行运算时,如果两个值都为false则返回false, 否则返回true。
非布尔值时:
如果两个都为false ,则返回第二个值
,否则
返回靠前true的值
。
1.14.3 赋值运算符
简单的赋值操作符由等于号 (
=
) 表示,其作用就是把右侧的值赋给左侧的变量。
如果在等于号左边添加加减乘除等运算符, 就可以完成复合赋值操作。
+=、*=、-=、/=、%=
比如:
a+=10
和
a=a+10
是一样的。
1.14.4 关系运算符
小于(
<
) 、大于(
>
) 、小于等于(
<=
)和大于等于(
>=
)
这几个关系运算符用于对两个值进行比较,比较的规则与我们在数学课上所学的一样。
这几个运算符都返回一个布尔值。用来表示两个值之间的关系是否成立。
5 > 10 false
5 < 10 true
5 <= 10 true
5 >= 10 false
相等
JS中使用
==
来判断两个值是否相等,如果相等则返回 true。
使用
!=
来表示两个值是否不相等,如果不等则返回true。
注意:null和undefined使用==判断时是相等的。
全等
除了==以外,JS中还提供了
===
。
===表示全等,他和==基本一致,不过==在判断两个值 时会进行自动的类型转换,而===不会。
也就是说
”55”==55
会返回true,而
”55”===55
会返回 false;
同样我们还有
!==
表示不全等,同样比较时不会自动转型
。
也就是说
”55”!=55
会返回false,而
”55”!==55
会返回 true;
1.14.5 逗号
使用逗号可以在一条语句中执行多次操作。
比如:var num1=1, num2=2, num3=3;
使用逗号运算符分隔的语句会从左到右顺 序依次执行。
1.14.6 条件运算符
条件运算符也称为三元运算符。通常运算符写为
?:
。
这个运算符需要三个操作数,第一个操作数在?之前, 第二个操作数在?和:之间,第三个操作数在:之后。
例如:
x > 0 ? x : -x // 求x的绝对值
上边的例子,首先会执行x>0,如果返回true则执行冒 号左边的代码,并将结果返回,这里就是返回x本身, 如果返回false则执行冒号右边的代码,并将结果返回。
1.14.7 运算符的优先级
2. 对象
2.1 Object对象
Object类型,我们也称为一个对象。是JavaScript中的引用数据类型。
它是一种复合值,它将很多值聚合到一起,可以通过名字访问这些值。
对象也可以看做是属性的无序集合,每个属性都是一个名/值对。
对象除了可以创建自有属性,还可以通过从一个名为原型的对象那里 继承属性。
除了字符串、数字、true、false、null和undefined之外,JS中的值都是对象
2.1.1 创建对象的方法
方法一:
var person = new Object();
person.name = xxx
方法二:
<script type="text/javascript">
var person = {
name:"张三",
password:"123"
};
alert(person.name + "," + person.password)
</script>
2.1.2 访问对象的方法
方法一:
对象 . 属性名
方法二:
对象 [ ' 属性名 ' ]
2.2 基本数据类型
JS中的变量可能包含两种不同数据类型的值:基本数据类型和引用数据类型。
JS中一共有5种基本数据类型:String、Number、 Boolean、Undefined、Null。
基本数据类型的值是无法修改的,是不可变的。
基本数据类型的比较是值的比较,也就是只要两个 变量的值相等,我们就认为这两个变量相等。
2.3 引用数据类型
引用类型的值是保存在内存中的对象。
当一个变量是一个对象时,实际上
变量中保存的并不是对象本身,而是对象的引用
。
当从一个变量向另一个变量复制引用类型的值时,会将对象的引用复制到变量中,并不是创建一个新的对象。
这时,两个变量指向的是同一个对象。因此,改变其中 一个变量会影响另一个
2.4 栈和堆
JavaScript在运行时数据是保存到栈内存和堆内存当中的。
简单来说
栈内存用来保存变量和基本类型。堆内存用来保存对象
。
我们在声明一个变量时实际上就是在栈内存中创建了一个空间用来保存变量。
如果是基本类型则在栈内存中直接保存,
如果是引用类型则会在堆内存中保存,变量中保存的实际上对 象在堆内存中的地址
2.5 数组
数组也是对象的一种。
数组是一种用于表达有顺序关系的值的集合的语言结构。
创建数组:
v
ar array = [1,44,33];
数组内的各个值被称作元素。每一个元素都可以通过索引(下标)来快速读取。索引是从零开始的整数。
2.6 函数
函数是由一连串的子程序(语句的集合)所组成的,可以 被外部程序调用。向函数传递参数之后,函数可以返回一定的值。
通常情况下,JavaScript 代码是自上而下执行的,不过函数体内部的代码则不是这样。如果只是对函数进行了声明, 其中的代码并不会执行。只有在调用函数时才会执行函数 体内部的代码。
这里要注意的是JavaScript中的函数也是一个对象。
2.6.1 函数的声明
首先明确一点函数也是一个对象,所以函数也是在堆内存中保存的。
函数声明比较特殊,需要使用function关键字声明。
var sum = function(a,b){return a+b};
上边的例子就是创建了一个函数对象,并将函数对 象赋值给了sum这个变量。其中()中的内容表示执 行函数时需要的参数,{}中的内容表示函数的主体。
可以通过函数声明语句来定义一个函数。函数声明语句以关键字 function 开始,其后跟有函数名、参数列表和函数体。其语法如下所示:
2.6.2 函数的调用
调用函数时,传递给函数的参数称为实参 (实际参数)。
如果想调用我们上边定义的sum函数,可以这样写:
var result = sum(123,456);
这样表示调用sum这个函数,并将123和456作 为实参传递给函数,函数中会将两个参数求和并赋值给result。
2.6.3 传递参数
JS中的所有的参数传递都是按值传递的。 也就是说把函数外部的值赋值给函数内部 的参数,就和把值从一个变量赋值给另一 个变量是一样的。
2.7 执行环境
执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为。
每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。
全局执行环境是最外围的一个执行环境。在 Web 浏览器中,全局执 行环境被认为是 window 对象,因此所有全局变量和函数都是作为 window 对象的属性和方法创建的。
某个执行环境中的所有代码执行完毕后,该环境被销毁,保存在其中 的所有变量和函数定义也随之销毁。
在内部环境可以读取外部环境的变量,反之则不行
2.8 函数内部属性
在函数内部,有两个特殊的对象:
arguments
该对象实际上是一个数组,用于保存函数的参数。 同时该对象还有一个属性callee来表示当前函数。
this
this 引用的是一个对象。对于最外层代码与函数内部的情况,其引用目标是不同的。
此外,即使在函数内部,根据函数调用方式的不同,引用对象也 会有所不同。需要注意的是,this 引用会根据代码的上下文语境 自动改变其引用对象。
2.9 this 引用的规则
在最外层代码中,this 引用的是全局对象。
在函数内,this 根据函数调用方式的不同 而有所不同:
2.10 构造函数
构造函数是用于生成对象的函数,像之前调用的Object()就是一个构 造函数。
2.10.1 调用构造函数:
构造函数本身和普通的函数声明形式相同。
构造函数通过 new 关键字来调用,new 关键字会新创建一个对象并返回。
通过 new关键字调用的构造函数内的 this 引用引用了(被新生成的)对象。
2.10.2 new关键字
使用new关键字执行一个构造函数时:
首先,会先创建一个空的对象。
然后,会执行相应的构造函数。构造函数中的this将会引用这个新对象。
最后,将对象作为执行结果返回。
构造函数总是由new关键字调用。
构造函数和普通函数的区别就在于调用方式的不同。
任何函数都可以通过new来调用,所以函数都可以是构造函数。
在开发中,通常会区分用于执行的函数和构造函数。
构造函数的首字母要大写
2.11 属性的访问
在对象中保存的数据或者说是变量,我们称为是一个对象的属性。
读取对象的属性有两种方式:
对象.属性名
对象['属性名']
修改属性值也很简单:
–
对象.属性名 = 属性值
删除属性
–
delete 对象.属性名
constructor
–
每个对象中都有一个constructor属性,它引用了当前对象的构造函数
2.12 垃圾回收
不再使用的对象的内存将会自动回收,这 种功能称作垃圾回收。
所谓不再使用的对象,指的是没有被任何 一个属性(变量)引用的对象。
垃圾回收的目的是,使开发者不必为对象 的生命周期管理花费太多精力
2.13 原型继承
JS是一门面向对象的语言,而且它还是一个基于原型的面向对 象的语言。
所谓的原型实际上指的是,在构造函数中存在着一个名为原型 的(prototype)对象,这个对象中保存着一些属性,凡是通过该 构造函数创建的对象都可以访问存在于原型中的属性。
最典型的原型中的属性就是toString()函数,实际上我们的对象 中并没有定义这个函数,但是却可以调用,那是因为这个函数 存在于Object对应的原型中
2.13.1 设置原型
原型就是一个对象,和其他对象没有任何区别,可以通过构造 函数来获取原型对象。
–
构造函数. prototype
和其他对象一样我们可以添加修改删除原型中的属性,也可以 修改原型对象的引用。
需要注意的是prototype属性只存在于函数对象中,其他对象 是没有prototype属性的。
每一个对象都有原型,包括原型对象也有原型。特殊的是 Object的原型对象没有原型
2.13.2 获取原型对象的方法
除了可以通过构造函数获取原型对象以外,还可以
通过具体的对象来获取原型对象。
Object.getPrototypeOf(对象)
对象.__proto__
对象. constructor.prototype
需要注意的是,我们可以获取到Object的原型对象, 也可以对它的属性进行操作,但是我们不能修改 Object原型对象的引用
2.13.3 原型链
基于我们上边所说的,每个对象都有原型对象,原型对象也有原型对象。
由此,我们的对象,和对象的原型,以及原型的原型,就构成了一个原型链。
比如这么一个对象:
var mc = new MyClass(123,456);
这个对象本身,原型MyClass.proprototype原型对象的原型对象是Object,Object对
象还有其原型。这组对象就构成了一个原型链。
这个链的次序是:mc对象、mc对象原型、原型的原型(Object)、Object的原型
当从一个对象中获取属性时,会首先从当前对象中查找,如果没有则顺着向 上查找原型对象,直到找到Object对象的原型位置,找到则返回,找不到则 返回undefined。
2.13.4 instanceof
之前学习基本数据类型时我们学习了typeof用来检查一个变量 的类型。
但是typeof对于对象来说却不是那么好用,因为任何对象使用 typeof都会返回Object。而我们想要获取的是对象的具体类型。
这时就需要使用instanceof运算符了,它主要用来检查一个对 象的具体类型。
语法:
–
var result = 变量 instanceof 类型
2.13.5 引用类型
上边我们说到JS中除了5种基本数据类型以外其余的全都是对象,也就是引用数据类型。
但是虽然全都是对象,但是对象的种类却是非常繁 多的。比如我们说过的Array(数组),Function (函数)这些都是不同的类型对象。
实际上在JavaScript中还提供了多种不同类型的对 象
2.14 Object
目前为止,我们看到的最多的类型就是Object,它也是我们在JS中使用的最多的对象。
虽然Object对象中并没有为我们提供太多的功能,但是我们会经常会用途来存储和传 输数据。
创建Object对象有两种方式:
var obj = new Object();
var obj = {}
上边的两种方式都可以返回一个Object对象。
但是第一种我们使用了一个new关键字和一个Object()函数。
这个函数就是专门用来创建一个Object对象并返回的,像这种函数我们称为构造函数。
2.15 Array
Array用于表示一个有序的数组。
JS的数组中可以保存任意类型的数据。
创建一个数组的方式有两种:
使用构造器:
var arr = new Array(数组的长度);
var arr = new Array(123,’hello’,true);
使用[]
var arr = [];
var arr = [123,’hello’,false];
读取数组中的值使用数组[索引]的方式,注意索引是从0开始的。
2.16 Date
Date类型用来表示一个时间。
Date采取的是时间戳的形式表示时间,所谓的时间戳指的是从
1970年1月1日0时0秒0分开始经过的毫秒数来计算时间。
直接使用
new Date()
就可以创建一个Date对象。
创造对象时不传参数默认创建当前时间。可以传递一个毫秒数
用来创建具体的时间。
也可以传递一个日期的字符串,来创建一个时间。
格式为:
月份/日/年 时:分:秒
例如:
06/13/2004 12:12:12
2.17 Function
Function类型代表一个函数,每一个函数都是一个Function类型的对象。而且都与其他引用类型一样具有属性和方法。
由于函数是对象,因此函数名实际上也是一个指向函数对象的 指针,不会与某个函数绑定。
函数的声明有两种方式:
function sum(){}
var sum = function(){};
由于存在
函数声明提升
的过程,第一种方式在函数声明之前就 可以调用函数,而第二种不行。
2.18 函数也可以作为参数
函数也是一个对象,所以函数和其他对象一样 也可以作为一个参数传递给另外一个函数。
但是要注意的是使用函数作为参数时,变量后 边千万不要加(),不加()表示将函数本身作为 参数,加上以后表示将函数执行的结果作为参 数。
2.19 函数对象的方法
每个函数都有两个方法call()和apply()。
call()和apply()都可以指定一个函数的运行环境对象,换句话说就是设置函数执行时 的this值。
使用方式:
–
函数对象.call(this对象,参数数组)
– 函数对象.apply(this对象,参数1,参数2,参数N)
2.20 闭包(closure)
闭包是JS一个非常重要的特性,这意味着 当前作用域总是能够访问外部作用域中的 变量。因为函数是JS中唯一拥有自身作用域的结构,因此闭包的创建依赖于函数。
也可以将闭包的特征理解为,其相关的局部变量在函数调用结束之后将会继续存在
2.21 基本包装类型
基本数据类型是不能去调用方法的,所以JS中还提供了3个特殊的引 用类型:
Boolean
Number
String
这三个类型分别包装了Boolean、Number、String并扩展了许多实 用的方法。
他们的使用方式和普通的对象一样。
要注意的是使用typeof检查这些包装类型时返回的都是object。
2.22 Math
JS 还为保存数学公式和信息提供了一个公 共位置,即 Math 对象。
与我们在 JavaScript 直接编写的计算功能 相比, Math 对象提供的计算功能执行起 来要快得多。 Math 对象中还提供了辅助 完成这些计算的属性和方法