JS
1. Javascript 输入输出语句
- alert(msg) 浏览器弹出警示框
- console.log(msg) 浏览器控制台打印输出信息
- prompt(info) 浏览器弹出输入框,用户可以输入
2. 变量 var 存储数据的容器
声明多个变量:var age = 18, name=‘zs’;
- 只声明不赋值:undefined
- 不声明不赋值,直接使用:报错
- 不声明,直接赋值使用:可以使用 但不提倡
3. 数据类型
- 只有在程序运行的过程中,根据等号右边的值来确定的,相同的变量可以作用不同的数据类型
- isNaN() 用来判断 非数字
如果是数字返回false, 如果不是数字返回true - undefined和数字相加,最后结果是NaN
- typeof用来获取变量数据类型
- prompt取来的值是字符型的
4.数据类型转换
- 转换为字符串
- toString()
var num = 10 console.log(num.toString()) - String() 强制转换
console.log(String(num)) - 加号拼接字符
console,log(num + ‘ ’)
- 转换为数字型(重点)
- parseInt(string)函数
转换成整数 - parseFloat(变量)
转换成小数 - Number()
转换成数值 - 利用算数运算 - * / 隐式转换
5. 递增运算
- 前置递增(先加1,后返回值)
- 后置递增(先返回原值,后自加1)
例1:var a = 10; ++a; var b = ++a + 2; console.log(b)
//14
例2:var c = 10; c++; var d = c++ + 2; console.log(d);
//13
例3:var e = 10; var f = e++ + ++e; console.log(f)
//22
6. 逻辑运算符
- && 同真为真
- || 同假为假
- ! 非
7. 短路中断运算
- 逻辑与
表达式1&&表达式2
如果第一个表达式的值为真,则返回表达式2
如果第一个表达式的值为假,则返回表达式1 - 逻辑或
如果表达式1结果为真,则返回表达式1
如果表达式1结果为假,则返回表达式2
8.运算符优先级
逻辑与比逻辑或的优先级高
9.switch分支语句
switch(表达式){
case value1:
执行语句1;
break;
case value2:
执行语句2;
break;
...
default;
}
表达式的值和case里面的值相匹配的时候是全等,必须是值和数据类型一致才可以
10.continue和break
continue 退出本次循环,继续执行剩余次数循环
break 退出整个循环
11. 数组
找数组中最大值
var arr=[2,6,1,77,52,25,7];
var max=arr[0];
for(var i = 1; i < arr.length; i++){
if(arr[i]>max){
max = arr[i];
}
}
12. 函数
- 带参的函数
(1) 形参是接收实参的
function cook(aru){
console.log(aru);
}
cook('我是张三');
(2)我们可以利用函数的参数实现函数重复不同的代码
(3)函数的参数可以有,也可以没有,个数不限
2. 函数形参和实参个数不匹配问题
(1)实参个数等于形参个数 (输出正确结果)
(2)实参个数大于形参个数(只取到形参个数)
(3)实参个数小于形参个数(多个形参定义为undefined,结果为NaN)
在JS中,形参默认为undefined
3. 函数的返回值
(1)函数是做某件事或者实现某种功能
(2)函数的返回格式
function 函数名(){
return 需要返回的结果;
}
函数名();
(3)return只能返回一个值,如果用逗号隔开,则返回的是最后一个值
(4)函数如果有return,则返回return后面的值;如果没有return,则返回undefined
4. arguments的使用
当我们不确定有多少个参数传递的时候,可以用arguments来获取,在js中,arguments实际上它是当前函数的一个内置对象
arguments 对象中存储了传递的所有实参
function fn(){
console.log(arguments);
}
fn();
- 伪数组(并不是真正意义上的数组)
(1)具有数组的length属性
(2)按照索引的方式进行存储
(3)它没有真正数组的一些方法。如pop(),push()等。
13. 作用域
- 变量的作用域
(1)全局变量:在全局作用域下的变量,在全局下都可以使用
var num = 10;//num 就是一个全局变量
console.log(num);
function fn(){
console.log(num);
}
fn();
(2)局部变量:函数内部的变量
function fun(){
var num1 = 10;//num1就是局部变量
}
fun();
console.log(num1);//这里会报错
注意: 函数的形参也可以看作是局部变量
(3)从执行效率来看全局变量和局部变量
- 全局变量:在任何一个地方都可以使用,只有在浏览器关闭时才会被销毁,因此比较占内存。
- 局部变量:只在函数内部使用,当其所在的代码块被执行时,会被初始化;当代码运行结束后,就会被销毁,因此更加节省空间。
- 作用域链(就近原则)
var num = 10;
function fn(){//外部函数
var num = 20;
function fun(){//内部函数
console.log(num);//20
}
fun();
}
fn();
内部函数访问外部函数的变量,采取的是链式查找的方式来决定取哪个值,这种结构我们称之为作用域链。
14.预解析
例1:console.log(num);
//报错
例2:console.log(num); var num = 10;
//undefined 坑1
例3:
fn();
function fn(){
console.log(11);
}//11
例4:
fun();
var fun = function(){
console.log(22);
}//报错 坑2
- 我们把JS引擎运行js分为两步:预解析和代码执行。
预解析: JS引擎会把js里面所有的var,还有function提升到当前作用域的最前面。
代码执行: 按代码书写的顺序从上往下执行。 - 预解析分为变量预解析(变量提升)和函数预解析(函数提升)
(1)变量提升:就是把所有的变量声明提升到当前作用域最前面,不提升赋值操作
例1:console.log(num); var num = 10;
可以推导为:
var num;
comsole.log(num);
num = 10;//num未赋值 即为undefined
例2:fun(); var fun = function() { console.log(22); }
可以推导为:
var fun;
fun();//报错
fun = function(){
console.log(22);
}
(2)函数提升:把所有函数声明提升到当前作用域最前面,不调用函数
例1:
var num = 10;
fun();
function fun(){
console.log(num);
var num = 20;
}
可以推导为:
var num;
function fun(){
var num;
console.log(num);
num = 20;
}
num = 10;
fun();//undefined
例2:
var num = 10;
function fn(){
console.log(num);
var num = 20;
comsole.log(num);
}
fn();
可以推导为:
var num;
function fn(){
var num;
console.log(num);//undefined
num = 20;
console.log(num);//20
}
num = 10;
fn();
例3:
f1();
console.log(c);
console.log(b);
console.log(a);
function f1(){
a = b = c = 9;
console.log(a);
console.log(b);
console.log(c);
}
上面代码中var a = b = c = 9;
相当于var a = 9; b = 9; c = 9;
b和c直接赋值,没有var声明,当全局变量看。
若为集体声明,则应该是这样var a = 9, b = 9, c = 9;
上述代码可以推导为:
function f1(){
var a;
a = 9;
b = 9;
c = 9;
console.log(a);//9
console.log(b);//9
console.log(c);//9
}
f1();
console.log(c);//9
console.log(c);//9
console.log(c);//报错,因为a为局部变量