JavaScript高级程序设计Web前端之路

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

2017-06-06  本文已影响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()

上一篇 下一篇

猜你喜欢

热点阅读