目录
5.1.1什么是JavaScript
JavaScript是一种运行于JavaScript解释器/引擎中的解释型脚本语言
(1)运行环境:1.独立安装的JS解释器(NodeJS)
2. 嵌入在(浏览器)内核中JS解析器
(2)解释型:运行之前是不需要编译的,运行之前不会检查错误,直到碰到错误为止
(3)编译型:对源码进行编译,还能检查语法错误(C/C++)
JS使用场合:PC机,手机,平板,机顶盒
5.1.2JS组成
(1)核心(ECMAScript)
(2)文档对象模型(DOM,Document Object Model)
让JS有能力与网页对话
(3)浏览器对象模型(BOX,Brower Object Model)
让JS有能力与浏览器对话
注:完整的JS是由三部分组成的
5.1.3JS特点
(1)开发工具简单,记事本即可
(2)无需编译,直接由JS引擎负责执行
(3)弱类型语言由数据来决定数据类型
(4)面向对象
5.1.4浏览器内核的作用
负责页面内容的渲染
内核主要由两部分组成:
1.内核排版引擎解析HTML和CSS
2.脚本解释引擎解析JavaScript
注:不同版本的浏览器的内核不同
5.1.5JS运行环境
(1)独立安装JS引擎
(2)嵌入在浏览器内核中的引擎
5.1.6将JS脚本嵌入HTML页面中执行的步骤
(1)将JS代码嵌入在元素“事件”中
onclick:当单击元素时所做的操作
<div id=" " οnclick="JS代码">xxx</div>
(2)将JS代码嵌入<script>标记中
1. <script></script>
允许出现网页的任意位置处
(3)将JS代码写在外部脚本文件中(**.js)
1.创建js文件,并编写JS代码
***.js
2.在页面引入js文件
<script src="js文件路径"></script>
注: <script src=" "></script>(该对标记中,是不允许出现任何内容的)
5.1.7语法规范
1.语句
允许被JS引擎所解释的代码
使用分号来表示结束
大小写敏感
英文标点符号
由表达式,关键字,运算符组成
2.注释
单行注释//
多行注释 /* */
sublime text中Ctrl+/
5.2.1什么是变量
1.变量:就是内存中的一段存储空间名,内存空间的别名,可以自定义值:保存在内存空间中的数据
2.内存:保存程序在运行过程中,所需要用到的数据8bit(比特是表示信息的最小单位)=1 byte
1024byte=1KB
1024KB=1MB
1024MB=1GB
1024GB=1TB
5.2.2变量的声明
(1)语法
声明:var 变量名;
赋值
变量名=值;
var userName;
var bookPricer=25.5;
注:声明过程中尽量不要省略var关键字,否则声明的是“全局变量”
例:(i)声明一个变量,保存学员年龄,值为25
var age;
age=25;
var age=25;
使用:
用console.log()或document.write()使用变量名,取代 " "
打印 变量stuName的值到控制台上
var stuName="PP.XZ";
console.log(stuName);---PP.XZ
console.log("stuName");--stuName
(2)一次性声明多个变量并赋值
语法:var 变量名1,变量名2,...变量名n;
var stuName="PP.XZ",stuAge=25;stuHeight;
//等同于
var stuName="PP.XZ"
var stuAge=25;
var stuHeight;
5.2.3变量名 命名规范
1.不允许使用JS关键字和保留关键字
2.由字母,数字,下划线以及美元符号组成
3.不能以数字开头
4.尽量见名知意
5.尽量采用“驼峰命名法”
变量名为合成词时,第一个单词全小写,从第二个单词开始,每个单词首字符变大写
关键字
break | case | catch | continue | default |
delete | do | else | false | finally |
for | function | if | in | instanceof |
new | null | return | switch | this |
throw | true | try | typeof | var |
void | while | with | undefined | ... |
5.2.4使用未声明的变量
变量未被定义过,直接打印或使用console.log(stuHeight)
结果为错误
5.2.5对变量进行的存取操作
注:=出现的话,永远都是将=右边的东西保存给=左边的变量
=左边必须是变量
var stuAge=30;//保存在变量stuAge
35=30;//将30保存在35中,错误
5.3数据类型
5.3.1数据类型分类
1.原始类型
(1)数字类型
number类型(可以表示32位整数以及64位的浮点数)
注:
整数:32位即4字节
十进制:生活中常用数字
八进制:逢八进一
var n1=0123;
十六进制:逢十六进一
0-9 A-F组成
var n2=0x123;
小数:
var n1=34.56;
var n2=4.5e10;
浮点数:即小数,64位,8字节
(2)字符串类型
表示一系列的文本字符数据,由Unicode下所有的字符,数字,标点在内存中占2字节
例:查看字符“张”的十六进制表现方式
结果为5f20
"张".charCodeAt().toString(16)
注:
汉字的起始字符:\u4e00;
汉字的结束字符:\u9fa5
转义字符:
(1)\n
换行
(2)\n
回车
(3)\t
一个制表符
(4)布尔类型(boolean)
boolean类型:
作用:用于表示条件的结果
取值:
true:真,肯定的结果
false:假,否定的结果
例:var r1=true;
var r2=false;
注:除条件判断外,做运算时,true可以当做1运算,false当做0运算
(5)空(null)
声明对象未赋值
(6)未定义(undefined)
1.声明变量未赋值
2.访问对象不存在的属性
5.3.2数据类型转换
注:
弱类型:由数据来决定变量的数据类型是什么
var stu;//undefined
stu=25;//number
stu="25"//string
不同数据类型的数据在运算的过程中如何处理?
var num1=15;//number
var num2=13;//number
var result=num1+num2;//28------>number
var str1="15";//string
var result1=num1+str1;
5.3.3隐式转换
自动转换,由JS在运算过程中,自己进行转换的操作,不需认为参与
1.函数
typeof()或typeof
var num1=15;
var s=typeof(num1);//获取num1的数据类型
var s1=typeof num1;
2.NaN
Not a Number 不是一个数字
isNaN(数据):判断是否为 非数字
是不是一个数字
结果为boolean类型
结果为true:不是一个数字
结果为false:是一个数字
注:所有的数据类型与string做+运算时,最后结果都为string
5.3.4转换函数--显示转换(强制转换)
1.toString()
将任意类型的数据转换为string类型
变量.toString();
会得到一个全新的结果,类型为string
var num=15;
var str=num+"";
2.parseInt()
整型:Integer
作用:获取指定数据的整数部分
语法:
var result=parseInt(数据);
注:parseInt,从左向右依次转换,碰到第一个非整数字符,则停止转换。如果第一个字符就是非整数字符,结果为NaN
3.parseFloat()
Float:浮点类型--->小数
作用:将指定数据转换成小数
语法:
var result=parseFloat(数据);
ex:
var result=parseFloat("35.25");//35.25
var result=parseFloat("35.2你好!");//35.2
var result=parseFloat("你好35.2");//NaN
4.Number()
作用:将一个字符串解析为number
语法
var result=Number(数据);
注意:如果包含非法字符,则返回NaN
5.4.1运算符与表达式
1.运算符
(1)算数运算符
加(+),减(-),乘(*),除(/),求余(%)
注:-可以表示减号,也可以表示负号
+可以表示加法,也可以用于字符串的链接
ex:
var num1=15;
var num2=18;
var str1="15";
console.log(num1+num2);//33
console.log(num1+str1);//1515
(2)%:取余操作,俗称模
作用:取两个数字的余数
var i=10%3; //i值为1
使用场合:1.判断数字的奇偶性
2.获取数字后几位
(3)自增&自减
(4) 关系运算符
作用:判断数据之间的大小
(5)判断一个数据是否为数字
ex
var input=prompt("请输入一个数据");
判断input是否为数字??
isNaN(数据)
isNaN()会抛开数据类型来判断数据是否为数字
如果数据是数字类型,则返回false
如果数据不是数字类型,则返回true
(6)逻辑运算
逻辑与:&&
逻辑或:||
逻辑非:!
注:短路逻辑
(7)三目运算符:运算符需要三个操作
语法:表达式1?表达式2:表达式3;
注:表达式1是一个条件,值为Boolean类型
若表达式1的值为true,则执行表达式2的操作,并且以表达式2的结果作为整个表达式的结果
若表达式1的值为false,则执行表达式3的操作,并且以表达式2的结果作为整个表达式的结果
5.5.1函数的定义
5.5.2 函数的声明
语法:
function 函数名(){
可执行语句;
}
ex
function printHello(){
console.log("hello");
console.log("world");
}
5.5.3函数的调用
执行函数的内容,任何js的合法位置处,都允许调用函数
语法:函数名称();
function sayHello(){
console.log("hello");
console.log("world");
}
sayHello();
5.5.4
(1)定义带参数函数
function 函数名(参数列表声明)
{
//代码块(函数块,功能体,方法体)
}
ex
function printlnfo(userName,userPwd)
{
console.log('用户名'+userName+'密码:'+userPwd);
}
printlnfo('Tom','123');//传递直接量做实参
(2)带返回值的函数
5.5.5作用域
1.函数作用域,只在当前函数内可以访问
ex
function add(){
var sum=1+2; //局部变量
console.log(sum); //正确
}
console.log(sum); //脚本错误
2.全局作用域,一经定义,代码的任何位置都可以的方式
5.6.1分支结构
if-结构
语法:if(条件表达式){
语句块;
}
流程:1.判断条件表达式结果
2.如果为true,则执行语句块内容
3.如果结果为false,则不执行语句块内容
注:
(1)if语句条件处,必须为boolean的值/表达式/变量
以下情况,if都会认为是false
if(0/0.0/"“/null/undefined/NaN)除以上情况以外,一律为真
if(1)
{
console.log("真!");
}
if("我帅么"){
console("真!");
}
(2)if语句块的{},可以被省略
如果省略,那么if只控制它下面的第一条语句
if-else结构
语法:
if(条件){
语句块1;
}
else{
语句块2;
}
else if结构(复杂if结构或多重if结构)
语法:if(条件1){
语句块1;
}
else if(条件2)
{
语句块2;
}
.........
else{
语句块n;
}
注:最后的else模块,可以选择性添加
switch-case(是一种特殊的分支结构,可以根据一个表达式的不同取值,从不同的程序口开始执行)
1.switch-case和break联合使用case
2.switch-case的结束机制
(1)碰到break结束
(2)整个结构都执行完毕,结束直落
两个case或者多个case之间,没有任何的可执行代码,那么就以最后一块的case为主
5.7.1循环结构
1.循环中的两大要素:(1)循环条件:什么时候开始,什么时候结束
(2)循环体:循环体,循环过程中干了什么
5.7.2循环结构-while循环
语法:while(boolean表达式)
{
循环体语句;
}
5.7.3循环结构 -do-while循环
语法
do{
可执行语句;
}while(boolean); //无论循环体是否满足,循环体至少执行一遍
区别:
5.7.4for循环
语法:
for(表达式1;表达式2;表达式3)
{
循环体语句;
}
5.7.1索引数组
1.创建空数组(2种)在创建数组时,还不知道数组中的元素内容
(1)数组直接量:var arr=[];
(2)用new: var arr=new Array();
ex
var arr1=[]; //定义一个不包含元素的数组
var arr2=[97,85,79] //定义一个包含三个元素的数组
var arr3=new Array(); //定义一个不包含元素的数组
var arr4=new Array("Tom","Mary","John");//定义一个三个字符串元素的数组
2 .创建数组同时初始化
(1) 数组直接量:var arr=[元素1,元素2,.....];
(2)用new:var arr=new Array(元素1,元素2.....);
var array=[4500,5000];
var array=new Array('数组');
3.数组的length属性
数组理论上的元素个数length属性的值永远是最大下标+1
4.数组的遍历
var nums=[50,90,20,10];
for(var i=0;i<nums.length;i++)
{
nums[i]+=10;
}
//元素下标从0开始,到length-1结束
5.7.2关联数组(可自定义下标名称的数组)
注:关联数组只能用for..in循环
for(var key in hash)
{
key //只是元素下标名
hash[key] //当前元素值
}
对比!!!
5.8.1数组API函数
1.数组转字符串String(arr)
将arr中每个元素转为字符串,用逗号分隔
固定套路:对数组拍照:用于鉴别数组是否被修改过
3.arr.join("连接符"):
将arr中每个元素转为字符串,用自定义的连接符分隔
var chars=["H","e","l","l","o"];
console.log(chars.join("")); //Hello
拼接(不直接修改原数组,而返回新数组)
选取(slice,不直接修改原数组,而返回新数组)
slice()
var subArr=arr.slice(starti,endi+1)
注:凡是两个参数都是下标的函数,都有一个特性:含头不含尾
var arr1=[10,20,30,40,50];
var arr2=arr1.slice(1,4); //20,30,40
var arr3=arr1.slice(2);//30,40,50
var arr4=arr1.slice(-4,-2) //20,30
console.log(arr1); //现有数组元素不变
修改数组
(删除:splice)
arr.splice(starti,n);
插入:
arr.spilce(starti,0,值1,值2.....)
替换:(其实就是删除旧的,插入新的)
arr.splice(starti,n,值1,值2,...)
var arr1=[10,20,30,40,50];
arr.reverse();
console.log(arr1);
颠倒数组(reverse)
注:仅负责原样颠倒数组,不负责排序
排序(arr.sort)
注:只能排列字符串类型元素
5.9.1作用域(提高程序可靠性,减少命名冲突)
1.全局作用域(整个script标签或者一个单独的js文件)
2.局部作用域:在函数内部就是局部作用域 这个代码的名字只在函数内部起作用和效果
3.全局变量:在全局作用域下的变量,在全局下都可以使用
注:在函数内部没有声明的变量,即直接赋值的变量也属于全局变量
4.局部变量:(函数的形参也是局部)
5.从执行效率看全局变量和局部变量:
(1)全局变量:在任何一个地方都可以使用,只有在浏览器关闭时才会被销毁,因此比较占内存
(2)局部变量:只在函数内部使用,当其所在的代码块被执行时,会被初始化,当代码运行结束后,就会被销毁,因此更节省空间
5.9.2作用域链
1.内部函数访问外部函数的变量,采取的是链式查找的方式来决定取哪个值,这种结构我们称作作用域链
5.10.1预编译
1.js引擎运行js分为两步: 预解析 代码执行
(1)预解析 js引擎会把js里面所有的var还有function提升到当前作用域的最前面
(2)代码执行 按照代码书写方式的顺序从上到下执行
2.预解析 变量预解析(变量提升)和函数预解析(函数提升)
(1)变量提升 就是把所有变量声明提升到当前的作用域最前面 不提升赋值操作
(2)函数提升就是把所有函数声明提升到当前的作用域最前面 不提升调用操作
ex
<script>
var num=10;
fun();
function fun(){
console.log(num);
var num=20;
}
</script>
相当于
var num;
fuction fun(){
var num;
console.log(num);
num=20;
}
num=10;
fun();
//内外都执行
输出undefined
5.11对象
1.对象是由属性和方法组成的
(1)属性:事物的特征,在对象中用属性来表示(常用名词)
(2)方法:事物的方法,在对象中用方法来表示(常用动词)
5.11.2创建对象的三种方法
1.利用对象字面量创建对象
var obj={
name:'li',
age:18,
sex:'女',
sayHi:function(){
console.log('hi~');
}
}
2.利用new object创建对象
var obj=new Object(); //创建了一个空对象
obj.name='li';
obj.age=18;
obj.sex='男';
obj.sayHi=function(){
console.log('hi~');
}
注:利用等号赋值,分号结束
调用方法:(1)console.log(obj.name);
(2)console.log(obj['sex'];
obj.sayHi();
3.利用构造函数创建对象(利用函数,重复相同代码)
构造函数:把对象里面一些相同的属性和方法抽象出来封装到函数里面
语法格式:
function 构造函数名(){
this.属性=值;
this.方法=function(){}
}
new 构造函数名();