1.变量的内部存储结构
变量在内存中存储的结构,和超市的储物箱很像,有一个名字(例如:01,02,03),还有一个空间(可以存放数据);
区别:在于空间中存储的信息
值类型:存储的是具体数据;
引用类型:存储的是一个引用(reference)[地址],该引用指向内存中同一块空间,他们共享内存中的同一块数据
eg:
01(变量名称)-->一个苹果(具体数据)
02(变量名称)-->苹果在超市的第二排货架的第一列(地址)
2.有关赋值的区别
赋值(=):
左边的变量 = 右边的变量
var a = 10;
解释:是把右边变量(空间中)存储的内容复制一份放在左边变量(空间中)
值类型的赋值:
赋值操作:是把右边变量(空间中)存储的内容[具体的数据]复制一份放在左边变量(空间中).
注意:修改了其中的一个变量对另一个变量没有影响.
应用类型的赋值:
赋值操作:是把右边变量(空间中)存储的值[地址]复制一份放在左边变量(空间中).
注意:修改了其中一个对象,对另一个对象是有影响的.他们共享内存中的同一块数据.
eg1:
var str1 = "string1";
var str2 = str1; //值类型的赋值
console.log(str1 == str2); //true
str1 = "修改";
console.log(str1 == str2); //false
console.log(str1); //修改
console.log(str2); //string1
var obj1 = {
name:"张三"
}
var obj2 = obj1; //引用类型的赋值
console.log(obj1 == obj2); //false ? true
obj1.name = "李四";
console.log(obj1.name); //李四
console.log(obj2.name); //李四
//赋值操作之后,如果重新使用字面量的方式来设置对象,那么会切断和赋值对象之间的联系
obj1 = {
age:20,
name:"老王"
}
console.log(obj1.name); //老王
console.log(obj2.name); //李四
eg2:
var str = "string1"; //值类型
var num = 10; //值类型
var boolT = true; //值类型
var car = { //引用类型
type:"奔驰",
color:"黑色"
}
//key - value
var person = { //引用类型
name:"张三",
age:18,
car:car
}
console.log(person.name);
console.log(person.car);
图形解析:
3.值类型和引用类型在函数中的使用
(1)函数的参数:
形参:(形式参数)该变量是用来占位用的,在调用之前是没有值的,在函数内部表现是一个局部变量(param)
实参:函数调用的时候传入的参数,这个参数是有值的
(2)函数的调用:把实参的值赋给形参.
值类型数据作为函数的参数:内部修改了形参的值,对外部的实参是没有影响的;
引用类型数据作为函数的参数:内部修改了形参的值,对外部的实参有影响,他们指向的是内存中的同一块数据.
eg3:
var num = 10;
function func(a) {
console.log(a); //10
a = 20;
console.log(a); //20
}
func(num);
console.log(num); //10
//console.log(a);
var obj = {
name:"张三"
}
function foo(paramObj) {
console.log(paramObj.name); //张三
paramObj.name = "李老汉";
console.log(paramObj.name); //李老汉
paramObj = {
name:"老王"
}
console.log(paramObj.name); //老王
}
foo(obj);
console.log(obj.name); //张三 ? 李老汉(正确) ? 老王
图形解析:
4.对象的动态特性
(1)javaScript中的对象和其他的大多数语言都不一样
对象支持动态特性:增加属性(方法) | 删除属性(方法) | 修改属性(方法) |查询
对象:键-值对的集合(key-value)
属性:在对象内部声明的变量
方法:在对象内部定义的函数
(2)操作对象的属性和方法可以使用一下两种:
1`.点语法
2`.中括号[]
(3)区分添加属性还是修改属性:在通过点语法的方式访问属性的时候,先检查修改属性是否存在,如果存在,那么就是修改属性,如果该属性不存在,那么就是添加.
(4)删除对象的属性
关键字:delete
语法: delete 对象.属性
5.in 关键字
作用:1.检测属性 语法 "属性" in 对象 返回值 :布尔类型的值
2.遍历(对象)
注意:遍历对象的时候,在这里必须使用[]语法,不能直接使用点语法
扩展:补充知识点
//遍历数组(array--->object)
var arr = [1,2,3,4,5,6];
for(var k in arr){
console.log(k,arr[k]);
}
//在数组中索引是key 数组的元素是value
console.log(2 in arr);//注意:前面的2是代表索引值 true
console.log(6 in arr);//false
6.delete关键字
作用:
(1) 删除对象中的属性
(2) 删除没有使用var 关键字声明的全局变量
注意:
(1)返回值: 布尔类型的值(我们可通过该值来判断是否删除成功)
(2)使用var关键字声明的变量无法被删除
(3)删除对象中不存在的属性没有任何变化,但是返回值为true
(4)不能删除window下面的全局变量(使用var声明)但是可以的删除直接定义在window上面的属性
7.js的语句结构
循环结构:for循环/while/do...while(至少会执行一次)/for...in(主要用于遍历对象)
条件结构:if..else/switch..case
8.调试工具的使用
(01) 快捷键
window F12
Mac OSX command + option + j
(02)console(控制台输出)他和页面处于同一个环境
(03)断点
01.普通的断点 02.条件断点
(04)网络知识点
网络通信:请求 + 响应
请求:客户端向服务器索要数据的行为
响应:服务器端把数据返回给客户端的行为
请求的方式(8):
PUT
Delete
POST
GET
请求的内部细节:
请求头(描述信息,客户端以及请求本身的描述信息) + 请求体(参数)
响应的内部细节:
响应头(描述信息,服务器端以及响应本身的描述信息) + 响应体(具体数据) + 状态码
9.异常处理
(01)异常处理结构:
try
{
}
catch(e)
{
}
(02)正常情况下,如果程序出现了错误或者是异常,那么该行代码后面的所有代码都无法得到执行,但是,有些时候我们需要保证即便程序出现了问题,后面的代码也能够正常执行,这种情况就可以使用异常捕获结构
(03)手动抛出异常
语法: throe 具体信息
抛出的内容:字符串 + 对象
自己的编码规范:如果出错或者有异常.那么就抛出一个对象(msg code)
函数未定义 1001
变量未定义 1002
访问了错误的数据 1003
(04) 完整的异常捕获结构
try
{
}
catch(e)
{
}
finally
{
}
10.DOM操作
DOM:增加 | 删除 | 修改 | 查询
需求:
01 创建一个div
02 设置div的背景颜色为红色
03 把div添加到页面中
04 获得页面中之前创建的div
05 删除
11.函数和对象的创建
(1)函数的几种创建
01 声明函数
02 函数表达式
03 使用构造函数创建函数对象
(2)对象的创建
01 字面量
02 使用构造函数来创建
11.面向对象和面向过程的区别
(1)两种方法都是一种解决问题的思路(思想)
面向对象:在解决问题的时候,关注的是解决问题需要的一个接着一个的过程(步骤)
面向过程:在解决问题的时候,关注的是解决问题所需要的对象
(2)现实中的对象和编码中的对象
静态的描述信息:属性 :定义在对象中的变量
动态的行为特征:方法 :定义在对象中的函数
(3)为什么要使用面向对象编程?
01 更方便
02 复用性会更好
(4)高内聚和低耦合(电路)
冗余(重复的东西)-->封装(提取相同的部分作为函数体,抽取不同的部分作为参数)