在这里插入图片描述

博客主页:泥菩萨

专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本

01-JavaScript简介

JavaScript背景

2003年之前,JavaScript被称为“牛皮藓”,用来制作页面上的广告、弹窗、漂浮的广告

2004年,JavaScript命运开始改变,谷歌公司开始带头使用Ajax技术

2007年,JavaScript在移动中不可或缺

JavaScript介绍

JavaScript入门易学性

  • JavaScript对初学者比较友好、简单易用。可以使用任何文本编辑工具编写,只需要浏览器就可以执行程序
  • JavaScript是有界面效果的(相比之下,C语言只有白底黑字)
  • avaScript是弱变量类型的语言,变量只需要用 var/let/const 来声明。而lava中变量的声明,要根据变量的类型来定义

JavaScript是脚本语言

JavaScript运行在用户的终端网页上,而不是服务器上,此时我们称之为“前端语言”。就是服务于页面的交互和视觉,不能直接操作数据库

后端语言是运行在服务器上的,比如PHP、ASP、JSP等,这些语言能够操作数据库,进行“增删改查”操作

备注:Node.js是用JavaScript开发的,我们也可以用Node.js技术进行服务器端编程

JavaScript的组成

JavaScript基础分为三个部分:

  • ECMAScript:JavaScript的语法标准(遵循规范)
  • DOM:文档对象模型,操作页面上的元素的API
  • BOM:浏览器对象模型,操作浏览器部分功能的API

JavaScript的特点

特点1:解释型语言

JavaScript是解释型语言,不需要事先被翻译为机器码,而是边翻译边执行(翻译一行,执行一行)

特点2:单线程

同一时间只能做一件事情

特点3:ECMAScript标准

HTML遵循W3C标准

JavaScript遵行ECMAScript标准

编译语言的分类

翻译器

计算机不能直接理解除机器语言之外的任何语言,所以必须要把程序员所编写的语言翻译成机器语言,计算机才能执行程序,程序语言翻译成机器语言的工具,被称为翻译器

翻译器翻译的方式有两种:一种是编译,另一种是解释。两种方式之间的区别在于翻译的时机不同

  • 编译:在代码执行前,事前把所有的代码一次性翻译好,生成中间代码文件,然后整体执行
  • 解释:边翻译,边执行

对应的语言,称之为“编译型语言”、“解释型语言”

编译型语言

优点:运行更快

不足:移植性不好,不跨平台

语言:c、c++、go

解释型语言

优点:移植性好,跨平台

不足:运行更慢

语言:JavaScript、php、Python

Java语言

Java语言既不是编译型语言,也不是解释型语言。翻译过程:

(1) 编译:.java代码文件先通过javac命令编译成.class文件

(2)执行:.class文件再通过jvm虚拟机,解释执行。有了jvm的存在,让java跨平台了

安装JavaScript

首先需要安装nodejs

Node.js

VSCode安装Code Runner插件

开始写第一行JavaScript代码

方式1:行内式

代码举例:

<input type="button" value="点我" onclick="alert('马哥教育')"/>

分析:

  • 可以将单行或少量JS代码写在HTML标签的事件属性中(以on开头的属性)
  • 这种书写方式,不推荐使用,原因是:可读性差,编写大量JS代码时,容易出错

方法2:内嵌式

代码举例:

<script type="text/javascript">
	alert('马哥教育');
</script>

分析:

  • text表示纯文本,因为JavaScript也是一个纯文本的语言
  • type="text/javascript":声明语言为JavaScript,写不写都行
  • 可以将多行JS代码写到<script>标签中

方法3:引用外部的JS文件

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>test</title>
</head>
<body>
	<!-- 引入外部的js文件 -->
	<script src="test.js"></script>
</body>
</html>

test.js:

alert('马哥教育');

分析:

  • 把放在<script>标签中的代码放在js文件,再通过<script>标签中的src属性引入
  • js代码和html代码分开,有利于代码的结构化和复用

JS一些简单的语法规则

(1)JS对换行、缩进、空格不敏感,每一条语句以分号结尾

<script type="text/javascript">
	alert('今天星期一');
	alert('天气晴');
</script>

等价于代码:

<script type="text/javascript">
	alert('今天星期一');alert('天气晴');
