js基本知识
JS简介
JavaScript(简称“JS”) 是一种具有函数优先的轻量级,解释型或即时编译型的高级编程语言。虽然它是作为开发Web页面的脚本语言而出名的,但是它也被用到了很多非浏览器环境中,JavaScript 基于原型编程、多范式的动态脚本语言,并且支持面向对象、命令式和声明式(如函数式编程)风格。 (摘至百度百科)
JS写法
- JS可以写在html文件中的,这是内部写法
标签:
<script></script>
- 它还可以写在JS文件中,然后在Html中通过script标签引入
<script src="out.js"></script>
- 把JS代码现在开始标签中,当成开始标签的属性
JS语法
- 区分大小写。
- 忽略空白格。
- 语句分号可以加也可以不加,但是如果加了就所有都加上,不加就所有都不要加。
- 注释:单行注释用//,多行注释用/多行注释/。
- 标识符和关键字。
JS变量
变量定义
变量指的是内存中的一个地址
变量名
变量名是指内存空间中地址的别名
变量值
变量值指的是存储在内存空间中的一种状态(数值)
如何定义变量
var a=10 //变量名指a,变量值是110
变量的分类
变量分为全局变量和局部变量
- 全局变量:定义在函数外面;
- 局部变量:写在函数里面的,其中函数必须由function来声明。
JS中的数据类型
不管什么语言中,由于不同类型的数据所占据的空间大小不一样,所以为了更合理的利用内存空间,才有了数据类型。这里讲的的数据类型是指变量值的数据类型。
数据类型的分类:
基本数据类型
- Number:指的是数字。
1)它对应的数值有无数个;
2)不分整数和小数;
3)可以通过typeof来查看一个变量值的数据类型:console.log(typeof a);
4)最大值,最小值:console.log(Number.MAX_VALUE),console.log(Number.MIN_VALUE);
5)number可通过不同的进制来显示;
6)NaN;Not a Number,指的是不是数字;
7)JS中不对小数运算,如果要运算,必须先转化为整数。 - String:字符串类型,在JS中,它不像其他语言分字符和字符串,统称为字符串。
1)在JS中,使用“”包含字符串,如果不包就会被当成变量;
2)单引号不要嵌套单引号,双引号里面也不能嵌套双引号,外双内单或者外单内双;
3)对应的数据有无数个。 - Boolean:布尔类型,它有两个值为ture和false。ture和Ture是不一样的。
- Undefiend:表示没有值。它的值是undefined,
- Null:空值。
引用数据类型
只有Object。
JS数据类型的转化
它的前提:运算符两侧的数据类型要一致,否则JS解释器会帮你转化。
转化分为两种:隐式类型转化和强制类型转化。
隐式类型转化
静悄悄地,不知不觉地就进行了类型转化。
console.log([1, 2] + 1); //输出:"1,21"
console.log([1, 2] + true); //输出:"1,2true"
console.log([1, 2] + "love"); //输出:"1,2love"
console.log([1, 2] + null); //输出:"1,2null"
console.log([1, 2] + undefined); //输出:"1,2undefined"
console.log([1, 2] + [3, 4]); //输出:"1,23,4"
在if中:NaN,undefined,null,flase,0,-0,“”会出现flase,其他的都是ture。
强制类型转化:
写代码进行转换,比如下面将其他类型转换成布尔类型:
代码段
代码段(code segment / text segment)通常是指用来存放程序执行代码的一块内存区域。
在JS中,一个script标签就是一个代码段。JS在执行时时一个代码段一个代码段的执行,执行过程分为两个阶段,一个是语法分析阶段,一个是预编译阶段,还有一个是代码执行阶段。
语法分析阶段
分析过程有:
- 页面产生便创建了GO全局对象(Global Object),也就是window对象;
- 第一个脚本文件加载;
- 脚本文件加载完成后开始分析语法是否合法;
- 准备开始预编译
预编译阶段
预编译又称为预处理,是做些代码文本的替换工作。是整个编译过程的最先做的工作。
- 对加var 的变量名进行提升,但是赋的值不会被提升,它们会被提升到代码段的最前边;
- function声明的函数提升,而函数提升的是整个函数声明
执行阶段
预编译结束后,就开始从上到下执行代码,直到数值的输出。
执行上下文(execute context)
简称EC,是给代码提供数据的。代码分为两类:一类是函数代码,一个函数就是一段代码,还有一个是全局代码,指的是函数外面的代码。
全局EC:全局代码在执行时,就会产生全局EC(G),全局的变量名和变量值储存在这里。
局部EC:函数代码在执行时,会产生局部EC,代用一个函数就产生一个EC。
EC栈:每产生一个EC就会被放入栈中。
GO:Global Object ,全局对象,也就是window对象。
加var的变量与不加var的变量的区别
- 在全局变量中,加var的变量名会被提升,而不加var的不会被提升;
- 不管变量名加没加var,他们都会被放到window里作为window的属性;
- 没有加var的变量,只能作为全局属性;
- 加var的局部变量,不会作为window的属性;
- 访问一个对象上不存在的属性,结果就是undfined。
undfined出现的地方
- 一个变量没有被赋值,则返回undfined;
- 一个函数没有返回值,则返回undfined。
函数表达式
可参考:https://www.cnblogs.com/ricky-wang/p/6804769.html
console.log(fn);
window.fn();
console.log(window.fn);
fn();
if("fn" in window){ //在if中,如果有函数,此函数在预编译期间并不会直接提升到代码段的前面,仅仅是直接提升函数名,就是提升了函数的声明,也就是fn
fn(); //如果条件满足的话,进入到条件后的第一件事就是给fn赋值,fn此时就是函数了
function fn(){
console.log("fn...");
}
}
fn();
给函数传递参数
参数有形式参数,简称形参,形参一般就是函数内部的局部变量;还有实际参数,简称实参。
function f(a,b){
console.log(a+b); //a,b都是形式参数,也就是形参
}
f(1,2); // 1,2是实际参数,而函数调用的过程就是实参向形参赋值的过程
数据的存储
内存分为堆内存和栈内存,基本数据类型储存在栈中,函数是引用数据类型存储在堆中
作用域链
一般情况下,变量的取值会到创建这个变量的函数的作用域中取值,但如果当前的作用域中没有值时,就会到上级中找,直到找完全局的作用域,这一查找过程所形成的链条成为作用域链
let和const
let
- let声明的变量没有提升(或者提升了但是没有初始化)
- let配合{}也可以形成块级作用域
- 使用let声明的变量不会被挂载到GO中
- 使用let不能重复声明
const
- 声明的是一个常量
- 它不会被提升
- 它也会形成块级作用域
- 不能被挂载到GO中
- 不能够重复声明
- 声明常量是必须赋值
小结
本人纯js新手,所写的只是现阶段学习到的东西,全是干货,如有错误请大佬指正,勿喷。后面再学习到新的会再更新哦。