一、概念

javascript是一门客户端脚本语言。

* 运行在客户端浏览器中的。每一个浏览器都有JavaScript的解析引擎

* 脚本语言:不需要编译,直接就可以被浏览器解析执行了。

浏览器执行JS简介:

浏览器分为两部分:渲染引擎和JS引擎

渲染引擎:用来解析HTML和CSS,俗称内核,比如chrome浏览器的blink,老版本的webkit。

JS引擎:也称为JS解释器,用来读取网页中的JavaScript代码,对其处理后运行,比如chome浏览器的V8。

浏览器本身并不会执行JS代码,而是通过内置 JavaScript 引擎(解释器) 来执行 JS 代码 。JS 引擎执行代码时逐行解释每一句源码(转换为机器语言),然后由计算机去执行,所以 JavaScript 语言归为脚本语言,会逐行解释执行。

解释型语言和编译型语言

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

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

  • 编译器是在代码执行之前进行编译,生成中间代码文件;

  • 解释器是在运行时进行及时解释,并立即执行(当编译器以解释方式运行的时候,也称之为解释器)。

执行过程

二、功能

* 可以来增强用户和html页面的交互过程,可以来控制html元素,让页面有一些动态的效果,增强用户的体验。

三、JavaScript发展史

1997年,ECMA(欧洲计算机制造商协会),制定出客户端脚本语言的标准:ECMAScript,就是统一了所有客户端脚本语言的编码方式。

ECMAScript:规定了JS的编程语法和基础核心知识

* JavaScript = ECMAScript + JavaScript自己特有的东西(BOM+DOM)

JS的组成:

四、ECMAScript基本语法

1、JS 有3种书写位置

分别为行内、内嵌和外部。

1)、行内式

<input type="button" value="点我试试" onclick="alert('Hello World')" />
  • 可以将单行或少量 JS 代码写在HTML标签的事件属性中(以 on 开头的属性),如:onclick

  • 注意单双引号的使用:在HTML中我们推荐使用双引号, JS 中我们推荐使用单引号

  • 可读性差, 在html中编写JS大量代码时,不方便阅读;

  • 引号易错,引号多层嵌套匹配时,非常容易弄混;

  • 特殊情况下使用。

2)、内嵌式

<script>
    alert('Hello  World~!');
</script>
  • 可以将多行JS代码写到 script 标签中

  • 内嵌 JS 是学习时常用的方式

3)、外部JS文件

<script src="my.js"></script>
  • 利于HTML页面代码结构化,把大段 JS代码独立到 HTML 页面之外,既美观,也方便文件级别的复用;

  • 引用外部 JS文件的 script 标签中间不可以写代码;

  • 适合于JS 代码量比较大的情况。

2、JavaScript输入输出语句

为了方便信息的输入输出,JS中提供了一些输入输出语句,其常用的语句如下:

方法说明归属
alert(msg) 浏览器弹出警示框 浏览器
console.log(msg) 浏览器控制台打印输出信息 浏览器
prompt(info) 浏览器弹出输入框,用户可以输入 浏览器
  • 注意:alert() 主要用来显示消息给用户,console.log() 用来给程序员自己看运行时的消息。

<script>
        /*alert('我是编程语言,来控制电脑网页弹出你好');
        alert('我是编程语言,来控制电脑网页弹出你好');*/
        prompt("请输入你的年龄!")
    </script>

效果如下:

3、与html结合方式

1)、内部JS:

* 定义<script>,标签体内容就是js代码。

2)、外部JS:

* 定义<script>,通过src属性引入外部的js文件。如下所示:

<script type="text/javascript" src="${ctx}/static/js/plugins/layui/layui.all.js"></script>

* 注意:

1)、<script>可以定义在html页面的任何地方。但是定义的位置会影响执行顺序。

2)、<script>可以定义多个。

4、注释

1)、单行注释://注释内容,快捷键   ctrl  +  /

2)、多行注释:/*注释内容*/,快捷键修改为: ctrl + shift + /

5、数据类型

JS 把数据类型分为两类:

  • 简单数据类型 (Number,String,Boolean,Undefined,Null)

  • 复杂数据类型 (object)

