美文网首页
7中数据类型

7中数据类型

作者: 静_summer | 来源:发表于2019-08-19 19:16 被阅读0次

    七个类型:

    • undefined
    • null
    • Boolean
    • String
    • Number
    • Symbol
    • Object

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

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

    • undefined和null的区别:

    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. 转成boolean

      undefined、null、0、’‘、NaN、false、0、-0都转为false,其他都是true

      1. 四则运算

      除了加法,只要有number就都转为number
      6 * [2,1] // NaN
      true * [2] // 2

      1. 加法运算符
      1. 一方有string都转为string
      2. boolean和number,转成number
      3. 非number调用toSting()
      
      1. 比较运算符

      对象:通过primitive、valueof、toString转换
      strring: 通过unicode编码大小比较

      1. == 和 ===
        例子:[] == ![] // true
        [] == !{} // true
        {} == !{} // false
        {} == ![] // false


        image.png
      1. a==1 && a==2 && a==3
        相关知识点:
    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

    相关文章

      网友评论

          本文标题:7中数据类型

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