</script>

备注

(1)每一条语句末尾要加上分号,如果不写分号,浏览器会自动添加,但是会消耗一些系统资源

(2)所有的符号都是英语的

(3)严格区分大小写

注释

我们不要把HTML、CSS、JavaScript三者的注释格式搞混淆了

HTML的注释

<!-- 我是HTML的注释 -->

CSS的注释

/* 我是CSS注释 */

JavaScript的注释

// 我是JavaScript的注释 

JavaScript输入输出语句

弹出警告框:alert()

安全中,我们会用alert来弹出cookie,获得用户的身份

cookie:验证用户身份

alert(document.cookie);

控制台输出:console.log(‘’)

再浏览器中,按F12即可打开控制台,选择「console」

总结:alert()主要用来显示消息给用户,console.log用来给程序员自己调试的

弹出输入框:prompt()

prompt( )就是专门用来弹出能够让用户输入的对话框,用的少,测试的时候偶尔会用

prompt('请输入:');

调出打印机:print()

print(20);

02-变量

字面量

"字面量"即常量,是固定值,不可改变

字面量有3种:

  • 数字
  • 字符串
  • 布尔字面量

(1)数值的字面量非常简单,写上去就行,不需要任何的符号。例如:

alert(886);  //886是数字,所以不需要加引号

(2)字符串的字面量也很简单,但一定要加上引号,可以是单词、句子等。例如:

console.1og('886');
console.1og('马哥教育');

注意:886是数字,‘886’是字符串

(3)布尔字面量举例:

if(true){
	conso1e.1og('true');
}

变量的概念

变量:适用于存放数据的容器

本质:程序在内存中申请的一块用来存放数据的空间

变量的声明和赋值

变量的声明/定义

ES6之前

在ES6语法之前,统一使用var关键字来声明一个变量,比如:

var name;
ES6之后

在ES6语法之后,可以使用constlet关键字来声明一个变量

const name;
let age;

变量的赋值

name='李杨杨'

变量的初始化

声明的同时赋值:

var a=10;

变量的命名规则

  • 由字母、数字、下划线、美元符$组成,不能以数字开头
  • 不能使用「关键字」和「保留字」做为变量名
  • 建议使用驼峰命名法
  • 变量名区分大小写
  • 变量名长度不超过255个字符

标识符、关键字、保留字

标识符

标识符: 在JS中所有可以由我们自主命名的都可以称之为标识符

例如:变量名、函数名、属性名、参数名都是属于标识符。通俗来讲,标识符就是我们写代码时为它们起的名字

标识符的命名规则和变量的命名规则是一样的,看上面一段就可以了

同样,标识符不能使用语言中保留的关键字保留字

关键字

关键字: JS本身已经使用了的单词,具备固定的语义

JS终端关键字如下:

breakcontinuecasedefaultifelseswitchforindowhiletry、catch、finally、throwvarvoidfunctionreturnnewthistypeofinstanceofdeletewithtruefalsenullundefined

保留字

保留字: 实际上是预留的“关键字”,意思是现在虽然还不是关键字,但是未来可能会成为关键字

JS中的保留字如下:

abstract、boolean、byte、char、classconstimplementsimport、int、interface、long、native、packageprivateprotectedpublic、short、staticsuper、synchronized、throws、

transient、volatile

变量值的交互

想要把两个杯子里的饮料进行交换,就要通过第三个杯子

那么程序中就要通过第三个变量进行交换:

var a1=100;
var a2=200;
var temp;

temp=a1;
a1=a2;
a2=temp;

console.log(a1);
console.log(a2);

03-变量的数据类型

变量的数据类型

为什么需要数据类型

在计算机中,不同的数据所需占用的存储空间不同,为了充分利用存储空间,于是定义了不同的数据类型

我们都知道,无论这个变量是字符串类型,还是数字类型,我们都可以直接用var去定义它,比如:

var a='hello world';
var b=123;

为什么可以这样做呢?这是因为:JavaScript是一种「弱类型语言」,或者说是一种「动态语言」,这意味着不需要提前声明变量的类型,在程序运行的过程中,类型会自动被确定

JS变量的数据类型,是在程序运行的过程中,根据等号左边的值来确定的