1)、原始数据类型(基本数据类型):

  • number:数字。 整数/小数/NaN(not a number 一个不是数字的数字类型);

  • string:字符串。 字符串 "abc" "a" 'abc'。注意:JS中字符串都带引号;

  • boolean: true和false,等价于1和0;

  • null:一个对象为空的占位符;

  • undefined:未定义。如果一个变量没有给初始化值,则会被默认赋值为undefined。

数字型

数字型范围:JavaScript中数值的最大和最小值

  • 最大值:Number.MAX_VALUE,这个值为: 1.7976931348623157e+308

  • 最小值:Number.MIN_VALUE,这个值为:5e-32

数字型三个特殊值:

  • Infinity ,代表无穷大,大于任何数值

  • -Infinity ,代表无穷小,小于任何数值

  • NaN ,Not a number,代表一个非数值

isNaN:用来判断一个变量是否为非数字的类型,返回 true 或者 false

var usrAge = 21;
var isOk = isNaN(userAge);
console.log(isNum);          // false ,21 不是一个非数字
var usrName = "andy";
console.log(isNaN(userName));// true ,"andy"是一个非数字

字符串型 String

因为 HTML 标签里面的属性使用的是双引号,JS 这里我们更推荐使用单引号。

字符串引号嵌套:

JS 可以用单引号嵌套双引号 ,或者用双引号嵌套单引号 (外双内单,外单内双)

var strMsg = '我是"高帅富"程序猿';   // 可以用''包含""
var strMsg2 = "我是'高帅富'程序猿";  // 也可以用"" 包含''

字符串转义符:

转义符都是 \ 开头的,常用的转义符及其说明如下:

转义符解释说明
\n 换行符,n 是 newline 的意思
\ \ 斜杠 \
' ' 单引号
" ”双引号
\t tab 缩进
\b 空格 ,b 是 blank 的意思

length 属性可以获取整个字符串的长度:

var strMsg = "我是帅气多金的程序猿!";
alert(strMsg.length); // 显示 11

字符串拼接:

多个字符串之间可以使用 + 进行拼接,其拼接方式为 字符串 + 任何类型 = 拼接之后的新字符串。

拼接前会把与字符串相加的任何类型转成字符串,再拼接成一个新的字符串

如果变量两侧都有字符串拼接,口诀“引引加加 ”,删掉数字,变量写加中间。

布尔型Boolean

布尔型和数字型相加的时候, true 的值为 1 ,false 的值为 0。

console.log(true + 1);  // 2
console.log(false + 1); // 1

Undefined

一个声明后没有被赋值的变量会有一个默认值undefined ( 如果进行相连或者相加时,注意结果)

var variable;
console.log(variable);           // undefined
console.log('你好' + variable);  // 你好undefined
console.log(11 + variable);     // NaN
console.log(true + variable);   //  NaN

一个声明变量给 null 值,里面存的值为空

var vari = null;
console.log('你好' + vari);  // 你好null
console.log(11 + vari);     // 11
console.log(true + vari);   //  1

2)、引用数据类型:对象

6、变量

变量:一小块存储数据的内存空间。

1)、声明变量:

//  声明变量  
var age; //  声明一个 名称为age 的变量 ,但是没有赋值,此时age = undefined
  • var 是一个 JS关键字,用来声明变量( variable 变量的意思 )。使用该关键字声明变量后,计算机会自动为变量分配内存空间,不需要程序员管

  • age 是程序员定义的变量名,我们要通过变量名来访问内存中分配的空间

JavaScript 是一种弱类型或者说动态语言。这意味着不用提前声明变量的类型,在程序运行过程中,类型会被自动确定:

var age = 10;        // 这是一个数字型
var areYouOk = '是的';   // 这是一个字符串  

在代码运行时,变量的数据类型是由 JS引擎 根据 = 右边变量值的数据类型来判断 的,运行完毕之后, 变量就确定了数据类型。JavaScript 拥有动态类型,同时也意味着相同的变量可用作不同的类型:

var x = 6;           // x 为数字
var x = "Bill";      // x 为字符串  

同时声明多个变量

  同时声明多个变量时,只需要写一个 var, 多个变量名之间使用英文逗号隔开。

var age = 10,  name = 'zs', sex = 2;  

声明变量特殊情况:

