JavaSrcipt学习日记(一) 基础篇


自从扎入java之后,js好久没碰了,最近刚好在学node,正好把js温习了一遍,下面是在温习过程中碰到的自认为比较重要的部分,纪录下来,与大家分享,先从基础篇开始吧,以后每个礼拜会更新一章,如有错误,欢迎指正哦~~


1.数据类型

1.1 typeof 操作符
  • undefined——如果这个值未定义
  • boolean ——如果这个值是布尔值
  • string——如果这个值是字符串
  • number——如果这个值是数值
  • object——如果这个值是对象或null
  • function——如果这个值是函数
1.2 Null类型
  • 从逻辑角度看,null值表示一个空对象指针,所以如果用typeof检测的话,会返回”object”.
  • 实际上,undefined派生自null,所以一般alert(null==undefined),结果为true.
1.3 boolean类型
  • Boolean()函数:

    • 例如: var msg=”hello world”;
      var msgAsBoolean=Boolean(msg);
    • 转换规则

      数据类型转换为true的值转换为false的值
      Booleantruefalse
      String任何非空字符串“”(空字符串)
      Number任何非零数字值 (包括无穷大)0和NaN
      Object任何对象null
      Undefinedn/aundefined
1.4 NaN
  • 在ecamscript中,任何数值除以0都会返回 NaN

  • alert(NaN == NaN); //false

  • isNaN() 函数:isNaN()在接收一个值后,会尝试将这个值转换为数值,某些不是数值的值会直接转换为数值,而任何不能被转换为数值的值都会导致这个函数返回 true.

    • 示例:
      • alert(isNaN(NaN)); //true
      • alert(isNaN(10)); //false
      • alert(isNaN(“10”)); //false
      • alert(isNaN(“blue”)); //true(不能转换成数值)
      • alert(isNaN(true)); //false(可以被转换成数值1)
1.5 数值转换
Number()、parseInt()、parseFloat()
第一个函数,即转型函数Number()可以用于任何数据类型
另外两个函数则专门用于把字符转换成数值。
  • Number()函数的转换规则如下:

    • 如果是boolean,true和false将分别被转换成1和0;
    • 如果是数字值,只是简单的传入和返回;
    • 如果是null值,返回0;
    • 如果是undefined,返回NaN;
    • 如果是字符串,遵循以下规则:
      • 如果字符串只包含数字,则转换为十进制
      • 如果字符串包含有效的浮点格式,如”1.1”,则将其转换为对应的浮点数值
      • 如果字符串中包含有效的十六进制格式,如”0xf”,则将其转换成相同大小的十进制整数值
      • 如果字符串是空的,则转换为0
      • 如果字符串中包含上述格式之外的字符,则将其转为NaN.
    • 如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果为nan,则调用对象的toString()方法,然后再依照前面的规则转换返回的字符串值。

    • 示例:

      • var num1=Number(“Hello world”); //NaN
      • var num2=Number(“”); //0
      • var num3=Number(“00000011”); //11
      • var num4=Number(true); //1
  • parseInt():

    • 示例
      • var num1=parseInt(“1234blue”); //1234
      • var num3=parseInt(“”); //NaN
      • var num4=parseInt(“0xA”); //10
      • var num5=parseInt(22.5); //22
    • 制定进制进行转换
      • var num1=parseInt(“10”,2); //2 按二进制
      • var num2=parseInt(“10”,8); //8 按八进制
      • …以此类推
1.6 String 类型
  • var str1=”hello world”;
    var str2=’hello world’;

  • 任何字符串的长度都可以通过length属性获取

  • ecmascript 中的字符串是不可变的。(类似java)。也就是说,字符串一旦创建,它们的值就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量。

    • 示例:
      var lang=”java”;
      lang = lang +”script”;
  • toString() 转换成字符串
    数值、布尔、对象和字符串值都有toString()方法。但null 和undefined值没有这个方法。
    那么问题来了,不知道要转换的值是不是null或undefined的情况下,还可以使用转型函数script(),这个函数能够将任何类型的值转换为字符串。规则如下:

    • 如果值有toString()方法,则调用该方法(没有参数)并返回相应的结果;
    • 如果值是null,则返回”null”;
    • 如果值是undefined,则返回”undefined”.
    • 示例:
      var val1=10;
      var val2=true;
      var val3=null;
      var val4;
      alert(String(val1)); //”10”
      alert(String(val2)); //”true”
      alert(String(val3)); //”null”
      alert(String(val4)); //”undefined”
1.7 Object

ECMAScript中的对象其实就是一组数据和功能的集合。对象可以通过执行new操作符后跟要创建的对象类型的名称来创建。而创建object类型的实例并为其添加属性或方法,这点跟java是类似的~
var o=new Object();
但在ECAMSript中,如果不给构造函数传递参数,那么可以省略后面的括号:
var o=new Object; 也是正确的,不过不推荐哦~~

  • 跟java中的java.lang.Object对象一样,Object类型是所有它的实例的基础。换句话说,object类型所具有的任何属性和方法也同样存在于更具体的对象中。
    • constructor——保存着用语创建当前对象的函数。对于前面的例子而言,构造函数就是Object();
    • hasOwnProperty(propertyName)——用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。其中,作为参数的属性名必须以字符串形式制定
    • propertyIsEnumerable(propertyName)——用于检查给定的属性是否能够使用for-in语句来枚举。与hasOwnProperty()方法一样,作为参数的属性名必须以字符串形式指定。
    • toString()
    • valueOf();

