JS红宝书读书笔记 — 3.基本概念之类型基础&操作符&语句&函数基础

3.基本概念

3.4.数据类型
3.4.1.typeof操作符
  • typeof {未初始化 || 未声明的变量}: undefined
  • typeof {object || null}: object (null被认为是一个空的对象引用)
  • typeof function: function
3.4.2.Undefined
  • var message = undefined; alert(message == undefined): true
  • typeof {未初始化 || 未声明的变量}: undefined
3.4.3.Null
  • 表示一个空对象指针
  • 如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为null,这样只需要检查null值就可以知道相应的变量是否已经保存了一个对象的引用
  • null == undefined: true
3.4.4.Boolean
  • Boolean( )函数

    数据类型truefalse
    Booleantruefalse
    String任何非空字符串空字符串
    Number任何非零数字0 和 NaN
    Object任何对象null
    UndefinedN/Aundefined
3.4.5.Number
  • 进制

    var num1 = 070;    // 八进制的56
    var num2 = 079;		 // 无效的八进制数字 —— 解析为79
    var num3 = 08;		 // 无效的八进制数字 —— 解析为8
    
    var num4 = 0xA;    // 十六进制的10
    var num5 = 0x1f;   // 十六进制的31
    
    • 八进制字面量在严格模式下无效
    • 算术运算中,所以的八进制和十六进制都被转换成十进数值
  • 浮点数值

    var floatNum1 = 1.1;
    var floatNum2 = 1.;
    var floatNum3 = .1;
    
    var floatNum4 = 3.125e7;
    
    • 浮点数值的最高精度是17位小数,算术计算时精度远远不如整数
      • 0.1 + 0.2 = 0.30000000000000004
      • if(0.1 + 0.2 == 0.3) 不要做这样的测试
      • if(0.05 + 0.25 == 0.3) 可以
  • 数值范围

    • Number.MAX_VALUE —— Number.MIN_VALUE, 超出的话会自动转换为 Infinity and -Infinity

    • 判断是否无穷:isFinite()

  • NaN

    • 任何涉及NaN的操作,都会返回NaN

    • NaN与任何值都不相等,包括NaN本身

    • 判断某个值是否 不是数值

      isNaN(NaN);   // true
      isNaN(10);    // false
      isNaN("10");  // false, 可以被转换为数值
      isNaN("blue"); // true, 不能转换成数值
      isNaN(true);  // false, 可以被转换为数值1
      
  • 数值转换

    • 有三个函数可以把非数值转换为数值:Number(), parseInt(), parseFloat()

    • Number( ) 函数的转换规则

      类型转换结果
      Booleantrue : 1 & false : 0
      Number简单的传入和返回
      null0
      undefinedNaN
      String如果字符串中只包含数字:转换为十进制数值(忽略前导0);字符串为空:转换为0;其他字符串:转换为NaN
      Object先调用valueOf ( )方法,依次执行上面;如果结果是NaN,再接着调用toString ( )方法,依次执行上面
      • 一元加操作和Number( )函数相同
    • Number( )函数转换字符串比较复杂,parseInt( )

      • 忽略字符串前面的空格,直到找到第一个非空空字符串

      • 如果第一个非空字符不是数字字符或者正负号,parseInt( )会返回NaN

      • 如果第一个非空字符是数字字符,parseInt( )会继续解析第二个字符,直到解析完所用的后续字符或者遇到了一个非数字字符

      • var num1 = parseInt("  1234blue");   // 1234
        var num2 = parseInt("");             // NaN
        var num3 = parseInt("0xA");					 // 10
        var num4 = parseInt("22.5");   			 // 22
        var num5 = parseInt("070");          // ES3:56, ES5:70, ES5中parseInt不会解析八进制
        var num6 = parseInt("0xf"); 	       // 15
        
      • 消除进制疑惑,可以为parseInt( )方法提供第二个参数,指定进制

        var num1 = parseInt("0xAF", 16);     // 175
        var num2 = parseInt("AF", 16);			 // 175
        var num3 = parseInt("AF");           // NaN
        var num4 = parseInt("070", 8);			 // 56
        
    • parseFloat( )

      • parseFloat与parseInt的第一个区别是字符串中的第一个小数点是有效的

      • 第二个区别是始终会忽略前导0

      • parseFloat只解析十进制

        var num1 = parseFloat("  1234blue"); // 1234
        var num2 = parseFloat("0xA"); 			 // 0
        var num3 = parseFloat("070");        // 70
        var num4 = parseFloat("22.5");       // 22.5
        var num5 = parseFloat("22.34.5");    // 22.34
        var num6 = parseFloat("0908.5");     // 908.5
        var num7 = parseFloat("3.125e7");    // 31250000
        var num8 = parseFloat("3.1415000");  // 3.1415
        var num9 = parseFloat("3.00");       // 3
        