情况说明结果
var age ; console.log (age); 只声明 不赋值 undefined
console.log(age) 不声明 不赋值 直接使用 报错
age = 10; console.log (age); 不声明 只赋值 10

2)、赋值:

age = 10; // 给 age  这个变量赋值为 10  
  • = 用来把右边的值赋给左边的变量空间中 此处代表赋值的意思

  • 变量值是程序员保存到变量空间里的值

3)、变量的初始化:

语法:var 变量名 = 初始化值;

var age  = 18;  // 声明变量同时赋值为 18
// 声明一个变量并赋值, 我们称之为变量的初始化。

4)、变量命名规范:

  • 由字母(A-Za-z)、数字(0-9)、下划线(_)、美元符号( $ )组成,如:usrAge, num01, _name

  • 严格区分大小写。var app; 和 var App; 是两个变量

  • 不能以数字开头。 18age 是错误的

  • 不能是关键字、保留字。例如:var、for、while

  • 变量名必须有意义。 MMD BBD nl → age

  • 遵守驼峰命名法。首字母小写,后面单词的首字母需要大写。myFirstName

Java语言是强类型语言,而JavaScript是弱类型语言。

  强类型:在开辟变量存储空间时,定义了空间将来存储的数据的数据类型。只能存储固定类型的数据

  弱类型:在开辟变量存储空间时,不定义空间将来的存储数据类型,可以存放任意类型的数据。

5)、获取变量的数据类型

var num = 18;
console.log(typeof num) // 结果 number   

不同类型的返回值

注:null运算后得到的是object。

7、运算符

1)、一元运算符:只有一个运算数的运算符

(1)、++ --: 自增(自减)

  ++(--) 在前,先自增(自减),再运算

var  num = 10;
alert(++num + 10);   // 21

  ++(--) 在后,先运算,再自增(自减)

var  num = 10;
alert(10 + num++);  // 20

(2)、+(-):正负号

注意:在JS中,如果运算数不是运算符所要求的类型,那么js引擎会自动的将运算数进行类型转换

其他类型转number:Number()

  string转number:按照字面值转换。如果字面值不是数字,则转为NaN(不是数字的数字)。

  boolean转number:true转为1,false转为0。

2)、算数运算符:+ - * / % 

3)、赋值运算符:= += -=

4)、比较运算符:> < >= <= == ===(全等于)

console.log(18 == '18'); // true
console.log(18 === '18');  // false

比较方式:

(1)、类型相同:直接比较

  字符串:按照字典顺序比较。按位逐一比较,直到得出大小为止。

(2)、类型不同:先进行类型转换,再比较

  ===:全等于。在比较之前,先判断类型,如果类型不一样,则直接返回false

5)、逻辑运算符:&& || !

短路运算(逻辑中断)

短路运算的原理:当有多个表达式(值)时,左边的表达式值可以确定结果时,就不再继续运算右边的表达式的值;

逻辑与:

语法: 表达式1 && 表达式2

- 如果第一个表达式的值为真,则返回表达式2
- 如果第一个表达式的值为假,则返回表达式1

例子

console.log( 123 && 456 );        // 456
console.log( 0 && 456 );          // 0
console.log( 123 && 456&& 789 );  // 789

逻辑或:

语法: 表达式1 || 表达式2

- 如果第一个表达式的值为真,则返回表达式1
- 如果第一个表达式的值为假,则返回表达式2

例子:

console.log( 123 || 456 );         //  123
console.log( 0 ||  456 );          //  456
console.log( 123 || 456 || 789 );  //  123

其他类型转boolean:

(1)、number:0或NaN为假,其他为真。

(2)、 string:除了空字符串(""),其他都是true。

(3)、null&undefined:都是false。

(4)、对象:所有对象都为true。

6)、三元运算符  ? : 表达式

语法:

* 表达式? 值1:值2;
* 判断表达式的值,如果是true则取值1,如果是false则取值2;

例子:

var a = 3;
var b = 4;
var c = a > b ? 1:0;

(7)、运算符优先级

  • 一元运算符里面的逻辑非优先级很高

  • 逻辑与比逻辑或优先级高

8、流程控制语句

(1)、if...else...

