js类型介绍

有几个小问题:

为什么有的编程规范要求用 void 0 代替 undefined?

字符串有最大长度吗?0.1 + 0.2 不是等于 0.3 么?

ES6 新加入的 Symbol 是个什么东西?

为什么给对象添加的方法能用在基本类型上?
   * 运算符提供了装箱操作,它会根据基础类型构造一个临时对象,使得我们能在基础类型上调用对应对象的方法
  1. 类型
    Undefined; Null; Boolean; String; Number; Symbol; Object。

    a. undefined

     undefined 是变量而不是关键字 所以他可以被赋值
     所以 当我们要代表 undefined的时候 可以使用 void
     void 只是单纯的表示 对象返回值为 undefined
    

    b. Boolean
    c. String
    String 有最大长度是 2^53 - 1 ( 不是字符串长度是 编码长度 )
    字符串是永远无法变更的 // var str1 = ‘a’; str1[0] = 1; str1 // ‘a’

    d. Number
    Number 类型有 18437736874454810627(即 264-253+3) 个值
    NaN,占用了 9007199254740990,这原本是符合 IEEE 规则的数字;
    Infinity,无穷大;
    -Infinity,负无穷大。

     除法场合需要特别留意 +0 或 -0
     检测是 +0 或者 -0 1/x == Infinity 或 -Infinity
     Number 类型中有效的整数范围是 -0x1fffffffffffff 至 0x1fffffffffffff
     0.1 + 0.2 == 0.3 // false
     Math.abs(0.1 + 0.2 - 0.3) <= Number.EPSILON // true
    

    e. Symbol
    利用 Symbol.iterator 属性来自定义 for … of 在对象上的行为

     var o = new Object
    
     o[Symbol.iterator] = function() {
         var v = 0
         return {
             next: function() {
                 return { value: v++, done: v > 10 }
             }
         }
     };
    
     for(var v of o)
         console.log(v); // 0 1 2 3 ... 9
    

    f. Object
    3 是一个Number类型
    new Number(3) 是一个对象类型
    Number、String 和 Boolean,三个构造器是两用的,当跟 new 搭配时,它们产生对象,当直接调用时,它们表示强制类型转换
    Symbol 函数比较特殊,直接用 new 调用它会抛出错误,但它仍然是 Symbol 对象的构造器

     * 代码可以把对象的方法在基本类型上使用
    
     console.log("abc".charAt(0)); //a
    
     在原型上添加方法,都可以应用于基本类型
    
     Symbol.prototype.hello = () => console.log("hello");
     var a = Symbol("a");
     console.log(typeof a); //symbol,a并非对象
     a.hello(); //hello,有效
    
  2. 类型转换
    看图: 类型转换.jpg

    a. StringToNumber
    Number 是比 parseInt 和 parseFloat 更好的选择

    b. NumberToString
    当 Number 绝对值较大或者较小时,字符串表示则是使用科学计数法表示的
    其实就是保证了产生的字符串不会过长

  3. 装箱转换 ( 把基本类型转换为对应的对象 )
    每一种基本类型 Number、String、Boolean、Symbol 在对象中都有对应的类

    Symbol函数无法使用new来调用

     var symbolObject = (function(){ return this; }).call(Symbol("a"));
    
     console.log(typeof symbolObject); //object
     console.log(symbolObject instanceof Symbol); //true
     console.log(symbolObject.constructor == Symbol); //true
    
  4. 拆箱转换
    ToPrimitive函数 是对象类型到基本类型的转换
    把对象变成基本类型 再从基本类型转换为对应的String 和 Number

    拆箱转换会尝试调用 valueOf 和 toString 来获得拆箱后的基本类型 如果valueOf 和 toString都不存在 或者没有返回基本类型 则会产生TypeError

     var o = {
         valueOf : () => {console.log("valueOf"); return {}},
         toString : () => {console.log("toString"); return {}}
     }
    
     o * 2
     // valueOf
     // toString
     // TypeError
    
     string(o)
     // toString
     // valueOf
     // typeError
    

List 和 Record: 用于描述函数传参过程。
Set:主要用于解释字符集等。
Completion Record:用于描述异常、跳出等语句执行过程。
Reference:用于描述对象属性访问、delete 等。
Property Descriptor:用于描述对象的属性。
Lexical Environment 和 Environment Record:用于描述变量和作用域。
Data Block:用于描述二进制数据。

typeof运算结果 看图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值