初识js
- 1.什么是js
- 2.JS三种写法
- 3.JS的基本语法
- 4.JS中的变量
- 5.JS中的数据类型
- 1.JS中的number数据类型
- 2.JS中的string数据类型
- 3.JS中的boolean数据类型
- 4. JS中的undefined数据类型
- 6.JS中的数据类型转化
- 7. 什么是代码段
- 8.JS代码在执行时分两个阶段
- 9.初步了解执行上下文( Execute Context (EC))
- 10.加var的变量和没有加var的变量的区别
- 11.了解函数
- 12.let和const声明变量
- let声明变量
- const声明常量
- 13.堆内存和栈内存的理解
1.什么是js
JS:javascript 简称为JS 它是一门编程语言
编程语言分类:
前端语言:JS(浏览器上)…
后端语言:Java C++ Python Go JS C# …
只有合适的场景使用合适的语言。 JS JAVA C++
js能做什么:
1)开发网站
2)开发app
3)小程序
4)游戏开发 小程序游戏 网页游戏
5)写后端 node.js
6)嵌入式 c
7)区块链
…
<script>
var a=110;
var a=200;
conosle.log("hello world")
</script>
2.JS三种写法
1)把js写在html文件中 学习时通常就写在script标签中(内部写法)
2)把JS写在JS文件中,然后在html文件中通过script标签引入 写项目时通常会把JS写在一个单独的文件中(外部写法)
3)把JS代码写在开始标签中,当成开始标签的属性(行内写法)
行内样式:
<button onclick="console.log(888)">点我</button>
3.JS的基本语法
基本语法:
1)JS是区分大小写 var a = 1; var A = 2;
2)忽略空白符(空格 换行 tab)
3)语句分号可加可不加
4)注释 单行注释 多行注释 注释是给程序员看的
5)标识符 和 关键字 var a = 110; var 关键字 a变量名标识符
6)…
4.JS中的变量
变量:变量就是内存中的一个空间。
变量名:内存空间的别名 对变量名的操作就是对内存空间的操作
变量值:存储在内存空间中的状态(数据)
在JS中,如何定义变量:
var a = 110; // 定义了一个变量 变量的名是a 变量的值是110;
变量的分类:
1)全局变量
2)局部变量
分界点是:函数
只要把变量写在函数里面就是局部变量,只要写在函数外面就是全局变量.
全局变量和局部变量有什么特点:
1)全局变量可以在函数内部都能访问到
2)局部变量只能在函数内部访问到
5.JS中的数据类型
为什么需要数据类型?
为了更加合理使用内存空间,基本上所有的编程语言中都提出数据类型的概念,研究针对不同的数据,分配不同的空间。
JS中的数据类型:
基本数据的类型:
number 数字 var a = 110; int a = 110;
string 字符串 ”“ ‘’ JS中不分字符和字符串 都叫字符串
boolean true false 布尔类型
undefiend 没有值
null 没有值引用数据类型:
object 对象
array 数组
function 函数 在JS中函数也是一种数据类型
1.JS中的number数据类型
- number是一个数据类型,这个数据类型对应的值有无数个。
- 在JS中number数据类型是不分整数和小数 都是number
- 可以通过typeof查看一个变量值的数据类型
- 最大值 和 最小值
- number可以通过不同进制显示 进制 10进制 2进制 16进制(以0x打头的) 8进制(以0打头的)
- NaN Not a Number 不是一个数字
- JS中不要对小数运算 要运算先转成整数 得到的结果往往不对
在JS中,说到数据类型,主要指变量值的数据类型。
typeof是运算符 + - * / 都是运算符
Number叫类,也叫构造器,也叫函数
2.JS中的string数据类型
- 在JS中 使用‘’ “”把字符串包起来 不包 JS会给它当成变量
- 单引号不要嵌套单引号 双引号不要嵌套双引号 外单内双 外双内单
- string数据类型对应的数据有无数个
注:SyntaxError表示语法错误
3.JS中的boolean数据类型
- boolean数据类型对应的值就两个 true false
- true 和 True 不一样的 JS是区分大小写的
4. JS中的undefined数据类型
- undefiend是一个数据类型,这种数据类型对应的值是undefiend
- 什么时候会出现undeined?
答:一个变量没有赋值 它的值是undefiend 这个值的类型是undefiend
6.JS中的数据类型转化
数据类型转化:
隐式类型转化:静悄悄地,不知不觉地就进行了类型转化
强制类型转化:写代码进行转化
在JS中,下面的值转成false,其它值都转成true:
0 -0
“”
undefiend
null
前提:在JS中,运算符两侧需要保存数据类型一致,如果不一致,JS解释器会帮你把一个数据类型转成另一个数据类型。
隐士类型转化
<script>
var res=123+"abc";
console.log(res);//123abc
console.log(typeof res)//string
</script>
注:一个运算符如果有两个操作数,这个运算符叫二元运算符,也叫二目运算符.运算符你要保证两侧操作数的数据类型要一致
强制类型转化
<script>
console.log(parseInt(3.14));//3把小数转成整数
console.log(parseInt("3.14abc"))//3 尝试把小数或非数字转成整数
</script>
7. 什么是代码段
一个script标签就是一个代码段。
JS代码在执行时,是一个代码段一个代码段执行。
8.JS代码在执行时分两个阶段
- 预编译
- 代码执行
每一个阶段做的事情是不一样的。
预编译: 提升
把加var的变量进行提升 变量声明会提升 变量的赋值是不会提升提升到了代码段最前面把使用function声明的函数进行提升 提升的是整个函数声明
注:定义 = 声明+赋值
9.初步了解执行上下文( Execute Context (EC))
概念:当代码运行时,会产生一个对应的执行环境,在这个环境中,所有变量会被事先提出来(变量提升),有的直接赋值,有的为默认值 undefined,代码从上往下开始执行,就叫做执行上下文。
代码分两类:
全局代码 函数外面的代码叫全局代码
函数代码 一个函数就是一个局部代码
全局执行上下文:
全局代码在执行时时,就会产生全局的EC。 EG(G)
局部执行上下文:
函数代码在执行时,就会产生局部的EC。调用一个函数就产生一个EC,调用100个函数,就产生100个EC。
ECStack 执行上下文栈
EC(G) 全局执行上下文 存储全局的加var 加function的数据存储在VO中
VO 变量对象 存储的全局的加var 或 加function
EC(f) 函数执行上下文 存储局部的加var 或 加funciton的局部数据
AO 活动对象 存储局部的加var 或 加function的局部数据
GO 全局对象
默认情况下,里面就存储了很多东西
全局的数据,加Var的全局数据,加functon的全局数据,不加var的变量都会存储到GO中的
10.加var的变量和没有加var的变量的区别
- 在全局代码中,加var会提升,没有var的不会提升。
- 不管加没加var的全局变量,都会作为window的属性
- 没有加var的变量,只能作为全局变量,只要是全局变量,肯定是window的属性.
- 加var的局部变量,不会作为window的属性
对象 是集合 放一堆的数据 变量里放一个数据
in是一个运算符 用来判断一个对象有没有一个属性
11.了解函数
- 在JS中定义函数有两种形式
函数定义
函数表达式 - 函数定义
f叫函数名
()是函数特有的标识
{} 叫函数体 - 函数调用
调用函数时,就会把函数体中的代码都执行了 - 函数的返回值
函数的返回值是返回到了函数调用处
一个函数如果没有返回值,默认返回undefiend
<script>
function f(){
return 666;
}
var a=f();
console.log(a);//666
console.log(f())//666
</script>
- 给函数传递数据
<script>
function f(a,b){//a,b叫做形式参数 形参
//形参就是函数内部的局部变量
return a+b;
}
var r=f(1,2); //1 2叫实际参数 实参
console.log(r) //函数调用时就是实参向形参赋值的过程
</script>
12.let和const声明变量
let声明变量
- let声明的变量没有提升(let声明的变量也提升,仅仅是没有初始化)
- let 配合 {} 也可以形成块级作用域
- 使用let声明的变量不会挂载到GO上
- 使用let不能重复声明
注:不要使用var来定义变量 使用let声明变量
const声明常量
- const也没有提升
- 也会形成块级作用域
- 使用const声明的常量不会挂载到GO上
- 使用const不能重复声明
- const在声明常量时,必须赋值
13.堆内存和栈内存的理解
变量存储位置
-
栈(stack):栈会自动分配内存空间,会自动释放,存放基本类型,简单的数据段,占据固定大小的空间。(基本类型:String,Number,Boolean,Null,Undefined)
-
堆(heap):动态分配的内存,大小不定也不会自动释放,存放引用类型,指那些可能由多个值构成的对象,保存在堆内存中,包含引用类型的变量,实际上保存的不是变量本身,而是指向该对象的指针。(引用类型:Function,Array,Object)
<scirpt>
var a=10;
var b=a;
b=11;
console.log(a);//10
</scirpt>
<scirpt>
var a={n:12};
var b=a;
b.n=13;
console.log(a.n);//{n:13}
</scirpt>
<scirpt>
var a={m:666};
var b=a;
b={m:888};//在这里,堆有创建了一个新的地址储存m:888;
console.log(a,m);//{m:666}
</scirpt>
注:第一个代码在栈中改变了b的值而未改变a的值
第二个代码是b没有创建新的地址堆,在堆中改变了a与b共同地址中的值
第三个代码是b创建了一个新的地址堆,没有改变a的值
第一个是基本数据类型,存入了栈中
第二个和第三个是引用数据类型,存入了地址堆中
内存分配
一般来说栈内存线性有序存储,容量小,系统分配效率高。而堆内存首先要在堆内存新分配存储区域,之后又要把指针存储到栈内存中,效率相对就要低一些了。
垃圾回收
垃圾回收方面,栈内存变量基本上用完就回收了,而推内存中的变量因为存在很多不确定的引用,只有当所有调用的变量全部销毁之后才能回收