JavaScript是什么 ?
JavaScript能做什么?
引入js的两种方式
为什么要有变量?
为了存储和复用一个数据,方便修改
当声明一个变量的时候 var a = 10 ,会在内存中开辟以一个空间 存放变量名和变量值 ,会将变量和值存放到window对象中 a:10
1. 全局变量
全局作用域中的变量 可以在该脚本文件中的任何地方访问到
2. 局部变量
局部作用域中的变量 局部变量只能在该函数中访问到
注意在局部作用域中(函数中)声明变量 如果未加关键字 var || let || const 这个变量就会变为隐式全局变量
function a(){ num = 1;}=>var num;function a(){ num = 1;}/*只有num1 是局部变量 , num2 和 num3 是隐式全局变量*/function a(){ var num1 = num2 = num3 = 100;}=>var num2;var num3;function a(){ var num1 = 100; num2 = 100; num3 = 100;}
JavaScript代码规范以及变量命名
声明关键词 var let const
变量名区分大小写
命名规范
一般以字母、$、下划线、数字组成(不能以数字开头)
不能使用系统关键词和保留字
一般遵循驼峰命名法(第一个单词首字面小写后面单词首字母大写)
变量名需得有意义
预解析JavaScript在执行的过程中,浏览器的js引擎会将代码扫描一遍(预解析) 并把 **声明式** 函数 和 变量 提升到 **该作用域** 的最顶端1. 变量预解析
变量预解析只会将变量的声明提升到该作用域的最前面
console.log(a) // undefinedvar a = 10;=>var a console.log(a) // undefineda = 10 2. 函数预解析
变量预解析只会将变量的声明提升到该作用域的最前面
b()function b(){}=>function b(){}b()
断点调试直接在浏览器中Sources添加断点
或者在编辑器中在语句之后添加 debugger
数据类型
什么是数据类型?
计算机里面有很多数据,JS为了方便调试与使用,提供了一些对应的辅助方法,将它们做了归类,就是数据类型。
简单数据类型
1. Number1.1. 整数 => 正数 负数
1.2. 小数
1.3. NaN
Not a Number => 不是一个数字
判断一个数字是否是非数字isNaN(x) 返回布尔值 true是一个非数字,false不是一个非数字
isNaN(undefined) // trueisNaN(null) // false
NaN不等于任何值,包括它自己
Infinity // 无穷大-Infinity // 无穷小Number.MAX_VALUE /*最大值*/Number.MIN_VALUE /*最小值*/
+:加
-:减
*:乘
/:除
%:求模
任何数除以0为无穷大
任何数-*/%字符串为NaN (除了+)
复合运算符
+= a = a+1>
-=a = a-1>
" =" =1 => a = a*1> (乘等于)
/= a = a/1>
%= a = a%1>
==
===
两个等于和三个等于的区别
两个等于只对比值 三个等于对比值和数据类型
自增自减运算符
a++ ++a a-- --a
2. String2.1 字符串的长度str.length
2.2 字符串加号运算 会将数据与数据拼接字符串 + 任何数据类型 = 拼接之后的新的字符串
3. Booleantrue => 1
false => 0
用布尔值来判断条件真假
4. Undefined未定义
5. Null空
null 表示一个值被定义了,定义为null
undefined 表示一个值声明了 但是未定义(未赋值)
所以设置一个值为null是合理的 设置一个值为undefined是不合理的
null == undefined // true
null === undefined // false
说明 null 和 undefined 在转boolean 的时候都为 0 值相同 所以 == 为true ,数据类型不一样 === 为false
复杂数据类型
1. Array
new
new Array()new Array(初始长度)new Array( 1 , 2 , 3 )字面量
[ ][ 1 , 2 , 3 ]
元素: 数组中的值就是元素
下标(索引): 下标从0开始
长度: length 数组的长度 从1开始
正叙遍历
for(let i = 0; i < arr.length; i++){ /*代码块*/}倒叙遍历
for(let i = arr.length; i > 0; i--){ /*代码块*/}
栈操作 先进后出
arr.unshift() /*从头部放入*/arr.shift() /*从头部取出*/arr.push(); /*从尾部放入*/arr.pop(); /*从尾部取出*/队列操作 先进先出
arr.unshift() /*从头部放入*/arr.pop(); /*从尾部取出*/arr.push(); /*从尾部放入*/arr.shift() /*从头部取出*/
2. Function
声明式创建函数
function fn (){ //代码块}匿名方式创建函数
let fn = function(){ //代码块}函数对象
let fn = new Function("形参","形参","代码块") /*前面的都是参数,最后面的参数是代码块*/
函数中 return 将数据给调用者
函数中遇到 return 直接跳出函数 后面代码不执行
函数默认 return undefined
只有声明式的函数和变量才会预解析
先调用 -> 后声明
在js执行的时候 浏览器会执行 预解析的操作
预解析会把所有的 声明式 创建的函数(包括变量) 提升到当前作用域的最顶端
函数内部的特殊属性 用来保存实参列表
arguments 是一个 伪数组 => 不是数组 但是具有数组的特性(下标索引、长度、可以进行循环遍历)
可以模拟函数重载 => 同一个函数,因为传递的实参数量不同,可以执行不同的操作
/*工厂函数*/function createStr(name,age){ let obj = new Object() obj.name = name obj.age = age obj.sayHi = function(){ console.log(this.obj) } return obj}let obj1 = createStr("蓝海",11)/*构造函数*/function StuInFo(name,age){ this.name = name this.age = age this.sayHi = function(){ console.log(this.obj) }}let obj2 = new StuInFo("蓝海",11)
构造函数相对于自定义类(class)
1.变量名一般用名词,首字母大写
2.构造函数中 不需要我们去创建对象、返回对象
3.构造函数一般 被 new 关键词调用
new 关键字 做的四件事
- 创建空对象
- 将空对象 传递给 构造函数 里面的 this
- 调用构造函数
- 返回对象
声明的时候直接调用执行
(function("形参列表"){ /*代码块*/})("实参列表")
3. Object
new
let obj = new Object()||let obj = new Object({ name : "蓝海", age : 11})字面量
let obj = { }||let obj = { name : "蓝海", age : 11}