目录
一、js简介
1.js的组成
定义:js由 ECMAScript(JavaScript语法)、Dom(页面文档对象模型)、Bom(浏览器对象模型)三部分组成。
Dom:是一种标准的编程接口,通过Dom提供的接口可以对页面上的各种元素进行操作(大小、位置、颜色等)。
Bom:可以与浏览器窗口进行互动的对象结构,eg:弹出框、控制浏览器跳转、获取分辨率等。
Dom与Bom又属于Web APIs
2.js的书写位置
- 行内式js 直接写到元素的内部 (js 中推荐单引号)
<input type="button" value="点我" onclick="alert('你好')" />
- 内嵌式js
<script>
alert('刘亦菲yyds');
</script>
- 外部js (需要引入)
<script src="my.js"></script>
3.js 的输出语句
- alert ( )弹出警示框
- console.log ( ) 控制台打印输入信息
- prompt ( ) 弹出输入框,用户可以输入信息
- prompt ( )取过来的值 是字符型的
二、变量
1.变量是什么?变量的本质是什么?
- 白话讲,变量就是一个容器,用来存放数据的,方便我们以后使用里边的数据
- 变量的本质就是内存里的一块空间,用来存储数据的
2.变量命名规范
- 由字母、数字、下划线、$符号组成
- 严格区分大小写
- 不能以数字开头
- 不能是关键字、保留字
- 变量名最好有意义 eg:age、sex
- 遵守驼峰命名法(首字母小写,后面字母需要大写) eg:myFirstName
- 推荐的翻译网站:爱词霸、有道
3.变量的数据类型
- Number(整型、浮点型)
- Boolean(true、false 等价于1 和 0)
- String(字符串型 带引号)
- Undefined(声明未赋值 会出现Undefined)
- Null (声明变量为空值)
- js中变量的数据类型 是根据 = 右边变量值的数据类型来判断的
- 记住一句话 在js里 等号就是 把右边给左边!!!
数字型进制:常见二进制、八进制、十进制、十六进制
八进制(0~7):以0开头 逢八进一
eg:010(八进制转为十进制)
计算方法:0*8^2+1*8^1+0*8^0 = 0+8+0=8
十六进制(0~9 和 A~F):以0x开头
数字型三个特殊值:
Infinity 无穷大
-Infinity 无穷小
NaN 代表一个非数值
- isNaN( ) 用来判断一个变量是否为非数字的类型,返回true或false (非数字true 否则false)
字符串型String
转义符要包含在 引号 里边
转义符 | 解释说明 |
\n | 换行符,n是newline的意思 |
\ \ | 斜杠 \ |
\' | ' 单引号 |
\" | " 双引号 |
\t | tab 缩进 |
\b | 空格,b是blank的意思 |
- 获取字符串长度
var str = 'my name is andy';
console.log(str.length); //长度为 15
- 字符串的拼接(只要有字符串和 其他类型拼接 最终的结果都是字符串型)
- + 总结口诀: 数值相加 字符相连
- 记住:引引加加 (变量和字符串 相连接的口诀)删掉数字
console.log('白雪' + 18); // '白雪18'
console.log('12' + 12); // '1212'
console.log(12 + 12); // 24
console.log('我今年' + age + '岁了'); //引引加加 ' '+age+' '
布尔型Boolean
- true 和 false 两个值
- true值为1 false值为0
4.数据类型转换
- 转换为字符串型
方式 | 说明 | 案例 |
toString( ) | 转化成字符串 | var num = 1; alert( num.toString() ); |
String( ) | 转化成字符串 | var num = 1; alert( String(num) ); |
+号 拼接字符串 (隐式转换) | 和字符串拼接的结果都是字符串 | var num = 1; alert( num + ' 苹果'); |
- 转换为数字型(重点)
方式 | 说明 | 案例 |
parseInt( ) | 转换成整数数值型 | parseInt('100') |
parseFloat() | 转换成浮点数值型 | parseFloat('12.31') |
Number() | 转换为数值型 | Number('12') |
js隐式转换(- * /) | 利用算数运算隐式转换为数值型 | '12' - 0 |
转换为布尔型Boolean
- 代表空、否定的会被转换为false 例如:0、NaN、null、undefined
- 其余值都会被转换为true
方式 | 说明 | 案例 |
Boolean()函数 | 其他类型转换成布尔值 | Boolean('白雪') |
三、运算符
1.递增++ 和 递减-- 运算符
- 注意:递增和递减运算符 必须 和变量 配合使用
- 单独使用时 运行结果相同
- ++a 前置递增 先自加 后返回值(先己后人)
- a++ 后置递增 先返回原值 后自加1 (先表达式返回原值参与运算 之后变量本身再自加1)
2.比较运算符
- 我们程序里边的 等于符号 是 == 默认转换数据类型 会把字符串型的数据转换为数字型 只要求值相等就可以
console.log('18' == 18 ); //true
符号 | 作用 | 用法 |
= | 赋值 | 把右边给左边 |
== | 判断 | 判断两边值是否相等(注意此时有隐式转换) |
=== | 全等 | 值和数据类型 完全相等 |
3.逻辑运算符(返回值是true 或 false)
- 逻辑与&& 两侧都为true 结果才是true
- 逻辑或|| 两侧都为false 结果才是false
- 逻辑非 !true = false ; !false = true
逻辑运算符 | 说明 | 案例 |
&& | "逻辑与" 简称"与" and | true && false |
|| | "逻辑或" 简称"或" or | true || false |
! | "逻辑非" 简称"非" not | !true |
4.逻辑中断(短路运算)
原理:当有多个表达式(值)时,左边的表达式可以确定结果时,就不再继续运算右边的表达式值
逻辑与(表达式1 && 表达式2)
- 表达式1 为真,返回表达式2
- 表达式1 为假,返回表达式1
逻辑或(表达式1 || 表达式2)
- 表达式1 为真,返回表达式1
- 表达式1 为假,返回表达式2
注意:除了空、否定的为假 例如:0、NaN、null、undefined ,其余值都为真
5.赋值运算符
赋值运算符 | 说明 | 案例 |
= | 直接赋值 | var age = '18' |
+= 、-= | 加、减一个数 后再赋值 | age+=5; 相等于 age = age + 5 |
*=、/=、%= | 乘、除、取模 后再赋值 | age*=5; 相等于 age = age * 5 |
6.运算符优先级
- 一元运算符里边的 逻辑非优先级很高
- 逻辑与 > 逻辑或 (优先级)
- 判断是否能被整除 :取余为0
优先级 | 运算符 | 顺序 |
1 | 小括号 | () |
2 | 一元运算符 | ++ -- ! |
3 | 算术运算符 | 先* / % 后+ - |
4 | 关系运算符 | > >= < <= |
5 | 相等运算符 | == ! = === ! == |
6 | 逻辑运算符 | 先&& 后|| |
7 | 赋值运算符 | = |
8 | 逗号运算符 | , |
四、循环语句
1.分支流程控制语句
(1)if语句(多选一)
// 执行思路:如果if里边条件表达式结果为真 则执行大括号里边的 执行语句
// 如果if表达式 为假 则不执行大括号里边的语句 执行if语句后边的代码
if (条件表达式) {
执行语句
}
(2) if else if语句(多选一的过程)
<script>
if (条件表达式1) {
//语句1;
} else if (条件表达式2) {
//语句2;
} else if (条件表达式3) {
//语句3;
} else {
//最后的语句;
}
</script>
(3)switch分支语句(多选一)
switch注意事项:
- 我们开发里边 表达式经常写成变量
- 表达式的值 和value的值 相匹配的时候 必须是全等 (值和数据类型完全一致)
<script>
// 1.语法结构:(switch转换、开关 case小例子、选项)
// 2.执行思路:利用我们的表达式的值 和 case 后面的value值相匹配
// 如果匹配上 就执行该case里边的语句
// 如果都没有匹配上 则执行default里边的语句
switch (表达式) {
case value1: //注意:case 值后边 这里是冒号:
执行语句1;
break;
case value2:
执行语句2;
break;
case value3:
执行语句3;
break;
...
default:
执行最后的语句;
}
</script>
switch...case语句和if...else...语句区别:
- 一般情况下 它俩可以互相替换
- switch语句通常处理case为比较确定值的情况 if else if更加灵活 常用于判断范围(> = 某范围)
- switch语句进行判断后 直接执行到语句 效率更高 而 if else if 语句有几种条件 就得判断多少次
- 当分支比较少时,if else if 执行效率比switch高
- 当分支比较多时,switch语句执行效率比较高 而且结果更清晰
2. 三元表达式
-
语法 条件表达式 ? 表达式1 : 表达式2
-
如果条件表达式 值为真 则返回 表达式1 的值
-
如果条件表达式 值为假 则返回 表达式2 的值
3.for循环
- 重复执行某些代码 通常跟计数有关
- for循环是 循环条件 和 数字 直接相关的循环
// 1.初始化变量:就是用var 声明的一个普通变量 通常用于 作为计数器使用
// 2.条件表达式:用来决定 每一次循环是否执行 就是终止的条件
// 3.操作表达式:每次循环最后执行的代码 经常用于我们计数器变量进行更新(递增或递减)
//语法:
for (初始化变量; 条件表达式; 操作表达式) {
循环体
}
//打印100句 你好
for (var i = 1; i <= 100; i++) {
console.log('你好');
}
4.断点调试
- F12 sources 找到需要调试的文件 在某一行设置断点
- 自己在程序某一行打个断点,这样程序运行到这一行就会停住
- 可以一步步调试 ,观察程序的执行过程
- 记得刷新网页
- Watch监视:可以选择监视变量值的变化 (非常常用)
- F11:程序单步执行,让程序一行一行的执行,观察watch中变量值的变化
小Tips:让打印结果 完全显示出来
var str = ''; //追加字符串
var num = 1;
while (num <= 100) {
str = str + '第' + num + '句你好' + '\n' //就能显示出来啦!
num++;
}
console.log(str);
// 2.这样写的话,显示不出来全部(只会有个"100"的提示)
var num = 1;
while (num <= 100) {
console.log('你好呀!');
num++;
}
5.双重 for循环
定义:在 for循环 里边再嵌套一个 for循环
实现:可以打印 五行五列的星星、一个倒直角三角形等
注意点:
- 外层循环1次,内层循环执行全部
- 外层循环控制 行数,内层循环控制 列数(每行的个数)
6.while循环
// 1.语法结构:while 当 ... 的时候
while (条件表达式) {
循环体
}
// 2.执行思路:当条件表达式结果为 true 则执行循环体 否则 退出循环,执行后边的代码
var num = 1; // 计数器 初始化变量
while (num <= 100) {
console.log('你好呀!');
num++; // 完成计数器的更新 防止死循环
}
7.do while循环
// 1.do while 语法:
do {
循环体
} while (条件表达式)
// 2.执行思路:先执行一次循环体 再判断条件 如果条件表达式为真,则继续执行循环体,否则退出循环
// 3.打印100句 我喜欢你
var i = 1;
do {
console.log('我喜欢你');
i++;
} while (i <= 100)
while 和 do while 的区别
- while先判断 再执行循环体
- do while 先执行循环体 再判断(循环体至少执行一次)
8.continue 和 break
- continue 关键字:退出本次循环,继续执行剩余次数的循环
- break 关键字:退出整个循环
五、数组
1.数组(Array)
定义:就是一组数据的集合,存储在单个变量下(数组里边的数据 成为数据元素)
(1)创建数组
- 利用new 创建数组
var arr = new Array(); //创建了一个 空数组
- 利用数组字面量创建数组
var arr1 = []; //创建了一个 空数组
注意点:
- 获取数组元素 数组名[索引号] 索引号从0开始
- 数组里边可以存放 任意类型的数据(字符串、数字、布尔值等)
(2)遍历数组
定义:就是把数组的元素从头到尾访问一次
注意点:
- 遍历是通过 for循环 进行的 (想把数组里边的值取出来 就通过遍历 for循环)
- 索引号 i 从0开始 ; i 的范围 不带等号
- arr [ i ]是 数组元素第 i 个 ; i 是计数器(当索引号使用)
var arr = ['red', 'green', 'blue'];
for (i = 0; i < 3; i++) {
console.log(arr[i]); // 'red', 'green', 'blue' 必须是arr[i]
}
// 注意点:★
// 1.i 从0开始 所以 i < 3 (不能含等号)
// 2.只能输出打印arr[i] 而不能是i
// 3.arr[i]是 数组元素第i个 i是计数器(当索引号使用)
(3)数组长度:数组名.length
- 数组长度是元素个数 不要跟索引号i混淆
- arr.length 动态监测数组元素的个数(方便添加数组元素 )
var arr = ['red', 'green', 'blue'];
for (i = 0; i < arr.length; i++) {
console.log(arr[i]);
}
(4)新增数组元素
-
修改 arr.length 的长度
-
修改索引号 追加数组元素(也可以替换 数组元素)
2.冒泡排序 ★
定义:一次比较两个元素,如果它们的顺序错误就把它们交换过来(从大到小or从小到大的顺序)
var arr = [4, 1, 2, 3, 5]; //从大到小排序
for (var i = 0; i <= arr.length - 1; i++) { //外层循环 管轮数
for (var j = 0; j <= arr.length - i - 1; j++) { //内层循环 管每一轮的交换次数
// 内部交换2个变量 前一个和后一个数组元素相比较
if (arr[j] < arr[j + 1]) {
var temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
console.log(arr);
// 由于每一轮循环都会确定一个当前轮数下的最大元素,因此在下一轮循环中可以减少遍历的元素个数
// arr.length - i - 1 表示未排序部分的长度
// -i目的:忽略已经排好的末尾部分,减少内层循环的遍历次数 (i是轮数 )
六、函数
1.函数
定义:函数就是封装了一段可以被重复调用执行的代码块 目的:实现大量代码的重复使用
命名:函数命名一般用 动词 get Sum 等,变量命名一般用 名词 sum等
算法:观察变化 找出规律 转换为代码
函数的封装:把一个或者多个功能通过函数的方式封装起来,对外只提供一个简单的函数接口
简单理解:封装 就是将电脑配件整合组装到机箱中 (类似快递打包)
函数的使用:
- 声明函数 和 调用函数
- 声明函数 有两种方式 1.利用函数关键字 自命名函数 2. 使用函数表达式 声明函数 (匿名函数)
- 函数不调用 自己不执行
// 函数的使用:声明函数 和 调用函数
// 1.声明函数 两种方式:(1)利用函数关键字自命名函数 (2) 使用函数表达式声明函数 (匿名函数)
function 函数名(){
函数体
}
function sayHi() {
console.log('hi~~');
}
// 2.调用函数 函数名();
sayHi();
// (2) 函数表达式(匿名函数)★
// var 变量名 = function(){
// 函数体
// }
var fun = function (aru) {
console.log('我是函数表达式');
console.log(aru);
}
fun('我传递参数给aru');
2.形参 和 实参
- 形参:声明函数时 小括号里边的为形参(形式上的参数)
- 实参:函数调用时,小括号里边的是实参(实际的参数)
注意点:
- 形参是用来接收实参的
- 形参可以看做是不用声明的变量
-
尽量让实参和形参 个数相匹配
-
函数可以带参数 也可以不带参数 (带参数的话,参数个数不限)
-
在js中,形参默认值是:undefined
参数作用:函数内部某些值不固定,我们可以通过参数在调用函数时传递不同的值进去
// function 函数名(形参1,形参2...){
// }
// 函数名(实参1,实参2...)
// 形参和实参 的执行过程 arguments 参数
function cook(aru) { // 类似于赋值操作 aru = '辣子鸡'
console.log(aru);
}
cook('红烧排骨');
cook('辣子鸡');
3.函数返回值 return
- 函数只是实现某种功能,最终的结果是需要返回给函数的调用者--函数名() ,这就需要通过return实现
- 只要函数遇到return,就把return后边的结果 返回给了函数的调用者 相当于进行了一次赋值操作,函数名( ) = return后面结果
- return 只能返回一个值 如果用逗号隔开多个值 以最后一个为准
// 代码比较:
// 1. 把实参传给 形参 然后打印出来
function cook1(aru) {
console.log(aru);
}
cook1('卤猪蹄')
// 2. 把实参传给 形参 再把return后面的值 返回给调用者cook(); 然后打印出来
function cook(aru) {
return aru;
}
console.log(cook('大肘子'));
4.区别:continue、break、return
- continue:退出本次循环,继续执行剩余次数的循环
- break:退出整个循环
- return:退出循环,返回return语句中的值,结束当前的函数体里边的代码
5.arguments的使用:
- 当我们不确定有多少个参数的时候,可以用arguments来获取
-
每个函数都内置的有arguments对象
-
arguments中 存储了传递的所有实参
-
arguments的展示形式 是一个 伪数组,因此可以进行遍历
伪数组特点:
- 具有数组的 length 属性
- 按照 索引 的方式进行存储
- 它没有真正数组的一些方法 pop() 、push() 等方法
6.作用域
作用域:就是代码名字(变量) 在某个范围内 起作用和效果 目的:提高程序可靠性 减少命名冲突
- 全局作用域:整个script标签 或者是 一个单独的js文件 内起作用
- 局部作用域:又叫做函数作用域,在函数内部的就是局部作用域 这个代码的名字只在函数内部起效果和作用
变量的作用域
全局变量:在全局作用域下的变量 全局下都可以使用
-
如果在函数内部 没有声明直接赋值的变量也属于 全局变量 ★
局部变量:在局部作用域下的变量 或者 在函数内部的变量就是 局部变量
-
函数的形参也可以看做是局部变量
7.关于块级作用域 {}
现阶段我们的js中 没有块级作用域
- js没有块级作用域 我们在花括号写的变量 也可以被外部调用 ★
- 不要和局部作用域(函数作用域) 弄混淆了
// 块级作用域 {}
// 在java中
// if (xx) {
// int num = 10;
// }
// 外面 是不能调用num的
//注意:
// js没有块级作用域 我们在花括号写的变量 也可以被外部调用 ★
// 不要和局部作用域 弄混淆了 ★
if (3 < 5) {
var num = 10;
}
console.log(num); // 10
8.作用域链
作用域链:内部函数访问外部函数的变量 采取的 链式查找的方式 目的:用于决定取哪个值
- 采用 就近原则 ★
- 站在目标出发,一层一层向外查找
七、对象
1.对象
定义:在js中,对象是一组无序的相关属性和方法的集合,所有的事物都是对象,例如字符串、数值、数组、函数等
通俗理解: 对象是一个具体的事物,看的见摸得着的实体
组成:对象是由 属性 和 方法 组成的
- 属性:事物的特征,在对象中用属性来表示(常用名词)
- 方法:事物的行为,在对象中用方法来表示是(常用动词)
- 方法冒号后面跟的是一个匿名函数
- 方法的另一种解释:写在对象里面的函数 就叫做 方法
2.对象的创建方式
(1) 利用对象字面量 创建对象 { }
- 采取 键值对 的形式 匹配属性 属性名(键) :属性值(值)
- 多个属性或者方法中间用 逗号 隔开
- 方法冒号后面跟的是一个匿名函数 ★
- 调用的时候:对象名.属性名 对象名.方法名()
// var obj = {}; // 创建了一个空的对象
var obj = {
uname: '白小雪',
age: 18,
sex: '男',
sayHi: function () {
console.log('hi~');
}
}
console.log(obj.uname); // 对象名.属性名
console.log(obj['age']); // 对象名['属性名']
obj.sayHi(); // 对象名.方法名()
(2)利用 new Object 创建对象
- 采用 等号赋值 的方法 添加对象的属性和方法
- 多个属性和方法之间用 分号 结束
var obj = new Object(); // 创建了一个空对象
obj.uname = '上官雪儿';
obj.age = 21;
obj.sex = '女';
obj.sayHi = function () {
console.log('hi~');
}
console.log(obj.uname);
console.log(obj['sex']);
obj.sayHi();
(3)利用构造函数 创建对象 ★
- 构造函数名字 首字母要大写
- 构造函数 不需要 return 就可以返回结果
- 多个属性和方法之间用 分号 结束
- 调用构造函数 必须用 new ★
- 我们只要new Star()一下 调用函数就创建一个对象 ldh{}
- 属性 和 方法 前面必须添加 this ★ (this 当前这个)
// 构造函数 语法格式:
function 构造函数名(){
this.属性 = 值;
this.方法 = function(){
}
}
new 构造函数名(); // 调用构造函数 必须用 new ★
// 举例
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); // object
console.log(ldh.name);
console.log(ldh['sex']);
ldh.sing('冰雨'); // // 调用对象的方法 对象名.方法名()★
var zxy = new Star('张学友', 21, '男');
console.log(zxy.name);
console.log(zxy.age);
3.构造函数
定义:抽取对象 相同的 属性和方法 封装到函数里面 (泛指某一大类) eg:Star
- 构造函数 里边封装的是 对象
- 利用构造函数 可以生成很多对象
- 创建对象:通过new关键字创建对象, 这个过程又叫做对象实例化 (特指某一个) eg:某个明星
4.new 关键字执行过程
- new 构造函数 可以在内存中创建一个 空对象
- this 会指向刚刚创建的对象
- 执行构造函数里面的代码 给这个空对象添加属性和方法 ★
- 返回这个对象
5.遍历对象 for in
- 遍历对象:利用 for in 遍历对象 (for in 里边的变量 我们习惯写成 k 或者 key)
- 作用:for in 语句 用于对数组或者对象的属性进行循环操作
// 语法:
for(变量 in 对象){
}
// 举例
var obj = {
name: 'pink老师',
age: 18,
sex: '男'
}
for (var k in obj) {
console.log(k); // k 变量 输出 得到的是 属性名
console.log(obj[k]); // obj[k] 得到的是 属性值
}
6. 内置对象
定义:js自带的一些对象,供开发者使用,提供了一些常用的功能(属性和方法)
优点:帮助我们快速开发
js常用内置对象:Math、Date、Array、String等
八、学会查阅文档
MDN:https://developer.mozilla.org/zh-CN/
W3C:w3school 在线教程
1. 日期格式化
方法名 | 说明 |
getFullYear() | 获取当年 |
getMonth() | 获取当月(0~11) 返回月份小一个月 记得月份 +1 操作! |
getDate() | 获取当天日期 |
getDay() | 获取星期几(周日0) |
getHours() | 获取当前小时 |
getMinutes() | 获取当前分钟 |
getSeconds() | 获取当前秒 |
var time = new Date()
console.log(time.getFullYear());
console.log(time.getMonth() + 1);
console.log(time.getDate());
console.log(time.getDay());
console.log(time.getHours());
console.log(time.getMinutes());
console.log(time.getSeconds());
2. 添加 / 删除数组元素
方法名 | 说明 | 返回值 |
push(参数1,参数2...) | 末尾添加一个或多个元素 | 并返回新的长度 |
pop() | 删除数组最后一个元素 | 返回它删除的元素值 |
unshift(参数1,参数2...) | 开头添加一个或多个元素 | 并返回新的长度 |
shift() | 删除数组第一个元素 | 并返回他删除的元素值 |
3. 检测是否为数组
方法名 | 说明 |
instanceof | arr instanceof Array 检测是否为数组 |
Array.isArray(参数) | Array.isArray(arr) H5新增的 支持ie9以上版本 |
4. 数组排序
方法名 | 说明 |
reverse() | 翻转数组中元素的顺序 |
sort | 对数组元素进行排序(参考冒泡排序效果) |
// 数组排序 (冒泡排序) 记住这种方法!
var arr = [3, 2, 57, 68, 25, 99];
arr.sort(function (a, b) {
// return a - b; // 升序排序
return b - a; // 降序排序
});
console.log(arr);
5. 根据数组元素 返回索引号
方法名 | 说明 | 返回值 |
indexOf() | 从前往后找 只找第一个匹配的 | 如果存在则返回索引号,不存在 返回 -1 |
indexOf('要查找的数组元素',开始的位置) | 从开始位置查找 只找第一个匹配的 | 返回从指定位置开始查找 符合要求的数组元素 索引号,不存在 返回 -1 |
lastIndexOf() | 从后往前找 只找第一个匹配的 | 如果存在则返回索引号,不存在 返回 -1 |
6. 拼接/ 截取 / 删除 数组
方法名 | 说明 |
concat(arr1,arr2,arr3...) | concat()方法用于 连接两个或多个数组 |
slice(start,end) | 从start位置开始,截取到end位置 end取不到 ; slice 不会改变原始数组,要把截取后的数组 赋给一个新数组 ★ |
splice(start,length) | 数组删除 splice(第几个开始,要删除个数) |
7. 数组转换为字符串
方法名 | 说明 | 返回值 |
toString() | 把数组转换为字符串 | 返回一个字符串 |
join('分隔符') | 把数组中的所有元素转换为一个字符串 | 返回一个字符串 |
8. 根据位置返回字符 (重点)
方法名 | 说明 | 使用 |
charAt(index) | 获取指定位置处字符 (index:字符串的索引号) | str.charAt( ) |
charCodeAt(index) | 获取指定位置处字符的ASCII码 | str.charCodeAt(0) |
str[index] | 获取指定位置处字符 (str是变量名) | HTML5,IE8+ 支持 |
ASCII码值:
- A 65
- a 97
9. 根据字符返回位置
方法名 | 说明 | 返回值 |
indexOf('要查找的字符',开始的位置) | 从开始位置查找 只找第一个匹配的 | 返回从指定位置开始查找 符合要求的字符串索引号,不存在 返回 -1 |
10. 拼接 / 截取 / 替换 字符串(重点)
方法名 | 说明 |
concat(str1,str2,str3...) | concat()方法 用于连接两个或多个字符串 拼接字符串,等效于+ 号 +号更常用 |
substr(start,length) | 从start位置开始(索引号) length截取的个数; 括号内只写一个 默认为:从开始位置 截取到最后 |
substring(start,end) | 从start位置开始,截取到end位置 end取不到 (不接受负值) |
slice(start,end) | 从start位置开始,截取到end位置 end取不到 |
replace('字符','替换字符') | 替换为空字符串 相当于删除 |
11. 转换大小写
方法名 | 说明 |
toUpperCase() | 转换大写 |
toLowerCase() | 转换小写 |
12.取绝对值
方法名 | 说明 |
Math.abs( ) | 取绝对值 |
九、其他
1.基本包装类型
定义:把简单数据类型 包装成为 复杂数据类型 这样简单数据类型就有了属性和方法
2.字符串的不可变性
定义:指原来的值还在 改变的只是它的地址 内存中开辟了一个新的内存空间用于存储它
字符串所有的方法,都不会修改字符串本身(字符串是不可变的)操作完成会返回一个新的字符串
3.数据类型(简单、复杂)
(1) 简单数据类型
定义:在存储时,变量中存储的是值本身,因此又叫做值类型 或者 基本数据类型
-
存放在栈里面 里面直接开辟一个空间存放的是值
-
简单数据类型 null 返回的是一个空的对象 object(如果有个变量 我们以后打算存储为对象 暂时没想好放什么 这个时候就给 null)
-
举例:string number boolean undefined null
(2) 复杂数据类型
定义:在存储时,变量中存储的仅仅是地址(引用),因此又叫做引用数据类型
-
首先在栈里面存放地址 十六进制表示 然后这个地址指向堆里面的数据
-
Object Array Date等 (通过new关键字创建的对象 包括系统对象 自定义对象)
4.关于栈和堆
栈(操作系统):由操作系统自动分配释放存放函数的参数值、局部变量的值等 (存放简单数据类型)
堆(操作系统):一般由程序员分配释放 若程序员不释放 由垃圾回收机回收 (存储复杂数据类型-对象)
注意:js中没有堆栈的概念 我们采取通过堆栈的方式 让大家更容易理解代码的执行
5.数据类型传参
(1)简单数据类型传参
函数的形参也可以看作是一个变量,当我们把一个值类型变量作为参数传给函数的形参时,其实是把变量在栈空间里的值复制了一份给形参,那么在方法内部对形参做任何修改,都不会影响到外部变量
(2)复杂数据类型传参
函数的形参也可以看作是一个变量,当我们把引用类型变量传给形参时,其实是把变量在栈空间里保存的堆地址复制给了形参,形参和实参其实保存的是同一个堆地址,所以操作的是同一个对象