// 条件成立  执行 if 里面代码,否则执行else 里面的代码
if (条件表达式) {
    // [如果] 条件成立执行的代码
} else {
    // [否则] 执行的代码
}

(2)、switch:

switch 语句也是多分支语句,它用于基于不同的条件来执行不同的代码。当要针对变量设置一系列的特定值的选项时,就可以使用 switch。

在java中,switch语句可以接受的数据类型: byte int shor char,枚举(1.5) ,String(1.7)

switch( 表达式 ){ 
    case value1:
        // 表达式 等于 value1 时要执行的代码
        break;
    case value2:
        // 表达式 等于 value2 时要执行的代码
        break;
    default:
        // 表达式 不等于任何一个 value 时要执行的代码
}

执行case 里面的语句时,如果没有break,则继续执行下一个case里面的语句。

在JS中,switch语句可以接受任意的原始数据类型

(3)、while

while (条件表达式) {
    // 循环体代码 
}

(4)、do...while

do {
    // 循环体代码 - 条件表达式为 true 时重复执行循环体代码
} while(条件表达式);

(5)、for

for(初始化变量; 条件表达式; 操作表达式 ){
    //循环体
}

continue 关键字用于立即跳出本次循环,继续下一次循环,break 关键字用于立即跳出整个循环(循环结束)。

9、JS特殊语法

(1)、语句以;结尾,如果一行只有一条语句则 ;可以省略 (不建议)

(2)、变量的定义使用var关键字,也可以不使用

  * 用: 定义的变量是局部变量

  * 不用:定义的变量是全局变量(不建议)

10、数据类型转换

使用表单、prompt 获取过来的数据默认是字符串类型的,此时就不能直接简单的进行加法运算,而需要转换变量的数据类型。通俗来说,就是把一种数据类型的变量转换成另一种数据类型,通常会实现3种方式的转换:

1)、转换为字符串

三种转换方式,更多第三种加号拼接字符串转换方式, 这一种方式也称之为隐式转换。

2)、转换为数字型(重点)

 注意 parseInt 和 parseFloat 单词的大小写,这2个是重点

隐式转换是我们在进行算数运算的时候,JS 自动转换了数据类型

3)、转换为布尔型

代表空、否定的值会被转换为 false ,如 ''、0、NaN、null、undefined,其余值都会被转换为 true。

console.log(Boolean('')); // false
console.log(Boolean(0)); // false
console.log(Boolean(NaN)); // false
console.log(Boolean(null)); // false
console.log(Boolean(undefined)); // false
console.log(Boolean('小白')); // true
console.log(Boolean(12)); // true

11、标识符、关键字、保留字

  标识(zhi)符:就是指开发人员为变量、属性、函数、参数取的名字。标识符不能是关键字或保留字。

  关键字:是指 JS本身已经使用了的字,不能再用它们充当变量名、方法名。包括:break、case、catch、continue、default、delete、do、else、finally、for、function、if、in、instanceof、new、return、switch、this、throw、try、typeof、var、void、while、with 等。

  保留字:实际上就是预留的“关键字”,意思是现在虽然还不是关键字,但是未来可能会成为关键字,同样不能使用它们当变量名或方法名。包括:boolean、byte、char、class、const、debugger、double、enum、export、extends、fimal、float、goto、implements、import、int、interface、long、mative、package、private、protected、public、short、static、super、synchronized、throws、transient、volatile 等。

注意:如果将保留字用作变量名或函数名,那么除非将来的浏览器实现了该保留字,否则很可能收不到任何错误消息。当浏览器将其实现后,该单词将被看做关键字,如此将出现关键字错误。

五、ECMAScript基本对象

1、Function:函数(方法)对象

1)、创建

第一种:

var fun = new Function(形式参数列表,方法体);  //忘掉吧

第二种:自定义函数方式(命名函数)

function 方法名称(形式参数列表){
    方法体
}
  • 调用函数的代码既可以放到声明函数的前面,也可以放在声明函数的后面。

例子:

function showViewById(id, w, h) {
        layer_full(" ", ctx + menuUri + "/show?id=" + id, w, h);
    }

第三种:函数表达式方式(匿名函数)

