<JS>学习笔记(基础:数据类型)

作者: 泡沫的快乐 | 来源:发表于2017-06-08 20:51 被阅读43次

    新人学习JS的日记。

    欢迎各位朋友纠错!

    以下内容都在谷歌浏览器进行测试可用

    声明变量
    现在有3种方式
    var name = 1;   
    //var声明    window.name也可以访问 而且会有变量提升问题
    let name2 = 2;  
    //let声明    没有变量提升问题,并且不能重新声明
    const name3 = 3;
    //const声明  必须赋初值,常量的值不能通过重新赋值来改变,并且不能重新声明
    //引用类型是其引用不可改变
    
    数据类型
    目前有7种内置类型
    >>基本类型
    - 未定义(undefined)
    - 空置(null)
    - 布尔值(boolean)
    - 数字(number)
    - 字符串(string)
    - 符号(symbol) ES6新加 
    
    >>引用类型
    - 对象(object)
    
    typeof的2个问题 
    typeof null    //'object'   应该为'null'
    typoof function a() {} // 'function'  但是函数其实也是对象
    
    Undefined
    (1) 声明变量未初始化值就是undefined
    var a ; //undefined
    let b ; //undefined
    
    (2) 函数情况
    function a() {} //没有写return 默认返回undefined
    a() //undefined
    function b() { return } //写了return 但是后面没有跟值返回undefined
    b() //undefined
    
    (3) void运算符   感觉用处不大
    console.log(1)//1
    console.log(void 1)//undefined
    
    (4) 为全局对象的属性
    window.undefined  
    
    (5) 类型转换
    Number(undefined)  // NaN
    Boolean(undefined) // false
    String(undefined)  // 'undefined'
    
    Null
    (1) 一般表示将来用于保存对象
    这样可以直接检查null值,就知道是否有保存一个对象的引用
    
    (2) null == undefined  // true
    这是因为 == 操作符在比较时 进行了类型转换
    建议使用 === 不会有这样的问题
    
    (3) 类型转换
    Number(null)  // 0
    Boolean(null) // false
    String(null)  // 'null'
    
    Boolean
    (1) 只有2个值 true 和 false
    和数字值0 1没有关系(0,1可以进行类型转换为Boolen类型),而且区分大小写
    
    (2) 其他类型的转换规则
    true                       false
    任何非空字符串               ''或者""(空字符串)
    非零的数字                   NaN 和 0
    任何对象                     null
                               undefined
    
    Number
    (1)语法
    let a = 42;  
        a = 42.2;
        a = 0.42;
        a = .42;
        a = 42.0;  // 0会被省略
        a = 42.;
    //无效的语法
    42.toFixed(3) // 报错   因为点会优先解析为小数点,而不是属性访问
    //有效
    (42).toFixed(3); // '42.000'
    0.42.toFixed(3); // '0.420'
    42..toFixedI(3); // '42.000'
    
    (2) 进制
    在进行算术运算的时候,所有进制转换为十进制数值
    八进制 
       let n = 070 // 八进制下的  十进制56
       n = 08 // 无效八进制 解析为8
       n = 0o70 // ES6 八进制下的  十进制56
       n = 0O70 // ES6 八进制下的  十进制56
       n = 0o8 //  ES6 无效  会报错  
    十六进制 
       n = 0xA // 十六进制下的  十进制10
       n = 0xa // 十六进制下的  十进制10
       n = 0XA // 十六进制下的  十进制10
       n = 0Xa // 十六进制下的  十进制10
       n = 0xh // 报错
    二进制
       n = 0b101 // 二进制的 5
       n = 0B101 // 二进制的 5
    指数形式
       n = 1E3 // 1 * 10^3   
    
    (3)浮点数问题
    0.1 + 0.2 === 0.3 ; //false
    0.1 + 0.2  //0.30000000000000004
    数学上是正确的,但是因为一些技术原因,导致浮点数不会太精确。
    解决方法设置一个误差范围,机器精度,js这个值为Math.pow(2,-52)
    ES6将这个值定义在 Number.EPSILON中
    if(!Number.EPSILON){
        Number.EPSILON = Math.pow(2,-52);
    }
    function compare(n1,n2){
        return Math.abs( n1 - n2) < Number.EPSILON
    }
    compare(0.1 + 0.2 , 0.3); true;
    
    (4)NaN  
    本来要返回数值的的值,未返回数值就会返回NaN.
    NaN === NaN // false  NaN不等于NaN
    window.isNaN(NaN) //true  window.isNaN(),参数转换为数值类型后是NaN的,都会返回true
    window.isNaN('as')  //true
    Number.isNaN(NaN) //true  ES6中Number.isNaN()只有传入的是NaN,才会返回true
    Number.isNaN('as') //false 
    
    (5)Infinity
    值过于大 就会返回Infinity 负数是 -Infinity
    可以使用isFinite()来检测,正常大小返回true;
    
    

    symbol不了解,也没用过,以后补上。

    基本包装类型
    Boolean String Number 这三种类型在通过非new 生成的字面量,js在进行操作的时候会生成一个相应的类型实例,在进行相应操作返回结果,然后销毁实例.
    举个例子:
    let s = 'test';
    console.log('test'.substr(2)); // st;
    后台自动完成了以下操作:
    (1) 创建String类型的实例( 相当于:new String('test'));
    (2) 在实例上调用指定的方法,返回值;
    (3) 销毁这个实例;
    
    不要使用Boolean String Number的引用类型
     !!''   // false
     !!new String('')  // true
     typeof '' // 'string'
     typoef new String('') // 'object'
    
     false // false
     !!new Boolean(false) // true
     typoef false // 'false'
     typoef new Boolean(false) // 'object'
    
     !!0 // false
     !!new Number(0) // true
     typoef 0 // 'number'
     typoef new Number(0) // 'object'
     使用这三个类型的引用类型会导致,你分不清到底在操作什么类型的值,而且布尔
     判断也容易出错
    
    Object
    (1)创建对象
    let obj = new Object();
    obj = Object();
    obh = {};
    (2) 判断
    2个对象在进行 ==  ===判断的时候,JS会直接比较其引用的内存是否相同。
    并且对象 在任何时候下 转换为布尔值都为真。
    

    关于各个类型的方法,属性,技巧在下几篇笔记里写。

    顺便说下几个内置函数原型的值(在浏览器中查看是这样,但我讲的有可能是错的)

    Array.prototype  是一个空数组
    Function.prototype 是一个函数
    Object.prototype 是一个对象   Safari浏览器里显示是一个空对象,可能是因为其方法不可枚举的原因
    Symbol.prototype 是Symbol类型'Symbol'
    Boolean.prototype  是一个布尔值false的封装类型
    String.prototype 是一个空字符串的封装类型
    Number.prototype 是一个数字0的封装类型
    

    相关文章

      网友评论

        本文标题:<JS>学习笔记(基础:数据类型)

        本文链接:https://www.haomeiwen.com/subject/laqtqxtx.html