基础总结 初始JavaScript
JavaScript 是一种运行在客户端的脚本语言
浏览器执行JS简介 浏览器分成两部分:渲染引擎和 JS 引擎
渲染引擎:用来解析HTML与CSS,俗称内核,比如 chrome 浏览器的 blink ,老版本的 webkit
JS 引擎:也称为 JS 解释器。 用来读取网页中的JavaScript代码,对其处理后运行,比如 chrome 浏览器的 V8
JS 引擎执行代码时逐行解释每一句源码(转换为机器语言),然后由计算机去执行
JS的组成 JavaScript 包括 ECMAScript、DOM、BOM
ECMAScript ECMAScript 规定了JS的编程语法和基础核心知识,是所有浏览器厂商共同遵守的一套JS语法工业标准。
DOM文档对象模型 文档对象模型 (Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标记语言的标准编程接口。通过 DOM 提供的接口可以对页面上的各种元素进行操作(大小、位置、颜色等)。
BOM浏览器对象模型 浏览器对象模型 (Browser Object Model,简称BOM),提供了独立于内容的、可以与浏览器窗口进行互动的对象结构。通过BOM可以操作浏览器窗口,比如弹出框、控制浏览器跳转、获取分辨率等。
JS初体验 JS引入方式
1 <input type="button" value="" onclink="javascript:alert('Hello World')" />
可以将单行或少量JS代码写在HTML标签的事件属性中(以on开头的属性),如: onclink
注意单双引号的使用:在HTML中我们推荐使用双引号,JS中我们推荐使用单引号
1 2 3 <script> alert('Hello World!' ); </script>
可以将多行JS代码写到<script>
标签中
内嵌 JS 是学习时常用的方式
1 <script src="my.js" ></script>
引用外部JS文件的script标签中间不可以写代码
基本语法 注释
输入输出语句
方法
说明
归属
alert(msg);
浏览器弹出警示框
浏览器
console.log(msg);
浏览器控制台打印信息(主要给程序员看)
浏览器
prompt(info);
浏览看弹出输入框,用户可以输入
浏览器
变量 初始化
var是一个JS关键字,用来声明变量(variable变量的意思)。使用该关键字声明变量后,计算机会自动为变量分配内存空间。
age 是程序员定义的变量名,我们要通过变量名来访问内存中分配的空间
1 2 3 4 var age = 18 ; var age = 18 , address ='火影村' ,salary = 15000 ;
特殊情况
情况
说明
结果
var age; console.log(age);
只声明,不赋值
undefined
console.log(age)
不声明 不赋值 直接使用
报错
age = 10;console.log(age);
不声明 只赋值
10
命名规范 数据类型 JavaScript 是一种弱类型或者说动态语言 。这意味着不用提前声明变量的类型,在程序运行过程中,类型会被自动确定。
在代码运行时,变量的数据类型是由 JS引擎 根据 = 右边变量值的数据类型来判断 的,运行完毕之后, 变量就确定了数据类型。
JavaScript 拥有动态类型,同时也意味着相同的变量可用作不同的类型
1 2 var x = 6 ; var x = "Bill" ;
基本数据类型
简单数据类型
说明
默认值
Number
数字型,包含整型值和浮点型值,如21,0.21
0
Boolean
布尔值类型,如true,false ,等价于1和0
false
Undefined
var a; 声明了变量a但是没有赋值,此时a=undefined
undefined(未定义的)
string
字符串类型,如“张三”
“”
Null
var a = null; 声明了变量a为空值
null
数字型Number 1 2 var age = 12 ; var Age = 21.3747 ;
1 2 3 4 5 6 var userAge = 21 ;var isOk = isNan(userAge);console .log(isOk); var userName = "andy" ;console .log(isNan(userName));
字符串型string 1 2 var strMsg = "我爱北京天安门" ; var strMsg = '我爱北京' ;
1 2 var strMsg ='我是一个"高富帅"' var strMsg2 ="我是'高富帅'"
字符串转义符
字符串长度:通过length属性获取
1 2 var strMsg = "我是高富帅!" ;alert(strMsg.length);
字符串拼接
多个字符串之间可以使用 + 进行拼接,其拼接方式为 字符串 + 任何类型 = 拼接之后的新字符串
拼接前会把与字符串相加的任何类型转成字符串,再拼接成一个新的字符串
布尔型Boolean
布尔型和数字型相加的时候, true 的值为 1 ,false 的值为 0。
1 2 var flag = true ;console .log(flag + 1 );
未定义undefined
一个声明后没有被赋值 的变量会有一个默认值 undefined ( 如果进行相连或者相加时,注意结果
1 2 3 4 5 6 var str;console .log(str); var variable = undefined ;console .log(variable + 'Pink' ); console .log(variable + 18 );
空值
1 2 3 var space = null ;console .log(space + 'pink' ); console .llog(space + 1 );
typeof
typeof 可用来获取检测变量的数据类型, 空值结果为object
数据类型转换 使用表单、prompt 获取过来的数据默认是字符串类型的,此时就不能直接简单的进行加法运算,而需要转换变量的数据类型。
转换为字符串型
方式
说明
案例
toString()
转成字符串
var num = 1; alert(num.toString());
String()强制转换
转成字符串
var num = 1; alert(String(num));
加号拼接字符串
和字符串拼接的结果都是字符串
var num =1; alert(num+“我是字符串”);
转换为数字型
方式
说明
案例
parselnt(string)函数
将string类型转成整数数值型
parselnt(‘78’)
parseFloat(string)函数
将string类型转成浮点数数值型
parseFloat(‘78.21’)
Number()强制转换函数
将string类型转换为数值型
Number(‘12’)
js 隐式转换**( - * / ) **
利用算术运算隐式转换为数值型
‘12’-0
转换为布尔型
方法
说明
案例
Boolean()函数
其他类型转成布尔值
Boolean(‘true’);
代表空,否定的值会被转换为false,如 ’ ’ , 0, NaN , null , undefined
其余的值都会被被转换为true
运算符 运算符(operator)也被称为操作符 ,是用于实现赋值、比较和执行算数运算等功能的符号
算数运算符
浮点数精度问题: 浮点数值的最高精度是17位小数,但在进行算数计算时其精确度远远不如整数
1 2 var result = 0.1 +0.2 ; console .log(0.07 * 100 );
递增和递减运算符 比较运算符
运算符名称
说明
案例
结果
<
小于号
1 < 2
true
>
大于号
1 > 2
false
>=
大于等于号(大于或者等于)
2 >= 2
true
<=
小于等于号(小于或者等于)
3 <= 2
false
==
判等号(会隐式转型)
37 == 37
true
!=
不等号
37 != 37
false
===
全等 要求值和数据类型都一致
37 === ‘37’
false
逻辑运算符 && || !
赋值运算符 = += -= *= /= %=
流程控制 分支,循环
数组 创建数组
1 2 3 4 5 6 var 数组名 = [];var 数组名 = ['小白' ,'小黑' ,'小黄' ,'瑞奇' ];var arrStus = ['小白' , 12 , true , 28.9 ];
数组索引(下标) 遍历数组 for循环
数组长度 1 2 var arrStus = [1 ,2 ,3 ];alert(arrStus.length);
数组中新增元素
通过修改length长度新增数组元素
可以通过修改 length 长度来实现数组扩容的目的
1 2 3 4 5 6 var arr = ['red' , 'green' , 'blue' , 'pink' ];arr.length = 7 ; console .log(arr);console .log(arr[4 ]);console .log(arr[5 ]);console .log(arr[6 ]);
通过修改数组索引新增数组元素
1 2 3 var arr = ['red' , 'green' , 'blue' , 'pink' ];arr[4 ] = 'hotpink' ; console .log(arr);
函数 函数声明
1 2 3 4 5 6 function fn ( ) { } fn();
1 2 3 4 var fn = function ( ) {...};fn();
调用函数
函数的参数 1 2 3 4 5 6 7 8 function getSum (num1,num2 ) { console .log(num1+num2) } getSum(1 ,3 ) getSum(6 ,5 )
参数个数
说明
实参个数等于形参个数
输出正确结果
实参个数多于形参个数
只取到形参的个数
实参个数小于形参个数
多的形参定义为undefined,结果为NaN
1 2 3 4 5 6 7 8 9 function sum (num1, num2 ) { console .log(num1 + num2); } sum(100 , 200 ); sum(100 , 400 , 500 , 700 ); sum(200 );
函数的返回值
arguments的使用 当我们不确定有多少个参数传递的时候,可以用 arguments 来获取。在 JavaScript 中,arguments 实际上它是当前函数的一个内置对象。所有函数都内置了一个 arguments 对象,arguments 对象中存储了传递的所有实参 。
arguments展示形式是一个伪数组,因此可以进行遍历
具有length属性
可以按索引存储数据
不具有数组的push,pop等方法
作用域 JavaScript (ES6前) 中的作用域有两种:
全局作用域 作用于所有代码执行的环境(整个 script 标签内部)或者一个独立的 js 文件
局部(函数)作用域 作用于函数内 的代码环境,就是局部作用域。 因为跟函数有关系,所以也称为函数作用域
1 2 3 4 5 if (true ){ int num = 123 ; System.out.println(num); } System.out.println(num);
变量的作用域 在JavaScript中,根据作用域的不同,变量可以分为两种:全局变量和局部变量
全局变量 在全局作用域下声明的变量叫做全局变量(在函数外部定义的变量 )
全局变量在代码的任何位置都可以使用
在全局作用域下 var 声明的变量 是全局变量
特殊情况下,在函数内不使用 var 声明的变量也是全局变量
局部变量
局部变量只能在该函数内部使用
在函数内部 var 声明的变量是局部变量
函数的形参 实际上就是局部变量
作用域链 1 2 3 4 5 6 7 8 9 10 11 var num = 10 ;funtion fn ( ) { var num = 20 ; function fun ( ) { console .log(num); } }
预解析 JavaScript 代码是由浏览器中的 JavaScript 解析器来执行的。JavaScript 解析器在运行 JavaScript 代码的时候分为两步:预解析和代码执行
预解析 :js引擎会把js里面所有的 var 还有 function 提升到当前作用域的最前面
代码执行 :从上到下执行JS语句
变量预解析 变量预解析也叫做变量提升
变量提升: 变量的声明会被提升到当前作用域的最上面,变量的赋值不会提升
1 2 3 4 5 6 7 8 console .log(num); var num = 10 ; var num; console .log(num);num = 10 ;
函数预解析 函数预解析也叫做函数提升
函数提升: 函数的声明会被提升到当前作用域的最上面,但是不会调用函数
匿名函数(函数表达式方式): 函数调用必须写在函数声明的下面
1 2 3 4 5 6 7 8 9 10 11 12 fn(); var fn = function ( ) { console .log('22' ); } var fn;fn(); var fn = function ( ) { console .log('22' ); }
对象 在 JavaScript 中,对象是一组无序的相关属性和方法的集合,所有的事物都是对象,例如字符串、数值、数组、函数等
创建对象 利用字面量创建对象 对象字面量:就是花括号 { }
里面包含了表达这个具体事物(对象)的属性和方法
{ }
里面采取键值对的形式表示
1 2 3 4 5 6 7 8 9 10 var star = { name : 'pink' , age : 18 , sex : '男' , sayHi : function ( ) { alert('大家好啊~' ); } };
对象调用
属性调用:1.对象.属性名 2.对象[‘属性名’]
函数调用:对象.方法名()
1 2 3 console .log(star.name) console .log(star['name' ]) star.sayHi();
利用new Object创建对象 创建方式:var 对象名 = new Object();
使用格式:对象.属性 = 值
1 2 3 4 5 6 7 8 9 10 11 var obj = new Object (); obj.name = '张三丰' ; obj.age = 18 ; obj.sex = '男' ; obj.sayHi = function ( ) { console .log('hi~' ); } console .log(obj.name);console .log(obj['sex' ]);obj.sayHi();
利用构造函数创建对象 构造函数 :是一种特殊的函数,主要用来初始化对象,即为对象成员变量赋初始值,它总与 new 运算符一起使用。
1 2 3 4 5 6 7 function 构造函数名( ) { this .属性 = 值; this .方法 = function ( ) {} } new 构造函数名();
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 function Star (uname,age,sex ) { this .name = uname; this .age = age; this .sex = sex; this .sing = function (sang ) { console .log(sang); } } var ldh = new Star('刘德华' ,18 ,'男' );console .log(typeof ldh) console .log(ldh.name);console .log(ldh['sex' ]);ldh.sing('冰雨' ); var zxy = new Star('张学友' ,19 ,'男' );
构造函数名字首字母要大写
函数内的属性和方法前面需要添加 this ,表示当前对象的属性和方法。
构造函数中不需要 return 返回结果。
当我们创建对象的时候,必须用 new 来调用构造函数。
遍历对象的属性
for...in
语句用于对数组或者对象的属性进行循环操作
1 2 3 4 5 for (var k in obj) { console .log(k); console .log(obj[k]); }
内置对象
JavaScript 中的对象分为3种:自定义对象 、内置对象、 浏览器对象
JavaScript 提供了多个内置对象:Math、 Date 、Array、String等
Math对象 Math 对象不是构造函数,它具有数学常数和函数的属性和方法。跟数学相关的运算(求绝对值,取整、最大值等)可以使用 Math 中的成员。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Math .PI Math .floor() Math .ceil() Math .round() Math .abs() Math .max()/Math .min() Math .random() console .log(Math .PI); console .log(Math .max(1 ,99 ,3 )); function getRandom (min,max ) { return Math .floor(Math .random() * (max - min + 1 )) + min; } console .log(getRandom(1 ,10 ));
Date()日期对象
Date 对象和 Math 对象不一样,他是一个构造函数,所以我们需要实例化后才能使用
Date 实例用来处理日期和时间
Date()方法的使用 1 2 3 4 5 6 7 8 9 10 var now = new Date (); console .log(now);var data = new Date (2019 ,10 ,1 );console .log(data); var data2 = new Date ('2019-10-1 8:8:8' );console .log(data2);
日期格式化
方法名
说明
getFullYear()
获取当年
getMonth()
获取当月**(0-11)**
getDate()
获取当天日期
getDay()
获取星期几**(周日0到周六6)**
getHours()
获取当前小时
getMinutes()
获取当前小时
getSeconds()
获取当前秒钟
valueOf()
得到现在时间距离1970.1.1总的毫秒数
getTime()
得到现在时间距离1970.1.1总的毫秒数
获取日期总的毫秒形式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 var date = new Date ();console .log(date.valueOf()); console .log(date.getTime());var date1 = +new Date (); console .log(date1);console .log(Date .now());
倒计时效果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 function ( ) countDown (time ) { var nowTime = +new Date (); var inputTime = +new Date (time); var times = (inputTime - nowTime) / 1000 var d = parseInt (times / 60 / 60 / 24 ); d < 10 ? '0' + d : d; var h = parseInt (times / 60 / 60 % 24 ); h < 10 ? '0' + h : h; var m = parseInt (times / 60 % 60 ); m < 10 ? '0' + m : m; var s = parseInt (times % 60 ); s < 10 ? '0' + s : s; return d + '天' + h + '时' + m + '分' + s + '秒' ; }
数组对象 创建方式 1 2 var arr1 = [1 , 2 , 3 ]; var arr2 = new Array (2 , 3 );
检测是否为数组
instanceof 运算符,可以判断一个对象是否属于某种类型
Array.isArray()
用于判断一个对象是否为数组,isArray() 是 HTML5 中提供的方法
1 2 3 4 5 6 var arr = [1 , 23 ];var obj = {};console .log(arr instanceof Array ); console .log(obj instanceof Array ); console .log(Array .isArray(arr)); console .log(Array .isArray(obj));
添加删除数组元素
方法名
说明
返回值
push(参数1…)
末尾添加一个或多个元素,会修改原数组
并返回新的长度
pop()
删除数组最后一个元素
返回它删除的元素的值
unshift(参数1…)
向数组的开头添加一个或更多元素,注意修改原数组
并返回新的长度
shift()
删除数组的第一个元素,数组长度减1,无参数,修改原数组
并返回第一个元素
数组排序
方法名
说明
是否修改原数组
reverse()
颠倒数组中元素的顺序,无参数
该方法会改变原来的数组,返回新数组
sort()
对数组的元素进行排序
该方法会改变原来的数组,返回新数组
1 2 3 4 5 6 7 var arr = [1 ,64 ,9 ,61 ];arr.sort( function (a,b ) { return b - a; return a - b; } )
查找元素索引
方法名
说明
返回值
indexOf()
数组中查找给定元素的第一个索引
如果存在返回索引号,如果不存在,则返回-1
lastIndexOf()
在数组的最后一个索引,从后向前索引
如果存在返回索引号,如果不存在,则返回-1
数组转换为字符串
方法名
说明
返回值
toString()
把数组转换成字符串,逗号分隔每一项
返回一个字符串
join(‘分隔符’)
方法用于把数组中的所有元素转换为一个字符串
返回一个字符串
1 2 3 4 5 6 7 8 var arr = [1 , 2 , 3 ];console .log(arr.toString()); var arr1 = ['green' , 'blue' , 'red' ];console .log(arr1.join()); console .log(arr1.join('-' )); console .log(arr1.join('&' ));
其他方法
方法名
说明
返回值
concat()
连接两个或多个数组 不影响原数组
返回一个新的数组
slice()
数组截取slice(begin,end)
返回被截取项目的新数组
splice()
数组删除splice(第几个开始要删除的个数)
返回被删除项目的新数组,这个会影响原数组
字符串对象 基本包装类型 为了方便操作基本数据类型,JavaScript 还提供了三个特殊的引用类型:String、Number和 Boolean。
1 2 var str = 'andy' ;console .log(str.length);
按道理基本数据类型是没有属性和方法的,而对象才有属性和方法,但上面代码却可以执行,这是因为 js 会把基本数据类型包装为复杂数据类型,其执行过程如下 :
1 2 3 4 5 6 var temp = new String ('andy' );str = temp; temp = null ;
字符串不可变:指的是里面的值不可变,虽然看上去可以改变内容,但其实是地址变了,内存中新开辟了一个内存空间。
返回字符索引 字符串所有的方法,都不会修改字符串本身(字符串是不可变的),操作完成会返回一个新的字符串
方法名
说明
indexOf(‘要查找的字符’,开始的位置)
返回指定内容在元字符串中的位置,如果找不到就返回-1,开始的位置是index索引号
lastIndexOf()
从后往前找,只找第一个匹配的
返回索引字符
charAt(index)
返回指定位置的字符(index字符串的索引号)
str.charAt(0)
charCodeAt(index)
获取指定位置处字符的ASCII码(index索引号)
str.charCodeAt(0)
str[index]
获取指定位置处字符
HTML,IE8+支持和charAt()等效
字符串操作方法
方法名
说明
concat(str1,str2,str3…)
concat() 方法用于连接两个或对各字符串。拼接字符串
substr(start,length)
从 start 位置开始(索引号), length 取的个数。
slice(start,end)
从 start 位置开始,截取到 end 位置 ,end 取不到 (两个都是索引号)
substring(start,end)
从 start 位置开始,截取到 end 位置 ,end 取不到 (基本和 slice 相同,但是不接受负)
其他方法
方法名
说明
replace(‘a’, ‘b’)
用于在字符串中用一些字符替换另一些字符
split()
用于切分字符串,它可以将字符串切分为数组。在切分完毕之后,返回的是一个新数组
toUpperCase()
转换大写
toLowerCase()
转换小写
1 2 3 var str = 'a,b,c,d' ;console .log(str.split(',' ));