var 方法名 = function(形式参数列表){
    方法体
}
  • 因为函数没有名字,所以也被称为匿名函数;

  • 这个fn 里面存储的是一个函数;

  • 函数表达式方式原理跟声明变量方式是一致的;

  • 函数调用的代码必须写到函数体后面。

函数的形参实际上就是局部变量。

2)、特点

(1)、方法定义是,形参的类型不用写,返回值类型也不写。

(2)、方法是一个对象,如果定义名称相同的方法,会覆盖。

(3)、在JS中,方法的调用只与方法的名称有关,和参数列表无关。

(4)、在方法声明中有一个隐藏的内置对象(数组),arguments,封装所有的实际参数。

3)、调用

方法名称(实际参数列表);
  • 形参:函数定义时设置接收调用时传入

  • 实参:函数调用时传入小括号内的真实数据

// 带参数的函数声明
function 函数名(形参1, 形参2 , 形参3...) { // 可以定义任意多的参数,用逗号分隔
  // 函数体
}
// 带参数的函数调用
函数名(实参1, 实参2, 实参3...); 

函数形参和实参数量不匹配时:

注意:在JavaScript中,形参的默认值是undefined。

2、内置对象Array:数组对象

1)、创建

创建空数组

var arr = new Array();

如果需要使用构造函数Array创建非空数组,可以在创建数组时传入参数

(1)、var arr = new Array(元素列表);

(2)、var arr = new Array(默认长度);

(3)、var arr = [元素列表];

var arr = [1,"test",true];

2)、方法

  join(参数):将数组中的元素按照指定的分隔符拼接为字符串。

  push() 向数组的末尾添加一个或更多元素,并返回新的长度。

3)、属性

length:数组的长度,使用“数组名.length”可以访问数组元素的数量(数组长度)。

4)、特点

(1)、JS中,数组元素的类型可变的。

数组元素的类型:

数组中可以存放任意类型的数据,例如字符串,数字,布尔值等。

var arrStus = ['小白',12,true,28.9];

(2)、JS中,数组长度可变的。

数组的length属性可以被修改:

  如果设置的length属性值大于数组的元素个数,则会在数组末尾出现空白元素;

  如果设置的length属性值小于数组的元素个数,则会把超过该值的数组元素删除;

5)、数组中新增元素

数组中可以通过以下方式在数组的末尾插入新元素:

 数组[ 数组.length ] = 新数据;

6)、检测是否为数组

方法一:instanceof 运算符:

instanceof 可以判断一个对象是否是某个构造函数的实例

var arr = [1, 23];
var obj = {};
console.log(arr instanceof Array); // true
console.log(obj instanceof Array); // false

方法二:Array.isArray()

Array.isArray()用于判断一个对象是否为数组,isArray() 是 HTML5 中提供的方法

var arr = [1, 23];
var obj = {};
console.log(Array.isArray(arr));   // true
console.log(Array.isArray(obj));   // false

7)、添加删除数组元素的方法

数组中有进行增加、删除元素的方法,部分方法如下表

注意:push、unshift为增加元素方法;pop、shift为删除元素的方法

8)、数组排序

数组中有对数组本身排序的方法,部分方法如下表

 注意:sort方法需要传入参数来设置升序、降序排序

  • 如果传入“function(a,b){ return a-b;}”,则为升序

  • 如果传入“function(a,b){ return b-a;}”,则为降序

9)、数组索引方法:

数组中有获取数组指定元素索引值的方法,部分方法如下表

 10)、数组转成字符串

数组中有把数组转化为字符串的方法,部分方法如下表

注意:join方法如果不传入参数,则按照 “ , ”拼接元素。

11)、其他方法

数组中还有其他操作方法

3、Boolean

4、内置对象Date:日期对象

Date 对象和 Math 对象不一样,Date是一个构造函数,所以使用时需要实例化后才能使用其中具体方法和属性。Date 实例用来处理日期和时间。

1)、创建,获取当前时间

var date = new Date();

获取指定时间的日期对象

var future = new Date('2019/5/1');

注意:如果创建实例时并未传入参数,则得到的日期对象是当前时间对应的日期对象。

2)、方法

  toLocaleString():返回当前date对象对应的时间本地字符串格式。

  getTime():获取毫秒值。返回当前如期对象描述的时间到1970年1月1日零点的毫秒值差。

