练习:
instanceof表示左边的数据是由右边的数据创建出来的
undefined值的类型就是undefined
undefined的值和null的值虽然相等,但是类型不同,null的类型是object。值相等是因为js的自动转换。
NaN和任何数据比较,永远返回false,今后只要有可能判断NaN时就用isNaN。NaN和任何东西计算,永远返回NaN
var str="hello";
str>10?str>10000?值永远返回false。
在关系运算中:字符串比数字,字符串转为数字。字符串如果转不成数字,就会变成NaN,NaN和任何数据比较都会返回false,所以在上述比较中,str不能转为数字,值返回false
注意:在逻辑运算中,不要急于将第一个条件之后的++/--提取出来
使用变量出错的情况只有一个:没声明的变量,只要使用就会出错。
var name="张三";
例1:
console.log(Name); //错误!
该例子中,Name是未声明的,所以会出错
例2:
var name;
console.log(name); //声明但是没有赋值,返回结果是undefined;
ReferenceError找不到对象,未声明错误
新课:
函数:也就是方法。是封装执行一项专门任务的步骤的代码序列。任务调用都是通过任务名调用的。方法的目的是重用。
何时需要定义方法?只要发现一段代码重复使用,就封装为方法。
方法声明语法:
function 方法名(参数列表) {
方法体:步骤清单;
return 返回值;
}
调用:
方法名(参数值列表);
方法声明后不调用的话是不能使用的。
例:
function buy(what/*菜名*/){
console.log("取饭盒");
console.log("走到食堂");
console.log("找窗口打饭");
what="香喷喷的"+what;
console.log("回宿舍");
return what;
}
var jy1=buy("饺子");
console.log(jy1);
var jy2=buy("盖饭");
console.log(jy2);
var jy3=buy("面条");
console.log(jy3);
参数:是方法内独有的变量。作用就是接受传入数据,并在方法内处理。参数的根本目的就是让参数变的灵活。参数的定义都是定义在方法名后面的圆括号()中。
如何声明方法参数?不用var。
参数何时使用?只有方法被调用时才自动创建。
返回值:方法执行完成后,由方法返回的一个数据。有的方法有返回值,有的方法没有返回值。
定义返回值:不用再声明变量,直接用return,后面跟一个值就行了。
return:两层含义
1.本意是退出方法。return后的操作不能执行。
2.退出同时,可返回数据。
可以在任何需要的地方,调用方法执行;带返回值的方法,使用时,等效于直接使用返回值。
例:
function add(a,b){
return a+b;
}
var a=parseInt(prompt("输入第一个加数"));
var b=parseInt(prompt("输入第二个加数"));
console.log(add(a,b)); //add(a,b)的返回值可直接使用
在上例中,后面的东西不能放在return后面,因为这样后面的步骤就无法执行了。
例:
function getmax(a,b,c){
var max=a>b?a:b;
max=max>c?max:c;
return max;
}
var a=parseInt(prompt("输入第一个加数"));
var b=parseInt(prompt("输入第二个加数"));
var c=parseInt(prompt("输入第三个加数"));
console.log("最大值:"+getmax(a,b,c));
为什么要定义返回值?因为调用方法的人需要明确的返回结果。return是给调用者用的。
作用域:指一个变量的可用范围。
var washer="洗衣机";
function fun(){
var yg="我的衣服";
console.log(yg);
console.log(washer);
}
fun();
console.log(yg); //出错!
window对象:是整个网页的全局作用域对象
全局作用域:直接放在全局作用域中的变量,叫全局变量。凡是今后只要希望所有作用域共用的变量都要声明全局作用域。
局部(函数)作用域:声明在方法内部的变量或方法的参数变量都叫局部变量。
值传递:将一个变量的值赋值给另一个变量,其实是将原变量中的值,复制一份给新变量。
js中一切赋值都是值传递。
例:
var sum=0;
function add(){
sum+=3;
console.log(sum);
}
add(); //3
console.log(sum); //3,只要见不到var,sum使用的值都是window里面的,且将window的sum直接操作赋值了
对未声明的变量赋值:js会自动在全局创建该变量(仅限于赋值操作)
例:
function add(){
sum=3; //此处的sum是全局变量,但是不推荐这样使用
}
函数作用域在调用方法时创建,方法执行完立刻销毁!
var sum=0;
function add(sum){
sum+=3;
console.log(sum);
}
add(sum); //3
console.log(sum); //0,这个里面函数本身定义了sum参数,执行结束后就会立刻销毁,不会对外面的sum值产生影响
例:
var card=10;
function buy(what,card){
card-=3;
console.log("余额"+card);
what="香喷喷的"+what;
return what;
}
var jy1=buy("饺子",card);
console.log(jy1);
console.log("余额"+card);
问题:
方法的参数和方法外定义了哪些变量没有任何关系,方法参数是依据方法的处理逻辑至少需要几个数据才可正常执行。
方法参数两个作用:
1.接收外部传入数据,在方法内处理
2.规定调用方法的人必须提供哪些参数
方法定义是独立存在的。
方法返回值:根据方法调用者的需要来定义。如果方法调用者需要明确返回一个结果,就定义返回值。否则,可以不定义返回值。
拥有返回指定的方法,可以当作一个值用!
何时必须用变量接住?方法的返回值,后续程序可能反复使用。
鄙视题:
var num=0;
function f1(num){
num=100;
console.log(num);
}
f1(num); //100
cosole.log(num); //0
自定义函数:
全局函数:ECMAScript定义了标准,由各浏览器厂商已经实现的函数。咱们直接调用。
isNaN(x),parseInt/Float(x)
isFinite():判断指定数字是否有限值
encodeURI:将url中的非法字符转为单字节符号 --编码
decodeURI:将encodeURI转后的字符串,转换回原文 --解码
在url语法中,是不允许出现多字节字符,所以在发送之前都会对整个url中非法字符进行编码,转为utf-8
encodeURI对非法字符编码转为单字节,但是不会修改原字符串。必须用变量接住编码返回值才能保存编码。
例:
var kword="张东";
kword=encodeURI(kword);
var url="http://www.baidu.com/s?wd=";
console.log(kword);
console.log(url+kword);
console.log("欢迎"+decodeURI(kword));
unicode编码:每个字符2字节
utf-8编码:字母、数字是单字节,但是汉字是3字节
url规定,在参数值中,如果再次出现保留字,就是非法。
url保留字:/ ? $ : 等等
encodeURIComponent可以解决上述问题,既能对多字节非法字符编码,又能对单字节非法字符编码。今后在进行编码时优先选用encodeURIComponent,解码就用decodeURIComponent(kword)。
encodeURIComponent何时使用?将数据通过url发送时,都要先编码再发送.
decodeURIComponent:对encodeURIComponent编码的字符串解码。收到编码后的字符串后,都要先解码,在处理。
var kword="http://tmooc.cn";
kword=encodeURIComponent(kword);
var url="http://www.baidu.com/s?wd=";
console.log(kword);
console.log(url+kword);
console.log("欢迎访问"+decodeURIComponent(kword));
eval()可以执行字符串格式代码
eval("alert('hello eval()')");
程序结构:3种:顺序结构、选择结构、循环结构
程序:IPO
需求:找名词-->程序中的数据
两类:输入数据:单价,数量,收款金额
输出数据:应收金额,找零
分析处理流程:
1.请用户输入:单价,数量,收款金额,保存在变量中
2.计算:
应收金额=单价*数量
找零=收款金额-应收金额
3.输出:应收金额和找零
var price=parseFloat(prompt("请输入单价"));
var count=parseFloat(prompt("请输入数量"));
var money=parseFloat(prompt("请输入收款金额"));
var total=price*count;
total=total>=500?total*0.8:total;
var change=money-total;
document.write("应收"+total.toFixed(2));
document.write("找零:"+change.toFixed(2));
document.write在顺序执行代码中是没有问题的,是在网页中直接写html代码,document.write("<h1>应收</h1>"+total.toFixed(2)+"<br/>");
分支结构:程序在运行过程中,可以根据不同的条件,执行不同的任务。
分支结构:
if结构:1件事,要么做,要么不做,就用if结构
if...else...结构:2件事,二选一执行
例:
var price=parseFloat(prompt("请输入单价"));
var count=parseFloat(prompt("请输入数量"));
var money=parseFloat(prompt("请输入收款金额"));
var total=price*count;
if(total>=500){
total*=0.8
}
var change=money-total;
document.write("应收"+total.toFixed(2));
document.write("找零:"+change.toFixed(2));
三目运算只能赋值,做不了语句。
if语句下面如果只有一句话,可以省略大括号,但是不推荐使用,容易出错。
例:
var price=parseFloat(prompt("请输入单价"));
var count=parseFloat(prompt("请输入数量"));
var money=parseFloat(prompt("请输入收款金额"));
var total=price*count;
if(money>=total){
var change=money-total;
document.write("应收"+total.toFixed(2));
document.write("找零:"+change.toFixed(2));
}
else{
var change=total-money;
document.write("总额不足");
document.write("还差:"+change.toFixed(2));
}
凡是满足和不满足都执行的语句,都提到if结构之外。if语句不可能都不执行。
else if结构:多件事,多选一执行
语法:
if(条件1){
满足条件1执行的代码
}else if(条件2){
满足条件2执行的代码
}else if(条件n){
满足条件n执行的代码
}else{
以上条件都不满足时,默认执行的代码
}
else if结构中,如果前一个条件已经满足,则后续else if不再执行!
例:
var score=parseInt(prompt("请输入分数:"));
if(score>100||score<0){
alert("屌丝");
}else if(score>=90){
alert("A");
}else if(score>=80){
alert("B");
}
else if(score>=60){
alert("C");
}
else{
alert("D");
}
注:
if语句用于处理分支逻辑时:
1.if判定中默认必需一个boolean值;
2.若出现的值不是boolean类型,则会自动转换。下面值默认都会自动转换为false:
if(0){}
if(null){}
if(undefined){}
if(NaN){}
if(""){}
if(0.0){}
分支结构中的条件,可以不是逻辑表达式,也可以不是布尔值,如果不是,js会自动转换为boolean类型,即0(整数),null,undefined,NaN,"",0.0(浮点数)都转为false,其余的全都转为true。
克莱托指数:
var weight=parseFloat(prompt("请输入体重(kg)"));
var height=parseFloat(prompt("请输入身高(m)"));
var quetlet=weight/(height*height);
if (quetlet>25){
document.write("偏重");
}else if (quetlet<20){
document.write("偏瘦");
}else{
document.write("正常");
}