2. 操作符

2.1 逻辑非(!)
  • 如果操作数是一个对象,返回 false
  • 如果操作数是一个空字符串,返回true
  • 如果操作数是一个非空字符串,返回false
  • 如果操作数是数值 0,返回true
  • 如果操作数是任意非0数值(包括Infinity),返回false
  • 如果操作数是null,返回true
  • 如果操作数是NaN,返回true
  • 如果操作数是undefined,返回true
2.2 相等和不相等
表达式表达式
null == undefinedtruetrue == 1true
“NaN” ==NaNfalsetrue==2false
5 == NaNfalseundefined == 0false
NaN == NaNfalsenull ==0false
NaN != NaNtrue“5”==5true
false ==0true
2.3 全等和不全等(推荐)
  • 全等操作符 由3个等号 (===)表示,它只在两个操作符未经转换就相等的情况下返回true,例如:
    var result1=(“55” == 55); //true,因为转换后相等
    var result2=(“55” === 55); //false,因为不同的数据类型不相等

  • 不全等 (!==)例如:
    var result1=(“55” != 55); //false,因为转换后相等
    var result2=(“55” !== 55);//true,因为不同的数据类型不相等

2.4 label语句与 break、continue语句

break和continue语句都可以与label语句联合使用,从而返回代码中特定的位置。这种联合使用的情况多数发生在循环嵌套的情况下:

` var num=0;

outermost:
for(var x=0;x<10;x++){
    for(var y=0;y<10;y++){
        if(x==5 && y==5){
            break outermost;
        }
        num++;
    }
}
alert(num);

`

3 .function 函数

在ECMAScript中的所有参数传递都是值,不可能通过引用传递参数。
  • 理解参数

    形如:function functionName(arg0,arg1,arg2,...,argN){}
    与其他语言不同的是,在ECMAScript中, function并不在乎函数传递进来多少个参数,也不在乎你传进来是什么数据类型。换句话说,即便你定义的函数只接收两个参数,但在调用这个函数的时候,你也未必一定要传两个参数,你可以传一个、两个、三个甚至不传等等,这不会产生什么错误。
    
    这是什么道理呢?原因在于ECAMScript中的参数在内部是一个数组表示的,函数接收到的始终是这个数组,而并不关心数组中包含哪些参数。就像你喜欢一个人,第一印象必然是这个人,而不是他的内在或者其他,只要是个人。。。。所以只要是个函数而已~~那你在与其交往的过程中,你喜欢的对象会将其内在的元素一个个传递给你,从而你知道你接下来要干什么~~
    
    其实,arguments对象只是与数组类似(它并不是Arrays的实例),因为可以使用方括号语法访问它的每一个元素,即第一个元素就是arguments[0],使用length属性来确定传递进来多少个参数。
    *实例:
        function helloworld(str1,str2){
            alert(str1+","+str2);
        }
        也可以写成:
        function helloworld(){
            alert(arguments[0]+","+arguments[1]);
        }
        结果都是一样的,返回 hello,world
    
    * ok,我们继续看两个例子:
            function toAdd() {
                if(arguments.length == 1){
                    alert(arguments[0]+10);
                } else if(arguments.length == 2){
                    alert(arguments[0]+arguments[1]);
                }
            }
            toAdd(10);  //20
            toAdd(10,20); //30
            其实这样也算是小小弥补了ECAMScript木有重载的缺陷啦~~
    
    ok,两一个重要的消息就是arguments可以和命名参数一起使用,给个实例:
        function doAdd(num1,num2) {
            if(arguments.length == 1){
                alert(num1+10);
            }else if(arguments.length == 2){
                alert(arguments[0]+num2);
            }
        }
        注意,这样用的话虽然效果是一样的,但是如果你调用函数的时候只传了一个参数,另一个就会保存为undefined值~~
        ****在ECMAScript中,所有的参数传递都是值传,木有引用传递!!!
  • 没有重载

    ECMAScript中没有真正意义上的函数重载,就像前面函数传参的时候所说,ECMAScript函数没有签名(签名是指函数的参数个数与其参数类型组成的一种声明,通过函数签名的不同来区别函数重载时到底调用哪个方法),因为其参数是由包含零或多个值的数组来表示的,而如果没有函数签名,真正的重载是不可能做到的。
    
    注意:如果在ECMAScript中定义了两个名字相同的函数,则该名字只属于后定义的函数,即后定义的函数返回值会覆盖先前定义的函数返回值。
    我们可以通过检查传入函数中参数的类型和数量来模拟函数的重载~~
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值