JS中一共有六种数据类型

  • 基本数据类型(值类型): Number数值、String字符串、Boolean布尔型、Null空值、undefined未定义
  • 引用数据类型(引用类型): Object对象

面试问:引用数据类型有几种:

答:只有一种,即Object类型

数据类型之间最大的区别:

  • 基本数据类型:参数赋值时,传“值”
  • 引用数据类型:参数赋值时,传地址==(修改的同一块内存地址)==

一个经典的例子

基本数据类型举例:

var a=23;
var b=a;

a++; //数值加1,地址不变

console.log(a); //打印结果:24
console.log(b); //打印结果:23

引用数据类型举例:

var obj1 = new Object();
obj1.name='magedu';

// 让 obj2 等于 obj1
var obj2 = obj1;

// 修改 obj1 的 name 属性
obj1.name ='网络安全';

console.log(obj1.name);//打印结果:网络安全
console.log(obj2.name);//打印结果:网络安全

栈内存和堆内存

首先我们要记住:JS中,所有的变量都是保存在栈内存中的

基本数据类型:

保存在栈内存中,值与值之间是独立存在,修改一个变量不会影响其他的变量

引用数据类型:

对象保存在堆内存

每创建一个新的对象,就会在堆内存中开辟出一个新的空间;而变量保存了对象的地址,保存在栈内存中,如果两个变量保存了同一个对象的地址,当一个变量修改值时,另一个变量也会受到影响

在这里插入图片描述

04-基本数据类型:String和Boolean

String字符串

语法

被双引号 “”或单引号 ''括起来的任意文本

引号的注意事项

1、单引号和双引号不能混用,比如下面这样写是不可以的:

var str='hello";

2、同类引号不能嵌套:双引号里不能在放双引号,单引号里不能再放单引号,但是可以用\实现转义

3、双引号里可以嵌套单引号,单引号里可以嵌套双引号

转义字符

在字符串中我们可以用\作为转为转义字符,当表示一些特殊符号时可以使用\进行转义

\":双引号”

\':单引号’

\\:\

\r:回车

\n:换行

\t:缩进

\b:空格

获取字符串的长度

通过length属性

var str1='学习';
console.log(str1.length);

字符串拼接

多个字符串之间可以使用加号+进行拼接

拼接规则: 拼接前,会把与字符串相加的这个数据类型转成字符串,然后再拼接成一个新的字符串

var str1='马哥教育'+666;

var obj={name:'无名',age:22};
var str2='无名'+obj.age

console.log(str1);
console.log(str2);

字符串的不可变性

字符串里面的值不可被改变,虽然看上去可以改变内容,但其实是地址了,内存中新开辟了一个内存空间

代码如下:

var str='hello';
str='magedu'

比如上面的代码,当重新给变量str赋值时,常量hello不会被修改,依然保存在内存中,str会改为只想magedu

在这里插入图片描述

模板字符串(模板字面量)

ES6中引入了模板字符串,让我们省去了字符串拼接的烦恼

模板字符串中插入变量

字符在``中表示,变量用${}表示

var name='magedu';
var age='26';

console.log('我是'+name+',age:'+age); //传统写法
console.log(`我是${name},age:${age}`); //ES6写法

模板字符串中插入表达式

ES6语法中不需要\n表示换行,直接回车

const a=5;
const b=10;
console.log('this is '+(a+b)+' and\nnot '+(2*a+b)+'.'); //传统写法
console.log(`this is ${a+b} and
not ${2*a+b}.`); //ES6写法

模板字符串中可以换行

因为模板字符串支持换行,直接回车就可以

模板字符串中可以调用函数

字符串中调用函数的位置,将会显示函数执行后的返回值

function getName(){
    return 'magedu';
}

console.log(`www.${getName()}.com`); //打印结果:www.magedu.com

模板字符串支持嵌套使用

布尔值:Boolean

布尔型有两个值:true和false。主要用来做逻辑判断:true表示真,false表示假

布尔值直接使用就可以了,千万不要加引号

代码:

var a=true;
console.log(typeof a);

控制台输出:

boolean

布尔型和数字型相加时,true按1来算,false按0来算

var str1=1;
var str2=str1+true;

console.log(str2); //结果为2

05-基本数据类型:Number

数值型:Number

