JavaScript由三部分组成:
类似于ECMAscript 、Dom、Bom。
JavaScript的特点:
解释型语言、C和Java的语法结构、动态语言、基于原型的面向对象。
js的位置
可以写道head里面也可以写在body里面
#js代码需要写道script标签中
<script type="text/javascript">
#控制浏览器弹出一个窗口
alert("使用js弹出一个窗口");
#向页面输出内容
document.write("向页面输出一个内容");
#向控制器输出一个内容
console.log("向控制器输出一个内容");
var score=prompt("请输入你的成绩");
</script>
注释
/*
多行注释
*/
//单行注释
1.js中严格区分大小写
2.js语句以 " ; " 结尾
3.js会忽略多个空格和换行,可利用空格换行进行代码美化
字面量和变量
不建议直接使用字面量,可以把字面量放到变量里面,例如 123是字面量,var a=123;是变量,变量的值可以随意改变。
js中使用var关键字声明一个变量。
标识符
标识符规则:
1.标识符可以含有字母、数字、下划线、$。
2.标识符不能以数字开头,
3.标识符不能是ES中的关键字或保留字。
4.建议使用驼峰命名法,例如 student_wangwu。
js底层保存标识符采用的是Unicode编码,
数据类型
基本类型:
string 字符串
Number 数值
Boolean 布尔值
Null 空值
Undefined 未定义
引用类型:
object 对象
\n 换行
\t 制表符
声明时使用var,赋值时可以不使用。
//查看数据类型
typeof()
//数值的最大值
Number.MAX_VALUE
//正无穷
Infinity
//负无穷
-Infinity
//表示一个特殊数字
NaN
js中整数运算基本精确,浮点数运算可能得到一个不精确结果。
var bool01=true;
var bool02=false;
//Null类型的值只有一个null,是object类型
typeof(Null)
//Undefined 表示声明了未赋值,是undefind类型
typeof(Undefind)
强制类型转换
强制类型转换:将一个数据类型强制转换成其他类型。
转string:
使用tostring()方法,null和undefind不能转string,
可以使用string()方法,null和undefind会变成字符串“null”和“undefined”。
var a=123;
var b=a.tostring();
typeof(b)
//返回string类型,a的类型还是原来的类型
a=a.tostring();
a=string(a)
//a就变成字符串类型了
转Number:
使用Number()函数,数字转数字,其他转NaN,含有空格转为0,布尔值转为0/1.
parseInt()函数,转为整数
parseFloat()函数,转为浮点数,
转Boolean:
使用Boolean()函数,
数字转Boolean,0和NaN,undefind是false,其他都是true,
字符串转boolean,空串是false,其他都是true。
对象也会转换为true。
进制
十六进制 以0X开头。
八进制 以0开头。
二进制 以0b开头。(易出错浏览器不支持)
运算符
加减乘除,取余,取模、自增、自减,与或非、赋值,关系运算符、相等运算符、条件运算符。
数值相加是数值,字符串加其他都会转成字符串。
三元运算符: 条件表达式?语句1:语句2;
true?alert(“语句1”):alert(“语句2”);
代码块:只具有分组的作用。
{
document.write("向页面输出一个内容");
console.log("向控制器输出一个内容");
}
条件语句、条件分支语句、while循环、
if (){
console.log("向控制器输出一个内容");
} else if(){
console.log("向控制器输出一个内容");
}
switch (条件表达式) {
case 表达式: console.log("向控制器输出一个内容");
case 表达式: console.log("向控制器输出一个内容");
}
while (条件表达式){
}
do {
}while (条件表达式);
for (var x=0;x<10;x++){
console.log("向控制器输出一个内容");
}
break:强制停止当前循环,
continue:跳过本次循环,
对象(object)
对象属于一种复合的数据类型,在对象中可以保存多个不同数据类型的属性。
对象的分类:
内建对象,JavaScript自带的,如 Math,String,等等。
宿主对象,js运行环境提供的,目前主要指浏览器提供的对象。
自定义对象,由开发人员创建的。
new关键字创建对象,是构造函数constructor,
var obj=new onject();
添加属性,语法:对象.属性名=属性值;
obj.name=“孙悟空”;
读取属性,如果不存在该属性时会返回undefind
console.log(obj.name)
删除属性,语法:delete 对象名.属性名;
也可以使用 obj[“属性名”]=属性值;设置属性,更改属性,
对象的属性也可以是另一个对象。
对象复制时,共用一段内存,当一个对象的属性改变时,另一个也相应改变,因为两个人都使用共同的一段地址空间。
当比较两个基本数据类型的值时,就是比较值,
而比较万引用数据类型时,他是比较的对象的内存地址,如果两个对象是一模一样的,但是地址不同,也被判定是不同的。
使用对象字面量创建对象时直接指定对象中的属性,
语法:{属性名:属性值,属性名:属性值,。。。。}
var obj={name:“猪八戒”};
函数
也是一个对象,可以封装一些功能,在需要时执行这些功能(代码),函数中可以保存一些代码在需要时使用。
//函数表达式创建函数
var fun=new function("console.log("hello,这是我的第一个函数");");
fun(); //执行。
//创建函数语法:
function 函数名(形参列表){
语句
}
函数名();
function 函数名(形参列表){
语句
return 返回值;
}
立即执行函数
(function(){
alert("我是一个匿名函数");
})
//函数定义完,立即执行,往往只会执行函数
方法
var obj=new object();
obj.sayname=function(){
console.log("我是孙悟空");
};
调用方法
obj.sayname();
对于一个未知的对象,想要知道他的属性,可以使用for循环输出全部的对象属性,
for(var 变量名 in 对象){
console.log(变量名);
}
作用域:全局作用域,局部作用域。
this关键字
解析器在调用函数每次都会向函数内部传递一个隐含的参数,
这个参数就是this,这个对象我们称之为函数执行的上下文,
根据函数的调用方式的不同,this会指向不同的对象。以函数形式调用时,this永远会指向window,以方法的形式调用时,this就是调用方法的那个对象。
使用工厂方法调用对象,
普通创建一个对象
var obj={
name:"小白脸",
age:25,
gender:"男",
sayname:function(){
console.log(this.name);
}
}
工厂方法创建对象,
function createPerson(name,age,gender){
var obj=new object();
obj.name=name;
obj.age=age;
obj.gender=gender;
obj.sayname=function(){
console.log(this.name);
};
return obj;
}
构造函数
构造函数就是一个普通的函数,创建方式和普通函数没有任何区别,不同的是构造函数习惯上首字母大写。
构造函数的执行流程:
1.立即创建一个新的对象
2.将创建的对象设置为函数中的this,在构造函数中可以使用this来引用创建新的对象
3.逐行执行函数中的代码
4.将创建的对象作为返回值返回
使用同一构造函数创建的对象,我们称之为一类对象,也将一个构造函数称之为一个类,
我们将通过一个构造函数创建的对象称之为该类的实例
instanceof可以检查一个对象是否是一个类的实例
语法:对象instanceof构造函数,是返回true,否则返回false,
—构造函数中的属性和方法,每次创建一个对象都会调用一次,不同对象的属性和方法不等。
—当构造方法中的方法指向构造函数外的函数时他们是相等的。
原型对象prototype
我们所创建的每一个函数,解析器都会向函数添加一个属性值prototype,
这个属性对应着一个对象,这个对象就是我们所谓的原型对象
如果函数作为普通函数调用prototype没有任何作用,
当函数以构造函数的形式调用时,他创建的对象都会有一个隐含的属性
指向该构造函数的原型对象,我们通过_proto_来访问该属性
原型对象就相当于一个公共的区域,所有同一个类的实例都可以访问到这个原型对象
我们可以将对象中的共有内容,统一设置到原型对象中,
当我们访问对象的一个属性或者方法时,他会先在自身对象中寻找,如果有则直加使用,如果没有则会在原型对象中寻找,如果找到直接使用
以后我们创建构造函数时。我们可以将这些对象共有属性和方法,同一添加到构造函数的原型对象中去,
这样我们就不用为每个对象添加,也不会影响到全局作用域,就可以使用每个对象都是以这些属性和方法。
使用in检查对象中是否含有某个属性时,如果对象中没有但是原型中有,也会返回true,
console.log(“属性名”);
可以使用对象的hasownproperty()来检查对象自身是否含有该属性,
使用该刚发只有当对象自身含有该属性时,才会返回true;
mc.hasownproperty(“属性名”);
也可以查看原型里是否有该属性。
mc.proto.hasownproperty(“属性名”);
原型对象也是对象,所以它也有原型,当使用一个对象的属性或者方法时,会在自身寻找,如果自己有,则直接使用,如果没有则去原型对象中寻找,如果原型对象中有,则使用。如果没有则去原型的原型中寻找,直到找到object对象的原型,object对象的原型没有原型,则返回undefined。
function MyClass(){}
//向MyClass的原型中添加属性a
MyClass。prototype.a=123;
var mc=new MyClass();
var mc2=new MyClass();
mc.a="我是mc中的a";
console.log(mc.a);
//返回"我是mc中的a"
console.log(mc2.a);
//返回 123
创建一个实例,当我们直接在页面中打印一个对象时,事件上是输出对象的tostring()方法的返回值。
preson.tostring = function(){
return "person[name="+this.name+",age="+this.age+"]";
}
垃圾回收(gc)
有一个垃圾回收机制,来回收程序运行过程中产生垃圾,
js中拥有自动的垃圾回收机制会自动将垃圾对象从内存中销毁,
我们需要做就是将不再使用的对象设为null。
数组
读取数组中的元素,如果读取不存在的索引,它不会报错而是返回undefined,
对于连续数组length可以获取数组的长度(元素个数)
对于非连续的数组,使用length会获取到数组的最大的索引+1,
数组长度可修改,多余部分会被空出来,不足的情况下,多余的元素会被删除,
数组元素可以是任意的数据类型,可以是数字,字符串,对象,函数,数组等等。
//查看数组长度
arr.length;
//字面量创建数组
var arr= [1,2,3,4];
//使用构造函数创建数组
var arr=new Array(10,20,30);
数组的几个方法
push()
该方法可以向数组的末尾添加一个或者多个元素,并返回数组的新的长度,可以将要添加到元素作为方法的参数传递,这些元素将会自动添加到数组的末尾,
pop()
该方法可以删除数组的最后一个元素,并将删除的元素作为返回值返回,
unshift()
该方法是向数组开头添加一个或者多个元素,并且返回新的数组长度,
shift()可以删除数组的第一个元素,并且将被删除的元素作为返回值返回,
slice() 可以从数组中提取指定元素
splice() 可以用于删除数组中的指定元素,会将指定元素从原数组中删除,并将被删除的元素作为返回值返回,
arr.push("孙悟空","猪八戒","小白马");
arr.pop();
arr.unshift("唐僧");
arr.shift();
arr.slice(start,end)
//stat:开始位置,num:删除数量,要在该位置添加的元素
arr.splice(start,num,arr2)
数组的遍历,将数组中的元素都取出来,
//索引取数
console.log(arr[2]);
foreach()方法需要一个函数作为参数,像这样函数,由我们创建但不由我们调用,我们称之为回调函数,
数组中有几个元素就会执行几次,浏览器会遍历到的元素,
以实参的形式传递进来,我们可以来定义形参,来读取这些内容,
第一个参数,就是当前正在遍历的元素
第二个参数,就是当前正在遍历的元素的索引
第三个参数,就是正在遍历的数组对象
//a表示当前位置的数组元素
arr.foreach(function(a){
console.log("当前元素:"+a);
});
call()和apply()
-这两个方法都是函数对象的方法,需要通过函数对象来调用,
当对函数调用call()和apply()都会调用函数执行,
在调用call()和apply()可以将一个对象指定为第一个参数,此时这个对象将会成为函数执行时的this
call()方法可以将实参在对象之后依次传递
apply()方法需要将实参封装到一个数组中传递
//此时this是window
fun();
//此时this是obj对象
fun.apply(obj);
在调用函数时,浏览器每次都会传递两个隐含的参数,
1.函数的上下文对象this,
2.封装实参的对象arguments
arguments是一个类数组对象,它也可以通过索引来操作数据,来获取对象,在调用函数时,我们所传递的实参都会在arguments中保存,arguments.length可以用来获取实参的长度,我们即使不定义形参,也可以通过arguments来使用实参,它里面有一个属性叫做callee,这个属性对应一个函数对象,就是当前正在指向的函数的对象。
Date对象
在js中使用Date对象来表示一个时间
如果直接使用构造函数创建一个Date对象,则会封装当前代码执行时间,
var d=new Date();
console.log(d);
如果需要在构造函数中传递一个表示时间的字符串作为参数,时间格式为: 月份/日/年 时:分:秒
getDay() 获取当前日期对象是周几,周日为0,周一为1,。。。
getMonth() 获取当前时间对象的月份,会返回一个0–11的值,0为一月,
getTime() 获取当前日期的时间戳,时间戳是指从格林威治标准时间的1970年一月一日,0时0分0秒到当前时间所花费的毫秒数,计算机底层保存时间所用的都是时间戳,
可以用时间戳来测试代码的执行的性能
var start=Date.new();
代码段
var end=Date.new();
console.log("执行时间:"+ (end-start)+"毫秒;");
math对象
math和其他对象不同,他不是一个构造函数,他是一个工具类,封装了数学运算相关的属性和方法,
math.pI
//绝对值函数
abs();
//向上取整
math.ceil()
//向下取整
math.floor();
//四舍五入
math.round();
//生产0-1随机数
math.random();
例生成x-y的随机整数
math.round(math.random()*(y-x)+x);
//最大值
math.max();
//最小值
math.min();
//x的y次幂(次方)
math.pow(x,y);
//开方
math.sqrt();
包装类
js中提供了三个包装类,通过三个包装类,通过这三个包装类可以将基本数据类型的数据转换为对象,
String():可以将基本数据类型字符串转换成string对象
Number():可以将基本数据类型的数字转换成Number对象
Boolean():可以将基本数据类型的布尔值转换成Boolean对象
实际开发中,如果使用基本数据的对象,在做一些比较时,在做一些比较时,可能会带来一些不可预期的问题。
如:方法和属性只能添加给对象,不能添加给基本数据类型,当我们对一些基本数据类型的值去调用属性和方法时,浏览器会临时使用包装类将其转换为对象,然后再调用对象的属性和方法,调用完以后,在将其转换为基本数据类型,
字符串的底层是以数组的形式保存的,
length:获取字符串长度,
charAt():可以返回字符串中指定位置的字符,根据索引获取指定位置的字符,
charcodeAt():获取指定位置字符的字符编码(Unicode编码),
fromcharcode():可以根据字符编码获取字符,
indexof():该方法可以检索一个字符串是否含有指定的内容,如果存在返回第一次出现的索引,不存在返回-1,可以指定一个第二个参数,指定开始查找到位置,
lastIndexof():从后往前找,返回最后面出现的索引,否则返回-1,
slice(start,end):可以字符串中截取指定的内容,不会影响原字符串,而是将截取到的内容返回,
substring(start,end):可以截取字符串,(包含开始位置,不包含结束位置)
substr(star,len):截取字符串,
split():可以将一个字符串才分为一个数组,需要传入字符作为参数,根据参数拆分为数组,
toUpperCase():将一个字符串转换为大写并返回,
正则表达式
创建正则表达式对象
语法:var 变量 =new RegExp(“正则表达式”,“匹配模式”);
在该函数中,可以传递一个匹配模式,作为第二个参数;i 忽略大小写,g 全局模式,
test();使用这个方法用来检查一个字符串是否符合正则表达式的规则,如果符合返回true,否则返回false,
使用字面量来创建正则表达式,语法: var 变量 = / 正则表达式/匹配模式,
var reg=new RegExp("a");
var str="a";
var result=reg.test(str)
与Java中的正则一致,这里不详细写了,