隐式转换

204 阅读5分钟
  • null == undefined  => true  因为 == 只会比较值, 而 null 和undefined 比较时都会先转成对应的 数值 0  来比较!!! 0==0 =》 true   

  • boolean 值 true 与 false 只能是小写  含大写的 都是有效的标识符【变量名 函数名 等】  而不是boolean值   !! 使用两个取非运算可以把任何数值转成布尔值!!!

  • NAN  == NaN  =》 false  ||  只要是NaN 参与的运算  返回的都是NaN  

  • 判断 NaN  isNaN(NaN) =>  true   ||  只要是 无法转成 数值类型的 值 传入到 isNaN 都会返回 true    ‘10’ true false  ‘10aaa’ 等都会返回 false

  • Number()函数基于如下规则执行转换。

     布尔值,true 转换为 1,false 转换为 0。

     数值,直接返回。

     null,返回 0。

     undefined,返回 NaN。

     字符串,应用以下规则。

     如果字符串包含数值字符,包括数值字符前面带加、减号的情况,则转换为一个十进制数值。

    因此,Number("1")返回 1,Number("123")返回 123,Number("011")返回 11(忽略前面

    的零)。

     如果字符串包含有效的浮点值格式如"1.1",则会转换为相应的浮点值(同样,忽略前面的零)。

     如果字符串包含有效的十六进制格式如"0xf",则会转换为与该十六进制值对应的十进制整

    数值。

     如果是空字符串(不包含字符),则返回 0。

     如果字符串包含除上述情况之外的其他字符,则返回 NaN。

     对象,调用 valueOf()方法,并按照上述规则转换返回的值。如果转换结果是 NaN,则调用

    toString()方法,再按照转换字符串的规则转换。

  • 考虑到用 Number()函数转换字符串时相对复杂且有点反常规,通常在需要得到整数时可以优先使

    用 parseInt()函数。parseInt()函数更专注于字符串是否包含数值模式。字符串最前面的空格会被

    忽略,从第一个非空格字符开始转换。如果第一个字符不是数值字符、加号或减号,parseInt()立即

    返回 NaN。这意味着空字符串也会返回 NaN(这一点跟 Number()不一样,它返回 0)。

  • 不同的数值格式很容易混淆,因此 parseInt()也接收第二个参数,用于指定底数(进制数)。如

    果知道要解析的值是十六进制,那么可以传入 16 作为第二个参数,以便正确解析:

    let num = parseInt("0xAF", 16); // 175

    事实上,如果提供了十六进制参数,那么字符串前面的"0x"可以省掉:

    let num1 = parseInt("AF", 16); // 175

    let num2 = parseInt("AF"); // NaN

  • 通过第二个参数,可以极大扩展转换后获得的结果类型。比如:

    let num1 = parseInt("10", 2); // 2,按二进制解析

    let num2 = parseInt("10", 8); // 8,按八进制解析

    let num3 = parseInt("10", 10); // 10,按十进制解析

    let num4 = parseInt("10", 16); // 16,按十六进制解析

    因为不传底数参数相当于让 parseInt()自己决定如何解析,所以为避免解析出错,建议始终传给

    它第二个参数。

    注意 多数情况下解析的应该都是十进制数,此时第二个参数就要传入 10。

  • tostring()  把一个值转换为字符串  

    toString()返回数值的十

    进制字符串表示。而通过传入参数,可以得到数值的二进制、八进制、十六进制,或者其他任何有效基

    数的字符串表示,比如:

    let num = 10;

    console.log(num.toString()); // "10"

    console.log(num.toString(2)); // "1010"

    console.log(num.toString(8)); // "12"

    console.log(num.toString(10)); // "10"

    console.log(num.toString(16)); // "a"

    这个例子展示了传入底数参数时,toString()输出的字符串值也会随之改变。数值 10 可以输出为

    任意数值格式。注意,默认情况下(不传参数)的输出与传入参数 10 得到的结果相同。

    如果你不确定一个值是不是 null 或 undefined,可以使用 String()转型函数,它始终会返回表

    示相应类型值的字符串。String()函数遵循如下规则。

     如果值有 toString()方法,则调用该方法(不传参数)并返回结果。

     如果值是 null,返回"null"。

     如果值是 undefined,返回"undefined"。

  • 模板字符串`` 和原始字符串String.raw 标签函数 

    // Unicode 示例

    // \u00A9 是版权符号

    console.log(\u00A9); // ©

    console.log(String.raw\u00A9); // \u00A9

    // 换行符示例

    console.log(first line\nsecond line);

    // first line

    // second line

    console.log(String.rawfirst line\nsecond line); // "first line\nsecond line"

 

Symbol 数据类型:

  

  /* js 新特性 symbol 类型  === 看做 永远不会重复字符串 

      使用场景1,用于区分某些数据接口中属性重名而某些被覆盖的情况【加上一个key:Symbol()属性!!!

      2.如果某些属性不想暴露给外部,可以使用Symbol定义index【key】 【let symbol = Symbol('description')   [symbol]:"object" 这种方式】   

      】

     */

   let sl = Symbol('这是一段描述');//Symbol('description')

    console.log(sl.description);//获取描述

    let sl1 = Symbol.for('另一种定义方式'); //全局定义 symbol

    let sl2 = Symbol.for('另一种定义方式')

    console.log(sl1 == sl2);//true 描述一样 第二个定义会引用第一次定义的 两个变量相等!!!

    console.log(Symbol.keyFor(sl1));//另一种获取描述方式

  let mySymbol = new Symbol(); // TypeError: Symbol is not a constructor

  如果你确实想使用符号包装对象,可以借用 Object()函数:

  let mySymbol = Symbol();

  let myWrappedSymbol = Object(mySymbol);

  console.log(typeof myWrappedSymbol); // "object"