JavaScript组成
- ECMAScript:JavaScript语法标准
- DOM:文档对象模型
- BOM:浏览器对象模型
特性
- JavaScript 对大小写是敏感的。
- JavaScript 使用 Unicode 字符集。
数据
代表了特定的信息
特点:可传递(基本数据被赋值会直接复制一个一模一样的数据),可运算
内存中所有的操作目标都是数据
js调用 函数时传递变量参数时是(看理解)
- 都是值(基本/地址值)传递
- 可能是值传递,也可能是引用传递(地址值)
基本数据类型(5+2种)
- 字符串(String)
- 数字(Number)
- 布尔(Boolean)
- 对空(Null)
- 未定义(Undefined)
- Symbol(Symbol 是 ES6 引入了一种新的原始数据类型,表示独一无二的值。)
- bigInt(大整数,ES6引入)
注释:
- 参数赋值传数值
- null和undefined中没有任何方法
调用方法时的过程
对于str.toUpperCase()
- 字符串 str 是一个原始值。因此,在访问其属性时,会创建一个包含字符串字面值的特殊对象,并且具有可用的方法,例如 toUpperCase()。
- 该方法运行并返回一个新的字符串(由 alert 显示)。
- 特殊对象被销毁,只留下原始值 str。
虽然创建了特殊对象,但是实际上仍比对象类型更加轻量级
引用数据类型
- 基本
- 对象(Object)(剩下其他类型都是object)
- 数组(Array)
- 函数(Function)
- 特殊
- 正则(RegExp)
- 日期(Date)
注释:
- 参数赋值传地址
- JavaScript的对象可以认为是键值对的集合
对象的方法定义
<script>
var person = {
firstName: "John",
lastName : "Doe",
id : 5566,
//对象方法作为一个函数定义存储在对象属性中。
fullName : function() {
return this.firstName + " " + this.lastName;
}};
document.getElementById("demo").innerHTML = person.fullName();
</script>
内存
内存条=》通电=》产生内存空间=》存储数据=》处理数据=》断电=》内存和数据都消失
内存生命周期
- 分配内存空间,获得使用权
- 存储数据,可以反复操作
- 释放内存空间
释放内存
- 局部变量:函数执行完自动释放
- 对象:变成垃圾对象=》垃圾回收器回收
变量
可变化的量,由变量名和变量值组成
每个变量对应一块内存,变量名用来查找内存,变量值就是内存中的数值
数据、变量、内存的关系
内存用来存储数据的空间
变量是内存的标识
基本数据类型和引用数据类型区别
- 栈内存和堆内存(内存分配)
- 基本数据类型的值在栈内存中独立存放
- 引用数据类型的值再堆内存中存档,指向改地址的指针存放在栈内存中
- 访问机制
- 基本数据类型会直接访问
- 引用数据对象需要先得到在堆内存中的地址,按照这个地址去获得这个对象
- 复制变量的不同
- 基本数据类型复制后是完全独立的
- 应用数据类型复制后只是多了一个指针,仍然指向一个地址
- 参数传递不同
- 基本数据类型只是传了值,新参数和原数据互不影响
- 应用数据类型传递的是指针,新参数和原数据相互影响
声明变量
当您声明新变量时,可以使用关键词 “new” 来声明其类型:
var carname = new String();
var x = new Number();
var y = new Boolean();
var cars = new Array();
var person = new Object();
字符串可以是对象
通常, JavaScript 字符串是原始值,可以使用字符创建: var firstName = "John"
但我们也可以使用 new 关键字将字符串定义为一个对象: var firstName = new String("John")
var x = "John"; // x是一个字符串
var y = new String("John"); // y是一个对象
typeof x // 返回 String
typeof y // 返回 Object
注释:
- 不要创建 String 对象。它会拖慢执行速度,并可能产生其他副作用
- 原始值字符串虽然没有属性和方法 但是可以调用JavaScript的属性和方法,因为JavaScript会在调用时把原始值当做对象
向未声明的 JavaScript 变量分配值
如果您把值赋给尚未声明的变量,该变量将被自动作为 window 的一个属性。
这条语句carname="name"
将声明 window 的一个属性 carname。
非严格模式下,给未声明变量赋值创建的全局变量,是全局对象的可配置属性,
给未声明变量赋值创建的全局变量可以删除。
var var1 = 1; // 不可配置全局属性
var2 = 2; // 没有使用 var 声明,可配置全局属性
运算符
字符串和数字运算结果是字符串 即 '5'+ 5 ='55'
!==
类型和值至少有一个不一样
??空值合并运算符
a??b
如果a不是null或者undefined,则结果为a
如果a是null或者undefined,则结果为b
通常用于提供默认值,例如(user ?? "匿名"
)
或者用于选出第一个非null/undefined的值,firstName ?? lastName ?? nickName ?? "匿名"
与||的区别
??返回第一个非null和undefined的值
||返回第一个真值,无法区分false,0,“”和null、undefined
基本循环方式
JavaScript 支持不同类型的循环:
- for - 循环代码块一定的次数
- for in - 循环遍历对象的属性
- while - 当指定的条件为 true 时循环指定的代码块
- do/while - 同样当指定的条件为 true 时循环指定的代码块
for in
<script>
function myFunction(){
var x;
var txt="";
var person={fname:"Bill",lname:"Gates",age:56};
for (x in person){
txt=txt + person[x];
}
document.getElementById("demo").innerHTML=txt;//BillGates56
}
</script>
break 带标签引用
不带标签只可以用在循环或者swtich
带标签可以跳出任何代码块(前提是break在当前代码块内)
但是 continue 不管带不带都不可以
cars=["BMW","Volvo","Saab","Ford"];
list: {
document.write(cars[0] + "<br>");
document.write(cars[1] + "<br>");
document.write(cars[2] + "<br>");
break list;
document.write(cars[3] + "<br>");
document.write(cars[4] + "<br>");
document.write(cars[5] + "<br>");
}
/*
BMW
Volvo
Saab
*/
switch
case的值可以是表达式或值,可以是’a’、6、true 等任意数据类型的值,也可以是表达式。
case 'error':
case age >= 18 && age <= 65: