7中数据类型

2019-08-19  本文已影响0人  静_summer

七个类型:

ECMAScript: 由ecma国际定义的js标准,1999年12月,ECMAScript 3.0版发布,成为JavaScript的通行标准,得到了广泛支持。2015年6月17日,ECMAScript 6发布正式版本,即ECMAScript 2015

es3.0 中undefined可以重新赋值,但是在es5中已经屏蔽了这个操作

1.前者可以被重新赋值,但是es5已经作了屏蔽,后者是关键字,不可以重新赋值
!function(window, undefined) {
// 这里的undefined就不会出现赋值的问题
}(window)

  1. undefined in window// true;
    null in window// false

  2. unicode规定一个字符用两个字节表示,一个字节是8位,那么就是 2 ^ 8 * 2 ^ 8 = 65536
    ascii包含128个字符
    utf-8 和utf-16的区别:utf-8 使用1、2、3、4个字节来表示,utf16用2或4个字节来表示

  3. 对比number小数位
    Math.abs(0.1 + 0. 2 0.3) < Number.EPSILON

  4. symbol 的定义和使用

    • 原始数据类型: 独一无二的值
      let s1 = Symbol('s1')
    • 不能做运算:
      Boolean(s) // true
      String(s) // Symbol('s1')
      Number(s) // 报错,不能转数字,所以不能用于任何的 + - * /
      s.toString()// 'Symbol('s1')'
    • !!Symbol() // true
    • 不能new操作符, 是
    • Object.assign(obj, newSymbolKeyObj) // 能够被复制到新对象上

    使用场景

    • 可以作为obj的key值,obj的key值只能是string和symbol

      • 可以作为对象的私有属性: 因为JSON.stringify(obj),Object.keys()、for in、for of不会返回Symbol的key值
      • 获取obj中的symbol()属性:Reflect.ownKeys(obj)、Object.getOwnPropertySymbols(obj)
      • Symbol.for('foo') 和 Symbol.keyFor(s)

      let s = Symbol.for('foo') // 返回Symbol(foo)
      let s = Symbol.keyFor(s) // 返回'foo'
      * 可以定义常量:
      * let RESOVLED = Symbol()

    • 内置的Symbol相关方法

    > Array.prototype[Symbol.iterator] = function() { // 重新定义for of
        let v = 0;
        return {
            next: function () {
                return {value: v++, done: v > 10}
            }
        }
    }
    
    > class objSelf { // 定义了instanceof行为,只有在右边是objSelf的时候才会调用
        static [Symbol.hasInstance] (obj) {
            console.log('Symbol.hasInstance')
            return true
        }
    }
    [] instanceof objSelf
    
    
## 数值运算,类型转换
    ```javascript
 let obj = { // 进行数值运算,对象转原始类型,最高优先级toPrimitive,其次是valueof,其次是tostring
        [Symbol.toPrimitive](hint) {
            if(hint === 'number'){ // 要转成数字
                console.log('Number场景');
                return 123;
            }
            if(hint === 'string'){ // 要转成字符串
                console.log('String场景');
                return 'str';
            }
            if(hint === 'default'){ // 可以转成字符串或者数字
                console.log('Default 场景');
                return 'default';
            }
        },
        valueof () {
            console.log('valueof')
            return false
      },
      toString() {
          console.log('toString')
          return false
      }     
    }
    console.log(obj **2) // number
    console.log(String(2)) // string
    console.log(obj + 2) // default

数据类型转换规则

转成boolean、string、number


image.png
  1. 隐式转换查找顺序是Symbol.isPrimitive、valueof、toString,如果是转换成字符串的隐式类型转换顺序是Symbol.isPrimitiv、toString、valueof
    let a = {
    i: 1,
    Symbol.isPrimitive {
    return this.i++
    },
    valueof () {
    return this.i++
    },
    toString () {
    return this.i++
    },
    }
  2. 利用setter和getter
上一篇 下一篇

猜你喜欢

热点阅读