JavaScript基础知识(3)

来源:互联网 发布:java工资待遇如何 编辑:程序博客网 时间:2024/06/09 23:43
 练习:
 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("正常");
 }

0 0