美文网首页JavaScript高级程序设计Web前端之路
第三章(2):基本概念(学习笔记)

第三章(2):基本概念(学习笔记)

作者: 日暮途远_ | 来源:发表于2017-06-06 17:11 被阅读7次

    数据类型

    ECMAScript目前有7中数据类型,Undefined, Null, Number, String, Boolean, Object, Symbol

    1. typeof 操作符
      typeof操作符可以鉴定变量的数据类型。如下 :
    var testUndefined
      var testNull = null
      var testNumber = 123
      var testString = 'hello,world'
      var testBoolean = true
      var testObject = {}
      var testArray = []
      var testSymbol = Symbol(1)
      console.log(typeof testUndefined) // 结果: undefined
      console.log(typeof testNull)  // 结果:object
      console.log(typeof testNumber)  // 结果:number
      console.log(typeof testString)  // 结果:string
      console.log(typeof testBoolean) // 结果:boolean
      console.log(typeof testObject)  // 结果:object
      console.log(typeof testArray)  // 结果:object
      console.log(typeof testSymbol)  // 结果:symbol
    

    可以看到Null, Array通过typeof操作符来判断返回的都是object,通过Object.prototype.toString.call(变量)来进行精确的判断。如下:

      console.log(Object.prototype.toString.call(testNull)) // 结果: [object Null]
      console.log(Object.prototype.toString.call(testArray))  // 结果:[object Array]
    
    1. Undefined 类型
      声明未初始化的变量的默认值为undefined
    2. Null 类型
      从逻辑角度来看, null 值表示一个空对象指针,可以用来初始化一个对象。
    3. Boolean 类型
      布尔类型,之后两个:true或者false.一般多用于条件控制语句。其他类型都可以转化为Boolean。规则如下:


      转换规则
    4. Number 类型
      (1) ECMAScript中的数值类型采用IEEE754格式来表示。整数的类型,有十进制,八进制,十六进制。默认为十进制,在数值计算和赋值的时候都会转化为十进制的结果。如下:
      var num10 = 100
      var num8 = 070
      var num16 = 0xA
      console.log(num10)  // 100
      console.log(num8) // 56
      console.log(num16) // 10
    

    需要注意的是,严格模式下,八进制会报错。Uncaught SyntaxError: Octal literals are not allowed in strict mode.
    (2) 采用IEEE754格式的浮点数计算有个通病,那就是小数位有计算精度。产生这个结果的原因是因为小数在计算机计算过程中以下几个步骤:
    1 转化为二进制
    2 采用科学技术法
    3 表示成 IEEE 754 形式
    在1和3的过程中都会发生精度丢失的问题。如十进制的0.7可以准确的表示一个小数,但是转换为二进制却是一个循环的小数。所以才会导致精度丢失的问题。
    解决办法很多,介绍其中一种:可以通过toPrecision来指定小数位。例子如下:

      // 浮点数计算精度问题
      let num = 0.2 + 0.4
      console.log('num: ', num)  // num:  0.6000000000000001
      let toPrecision = num.toPrecision(1)  
      console.log('toPrecision: ', toPrecision)   // toPrecision:  0.6
    

    (3) 数值范围
    ECMAScript不可能保存所有范围内的数值。他的最大值和最小值保存在Number中的两个属性中。如下:

    console.log(Number.MIN_VALUE) // 5e-324
    console.log(Number.MAX_VALUE) // 1.7976931348623157e+308
    

    (4) NaN
    代表非数值。可以通过isNaN来判断一个数值是否是非数值。如下:

      console.log(isNaN(num10)) // false
      console.log(isNaN('hello')) // true
    

    (5) 数值转换
    数值转换有3个方法:Number(), parseInt(), parseFloat()
    Number()
    直接看例子:

      console.log(Number(true)) // 1
      console.log(Number(false))  // 0
      console.log(Number('123'))  // 123
      console.log(Number('123hello123'))  // NaN
      console.log(Number({a: 1})) // NaN
      console.log(Number(undefined))  // NaN
      console.log(Number(null)) //0
    

    parseInt()
    转为整数,parseInt的第二个参数可以指定转换时的基数(进制),如果不指定的话,第一个参数以0开头,有可能会指定基数为8。例子如下:

      console.log(parseInt(070))  // 56 基数为8
      console.log(parseInt('010', 10))  // 10
      console.log(parseInt('123hello', 10)) // 123
      console.log(parseInt('0x')) // NaN
      console.log(parseInt('0xA'))  // 10  基数为16
    

    parseFloat()
    转为浮点数,只会解析十进制。16进制会解析为0,因为以0开头。如果有多个小数点的话,只会取第一个小数位的有效位数。如下:

      console.log(parseFloat('123.456.78')) // 123.456
      console.log(parseFloat('0xA')) // 0
      console.log(parseFloat('22.5')) // 22.5
      console.log(parseFloat('1.23e2')) // 123
    
    1. String 类型
      由零或多个 16 位 Unicode 字符组成的字符序列,即字符串。由单引号或者双引号包起来。
    2. Object 类型
      Object是一组数据和功能的集合。由于在 ECMAScript 中 Object 是所有对象的基础,因此所有对象都具有这些基本的属性和方法。创建方式可以通过字面量或者构造函数,如下:
    var obj1 = {}  //字面量
    var obj2 = new Object()  //构造函数
    

    Object的实例属性和方法,如下:
    (1) constructor
    构造函数
    (2) hasOwnProperty(propertyName)
    用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。有点绕口。直接看例子:

      var obj = {
        name: 'hello, world',
        say: function () {
          console.log('saying...')
          }
      }
    
      obj.prototype = {
        getName: function () {
          console.log(this.name)
          }
      }
    
      // 用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。
      console.log(obj.hasOwnProperty('toString')) // false
      console.log(obj.hasOwnProperty('getName')) // false
      console.log(obj.hasOwnProperty('say'))  // true
    

    (3) isPrototypeOf()
    测试一个对象是挂载与另一个对象的原型链上。如下:

      // 方法用于测试一个对象是否存在于另一个对象的原型链上。   Fee > Fi > Fo > Fum
      function Fee() {
          // . . .
      }
    
      function Fi() {
          // . . .
      }
      Fi.prototype = new Fee();
    
      function Fo() {
          // . . .
      }
      Fo.prototype = new Fi();
    
      function Fum() {
          // . . .
      }
      Fum.prototype = new Fo();
    
      var fum = new Fum();
      console.log(Fi.prototype.isPrototypeOf(fum))  // true
    

    (4) toString()
    返回对象的字符串表示
    (5) valueOf()
    作用和toString()类似

    引用

    javascript高级程序设计第三版
    浮点数问题
    代码之谜 浮点数
    isPrototypeOf()

    相关文章

      网友评论

        本文标题:第三章(2):基本概念(学习笔记)

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