3.4.6.String
  • 字符串字面量

    字面量含义
    \xnn以十六进制代码nn表示的一个字符 eg: \x41表示"A"
    \unnnn以十六进制代码nnnn表示一个Unicode字符 eg: \u03a3表示欧米茄
  • 字符串编译

    • 字符串一旦创建,值是不可以改变的,要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另外一个包含新值的字符串填充这个变量
  • 转换为字符串

    • 几乎每种值都有的方法(null 和 undefined没有):toString( )

      var num = 10;
      var str1 = num.toString();     // "10"
      var str2 = num.toString(2);    // "1010"
      var str3 = num.toString(8); 	 // "12"
      var str4 = num.toString(16); 	 // "a"
      var str5 = num.toString(10); 	 // "10"
      
    • 在不知道要转换的值是不是null或undefined的情况下:String( )

      • 如果值有toString( ),则调用该方法
      • 如果值是null,返回"null"
      • 如果值是undefined,返回"undefined"
3.4.7.Object
3.5.操作符
3.5.1.一元操作符
  • 前置后置递增,前置后置递减

    • 不仅适用于整数,还可以用于其他非null和undefined的值

      类型操作结果
      包含数字的String先将其转换为数值,再加减1
      不包含数字的String将变量值设置为NaN,字符串变量变为数值变量
      boolean先转换为0/1再进行加减1,布尔变量变为数值变量
      Object先调用valueOf ( )方法,依次执行上面;如果结果是NaN,再接着调用toString ( )方法,依次执行上面,对象变量变为数值变量
  • 一元加和减操作符

    • 对于非数值类型来说,相当于Number( )方法,当然如果是一元减还有结果取负
3.5.2.位操作符*
  • 按位非:NOT

    • 本质:操作数的负值 - 1
    var num1 = 25;    
    var num2 = ~num1;   // -26
    
    var num3 = 25;
    var num2 = -num1 - 1;  // 按位非的本质
    
  • 按位与:AND

    var result = 25 & 3;
    
  • 按位或:OR

    var result = 25 | 3;
    
  • 按位异或:XOR

    var result = 25 ^ 3;
    
  • 左移

    var oldValue = 2;           // 10(2)
    var newValue = oldValue << 5;   // 1000000(2)
    
3.5.3.布尔操作符
  • 逻辑非:!

    类型返回值
    !对象false
    !""true
    ! “非空字符串”false
    ! 0true
    ! 任意非零false
    ! nulltrue
    !NaNtrue
    ! undefinedtrue
    • !! 相当于Boolean()方法
  • 逻辑与:&&

    • 逻辑与可以应用于任何类型的操作数,而不仅仅是布尔值,而且在有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值
    类型返回值
    第一个操作数是对象返回第二个操作数
    第二个操作数是对象只有在第一个操作数的求值结果为true的时候,才会返回该对象
    两个操作数都是对象返回第二个操作数
    有一个操作数是NaN返回NaN
    有一个操作数是undefined返回undefined
    • // eg1
      var found = true;
      var result = (found && someUndefinedVariable);  //发生错误
      
      // eg2
      var found = false;
      var result = (found && someUndefinedVariable);  //正常执行,返回false
      