在JS中所有的数值都是Number类型,包括整数和浮点数(小数)

数值范围

由于内存的限制,ECMAScript并不能保存世界上所有的数值

  • 最大值:Number.MAX_VALUE,这个值为:1.7976931348623157e+308
  • 最小值:Number_MIN_VALUE,这个值为:5e-324

如果使用Number表示的变量超过了最大值,则会返回Infinity

  • 无穷大(正无穷):Infinity
  • 无穷小(负无穷):-Infinity

注意:typeof Infinity的返回结果是number

NaN

NaN:是一个特殊的数字,表示Not a Number,非数值,比如:

Console.log(abc/18); //结果是NaN
console.log("abc"*"abc") //按理说,字符串相乘是没有结果的,但如果你非要让JS去算,它就一定会给你NaN

注意:typeof NaN的返回结果是number

连字符和加号的区别

键盘上的+可能是连字符,也可能是数字的加号

conso1e.1og(“吃”+"饭”+“没”); //连字符,把三个独立的汉字,连接在一起了
console.1og(1+2+3); //输出6

总结: ** 如果+两边都是**Number类型,此时是数字相加,否则,就是连字符

隐式转换

我们知道,"2"+1得到的结果其实是字符串,但是"2"-1得到的结果却是数值1,
这是因为计算机自动帮我们进行
了**“隐式转换”**

也就是说,-*/% 这几个符号会自动进行隐式转换。例如:

var a="4"+3-6;
console.log(a);

输出结果:

37

虽然程序可以对-*/% 这几个符号自动进行“隐式转换”;但作为程序员,我们最好自己完成转换,方便程序的可读性

浮点数的运算

运算精度问题

在S中,整数的运算基本可以保证精确;但是小数的运算可能会得到一个不精确的结果。所以,千万不要使用JS进行对精确度要求比较高的运算

处理数学运算的精度问题

引用针对数学运算的开源库

变量值的传递(赋值)

语句:

a=b;

把b的值赋给a,b不变

06-基本数据类型:Null和Undefined

Null:空对象

null专门用来定义一个空对象,值只有一个,就是null

使用typeof检查一个null值时,会返回object

let a=null;
console.log(typeof a); //打印结果:object

undefined

case1:变量已声明,未赋值时

声明了一个变量,但没有赋值,此时它的值就是 undefined,举例:

let name;
console.log(name); //打印结果:undefined
console.log(typeof name); //打印结果:undefined

补充:

  • Undefined 类型的值只有一个,就是 undefind。比如let a = undefined
  • 使用 typeof 检查一个 undefined 值时,会返回 undefined

case2:变量未声明时

如果你从未声明一个变量,就去使用它,则会报错;此时,如果用 typeof 检查这个变量时,会返回 undefined。举例:

console.log(typeof a); //undefined
console.log(a); //打印结果:Uncaught ReferenceError: a is not defined

case3:函数无返回值时

如果一个函数没有返回值,那么,这个函数的返回值就是 undefined

或者,也可以这样理解:在定义一个函数时,如果末尾没有 return 语句,那么,其实就是 return undefined

举例:

function foo(){}
console.log(foo()); //打印结果:undefined

case4:调用函数时,未传参

调用函数时,如果没有传参,那么,这个参数的值就是undefined

举例:

function foo(name){
    console.log(name);
}

foo(); //调用函数时,未传参。执行函数后的打印结果:undefined

实际开发中,如果调用函数时没有传参,我们可以给形参设置一个默认值:

function foo(name){
    name=name || 'mage';
    console.log(name);
}

foo(); 

使用ES6语法,上方代码也可以这样写:

function foo(name='mage'){
    console.log(name);
}

foo(); 

其他区别

null和undefined有很大的相似性,尤其是null == undefined的结果为true也更加能说明这点

但是null === undefind的结果是false

=赋值

==判断等于,只判断数值,不判断类型

===判断等于,即判断数值也判断类型

var a=null==undefined;
console.log(a); //结果为:true

他们虽然相似,但还是有区别的,其中的一个区别是,和数字运算时:

  • 10 + null 的结果为10
  • 10 + undefind 的结果为NaN

规律总结:

  • 任何数据类型和undefined运算都是NaN
  • 任何值和null运算,null可看做0运算

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部