使用Date实例的方法和属性:

 通过Date实例获取总毫秒数

// 实例化Date对象
var now = new Date();
// 1. 用于获取对象的原始值
console.log(date.valueOf())    
console.log(date.getTime())    
// 2. 简单写可以这么做
var now = + new Date();            
// 3. HTML5中提供的方法,有兼容性问题
var now = Date.now();

5、内置对象Math:数学对象

Math 对象不是构造函数,它具有数学常数和函数的属性和方法。跟数学相关的运算(求绝对值,取整、最大值等)可以使用 Math 中的成员。

1)、创建

  特点:Math对象不用创建,直接使用。  Math.方法名();

2)、方法

  random():返回 0 ~ 1 之间的随机数。 含0不含1

  ceil(x):对数进行上舍入。

  floor(x):对数进行下舍入。

  round(x):把数四舍五入为最接近的整数。

属性、方法名功能
Math.PI 圆周率
Math.floor() 向下取整
Math.ceil() 向上取整
Math.round() 四舍五入版 就近取整 注意 -3.5 结果是 -3
Math.abs() 绝对值
Math.max()/Math.min() 求最大和最小值
Math.random() 获取范围在[0,1)内的随机值

注意:上面的方法使用时必须带括号。

6、Number

7、内置对象String

为了方便操作基本数据类型,JavaScript 还提供了三个特殊的引用类型:String、Number和 Boolean。

基本包装类型就是把简单数据类型包装成为复杂数据类型,这样基本数据类型就有了属性和方法。

// 下面代码有什么问题?
var str = 'andy';
console.log(str.length);

按道理基本数据类型是没有属性和方法的,而对象才有属性和方法,但上面代码却可以执行,这是因为js 会把基本数据类型包装为复杂数据类型,其执行过程如下 :

// 1. 生成临时变量,把简单类型包装为复杂数据类型
var temp = new String('andy');
// 2. 赋值给我们声明的字符变量
str = temp;
// 3. 销毁临时变量
temp = null;

1)、字符串不可变

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

当重新给字符串变量赋值的时候,变量之前保存的字符串不会被修改,依然在内存中重新给字符串赋值,会重新在内存中开辟空间,这个特点就是字符串的不可变。

由于字符串的不可变,在大量拼接字符串的时候会有效率问题

2)、根据字符返回位置

字符串通过基本包装类型可以调用部分方法来操作字符串,以下是返回指定字符的位置的方法:

案例:查找字符串"abcoefoxyozzopp"中所有o出现的位置以及次数

先查找第一个o出现的位置,然后 只要indexOf 返回的结果不是 -1 就继续往后查找,因为indexOf 只能查找到第一个,所以后面的查找,利用第二个参数,当前索引加1,从而继续查找。

3)、根据位置返回字符

字符串通过基本包装类型可以调用部分方法来操作字符串,以下是根据位置返回指定位置上的字符:

在上述方法中,charCodeAt方法返回的是指定位置上字符对应的ASCII码

4)、字符串操作方法

字符串通过基本包装类型可以调用部分方法来操作字符串,以下是部分操作方法:

5)、replace方法

replace() 方法用于在字符串中用一些字符替换另一些字符,其使用格式如下:

字符串.replace(被替换的字符串, 要替换为的字符串);

6)、split方法

split()方法用于切分字符串,它可以将字符串切分为数组。在切分完毕之后,返回的是一个新数组。

字符串.split("分割字符")

8、RegExp:正则表达式对象

1)、正则表达式:定义字符串的组成规则

(1)、单个字符:[]

  如: [a] [ab] [a-zA-Z0-9_]

特殊符号代表特殊含义的单个字符: 

  \d:单个数字字符 [0-9]

  \w:单个单词字符[a-zA-Z0-9_]

(2)、量词符号

  ?:表示出现0次或1次

  *:表示出现0次或多次

  +:出现1次或多次

  {m,n}:表示 m<= 数量 <= n

    * m如果缺省: {0,n}:最多n次

    * n如果缺省:{m,} 最少m次

(3)、开始结束符号

  ^:开始

  $:结束

2)、正则对象

(1)、创建

var reg = new RegExp("正则表达式");

var reg = /^正则表达式$/;