3.5.4.乘性操作符
  • 乘法 *

    类型返回值
    Infinity * 0NaN
    有一个操作数是NaNNaN
    如果操作数不是数值,则使用Number( )方法转换再操作
  • 除法 /

    类型返回值
    有一个操作数是NaNNaN
    Infinity / InfinityNaN
    0 / 0NaN
    非零有限数 / 0Infinity / -Infinity
    如果操作数不是数值,则使用Number( )方法转换再操作
  • 求模 %

    类型返回值
    Infinity % 有限大的数值NaN
    有限大的数值 % 0NaN
    Infinity % InfinityNaN
    有限大的数值 % Infinity有限大的数值
    0 % 任何数值0
    如果操作数不是数值,则使用Number( )方法转换再操作
3.5.5.加性操作
  • 加法 +

    类型返回值
    如果一个操作数是NaNNaN
    Infinity - infinityNaN
    如果只有一个操作数是字符串,则将另一个操作数转换为字符串,然后再将两个字符串拼接起来
    如果两个操作数都是字符串,那么直接拼接起来
    如果一个操作数是对象,数值或布尔值,则调用他们的toString( )方法取得相应的字符串,然后再应用前面关于字符串的原则
    对于undefined和null,分别调用String( )方法获得"undefined"和"null"
    // eg1
    var num1 = 5;
    var num2 = 10;
    var message = "The sum of 5 and 10 is " + num1 + num2;
    alert(message);  // The sum of 5 and 10 is 510
    
    // eg2
    var num1 = 5;
    var num2 = 10;
    var message = "The sum of 5 and 10 is " + (num1 + num2);
    alert(message);  // The sum of 5 and 10 is 15
    
  • 减法 -

    类型返回值
    数字类型规律同加法
    如果有一个操作数是String,boolean,null,undefined,则先调用Number( )将其转换为数值,再根据前面的规则进行计算
    如果有一个操作数是对象,则调用对象的valueOf( )方法以取得表示该对象的数值,如果没有这个方法,则调用其toString( )方法
3.5.6.关系操作符
类型返回值
如果两个数都是数值,则执行数值比较
如果两个操作数都是字符串,则比较两个字符串的字符编码值
如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较
如果一个操作数是布尔,则先将其转换为数值,然后再执行比较
如果一个操作数是对象,则调用这个对象的valueOf( )方法,得到的结果按照前面的规则进行比较;如果没有这个方法,则调用toString( )方法,并根据规则比较
3.5.7.相等操作符
  • ==:先转换再比较

    规则
    如果一个操作数是布尔值,则先将其转换为数值
    如果一个操作数是字符串,另一个操作数是数值,则比较想等性之前先将字符串转为数值
    如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf( )方法,再按照前面的规则比较
    null和undefined是相等的
    NaN不与任何数相等
    如果两个操作数都是对象,则比较他们是不是同一个对象(两个操作数指向的对象值相同)
  • ===:仅比较不转换

    规则
    null 和 undefined 不全等
    如果两个操作数都是对象,则比较他们是不是指向同一块地址
3.5.8.条件操作符

var max = (num1 > num2) ? num1 : num2;

3.5.9.赋值操作符

%=

3.5.10.逗号操作符

var num = (5,1,4,8,0); // num的值为0

3.6.语句
3.6.1.if
3.6.2.do-while
3.6.3.while
3.6.4.for
for(;;){ }  // 相当于while(true)
for(; i<count; ){ }  // 相当于while(i<count)
3.6.5.for-in
  • 枚举对象的属性
  • ES5 中枚举到null 或者 undefined会停止执行循环体
  • 顺序不确定
3.6.6.label
  • 多层循环配合 continue 和 break 使用
3.6.7.beak & continue
3.6.8.with
  • 严格模式不允许使用
  • 开发时不建议使用,性能低
var qs = location.search.substring(1);
var hostName = location.hostname;
var url.= location.href;

with(location){
	var qs = location.search.substring(1);
	var hostName = location.hostname;
	var url.= location.href; 
}
3.6.9.switch
3.7.函数
3.7.1.参数
  • 命名的参数只提供便利,但不是必需的(通过arguments数组获得参数)
  • 非严格模式下arguments数组与命名参数双向绑定(但不共享同一块内存空间)
  • 严格模式下arguments重写无效
  • 如果只传递一个参数,那么arguments[1]为undefined
3.7.2.没有重载
  • 两个相同名字的函数,该名字只属于后定义的函数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值