(2)、方法

  test(参数):验证指定的字符串是否符合正则定义的规范。

9、Global

1)、特点

  全局对象,这个Global中封装的方法不需要对象就可以直接调用。  方法名();

2)、方法

  encodeURI():url编码

  decodeURI():url解码

  encodeURIComponent():url编码,编码的字符更多

  decodeURIComponent():url解码

  parseInt():将字符串转为数字。逐一判断每一个字符是否是数字,直到不是数字为止,将前边数字部分转为number

  isNaN():判断一个值是否是NaN。NaN六亲不认,连自己都不认。NaN参与的==比较全部问false。

  eval():讲 JavaScript 字符串,并把它作为脚本代码来执行。

3)、URL编码

六、预解析

JavaScript 代码是由浏览器中的 JavaScript 解析器来执行的。JavaScript 解析器在运行 JavaScript 代码的时候分为两步:预解析和代码执行。

预解析:在当前作用域下, JS 代码执行之前,浏览器会默认把带有 var 和 function 声明的变量在内存中进行提前声明或者定义。

代码执行: 从上到下执行JS语句。

预解析会把变量和函数的声明在代码执行之前执行完成。

1、变量预解析

预解析也叫做变量、函数提升。

变量提升(变量预解析): 变量的声明会被提升到当前作用域的最上面,变量的赋值不会提升。

console.log(num);  // 结果是多少?
var num = 10;      //

结果:undefined

注意:**变量提升只提升声明,不提升赋值**

2、函数预解析

函数提升: 函数的声明会被提升到当前作用域的最上面,但是不会调用函数。

fn();
function fn() {
    console.log('打印');
}

结果:控制台打印字符串 --- ”打印“ 

注意:函数声明代表函数整体,所以函数提升后,函数名代表整个函数,但是函数并没有被调用!

3、函数表达式声明函数问题

函数表达式创建函数,会执行变量提升,此时接收函数的变量名无法正确的调用:

fn();
var  fn = function() {
    console.log('想不到吧');
}

结果:报错提示 ”fn is not a function"

解释:该段代码执行之前,会做变量声明提升,fn在提升之后的值是undefined;而fn调用是在fn被赋值为函数体之前,此时fn的值是undefined,所以无法正确调用  

七、简单数据类型和复杂数据类型

1)、堆栈空间分配区别

栈:由操作系统自动分配释放存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈;

堆:存储复杂类型(对象),一般由程序员分配释放,若程序员不释放,由垃圾回收机制回收。

简单类型基本数据类型值类型):在存储时变量中存储的是值本身,包括string ,number,boolean,undefined,null。

简单数据类型的存储方式:值类型变量的数据直接存放在变量(栈空间)中

复杂数据类型(引用类型):在存储时变量中存储的仅仅是地址(引用),通过 new 关键字创建的对象(系统对象、自定义对象),如 Object、Array、Date等;

复杂数据类型的存储方式:引用类型变量(栈空间)里存放的是地址,真正的对象实例存放在堆空间中

2)、简单类型传参

函数的形参也可以看做是一个变量,当我们把一个值类型变量作为参数传给函数的形参时,其实是把变量在栈空间里的值复制了一份给形参,那么在方法内部对形参做任何修改,都不会影响到的外部变量。

function fn(a) {
    a++;
    console.log(a); 
}
var x = 10;
fn(x);
console.log(x);

结果为:11和10

3)、复杂数据类型传参

函数的形参也可以看做是一个变量,当我们把引用类型变量传给形参时,其实是把变量在栈空间里保存的堆地址复制给了形参,形参和实参其实保存的是同一个堆地址,所以操作的是同一个对象。

function Person(name) {
    this.name = name;
}
function f1(x) { // x = p
    console.log(x.name); // 2. 这个输出什么 ?    
    x.name = "张学友";
    console.log(x.name); // 3. 这个输出什么 ?    
}
var p = new Person("刘德华");
console.log(p.name);    // 1. 这个输出什么 ?   
f1(p);
console.log(p.name);    // 4. 这个输出什么 ?  

结果:刘德华 刘德华 张学友 张学友

 

posted on 2021-12-27 10:38  周文豪  阅读(128)  评论(0编辑  收藏  举报