JS 类型转换,我是认真的

417 阅读4分钟

数据类型

最新的ECMAScript 标准定义了7种数据类型

原始类型

  • 基本类型的变量是存放在栈内存(Stack)里的
  • 基本数据类型的值是按值访问的
  • 基本类型的值是不可变的
  • 基本类型的比较是它们的值的比较
    • number
    • string
    • null
    • undefined
    • boolean
    • symbol

引用类型

  • 引用类型的值是保存在堆内存(Heap)中的对象(Object)
  • 引用类型的值是按引用访问的
  • 引用类型的值是可变的
  • 引用类型的比较是引用的比较
    • Object
      • Object、Array、RegExp、Date、Function

请注意

  • NaN 的数据类型是 number
  • 数组(Array)的数据类型是 object
  • 日期(Date)的数据类型为 object
  • null 的数据类型是 object
  • 未定义变量的数据类型为 undefined

constructor 属性

  • constructor 属性返回所有 JavaScript 变量的构造函数。
"John".constructor                 // 返回函数 String()  { [native code] }
(3.14).constructor                 // 返回函数 Number()  { [native code] }
false.constructor                  // 返回函数 Boolean() { [native code] }
[1,2,3,4].constructor              // 返回函数 Array()   { [native code] }
{name:'John', age:34}.constructor  // 返回函数 Object()  { [native code] }
new Date().constructor             // 返回函数 Date()    { [native code] }
function () {}.constructor         // 返回函数 Function(){ [native code] }
  • 你可以使用 constructor 属性来查看对象是否为数组 (包含字符串 "Array"):
function isArray(myArray) {
    return myArray.constructor.toString().indexOf("Array") > -1;
}
  • 你可以使用 constructor 属性来查看对象是否为日期 (包含字符串 "Date"):
function isDate(myDate) {
    return myDate.constructor.toString().indexOf("Date") > -1;
}

显示类型转换

1. Number 函数:转换成数值

1.1 原始类型转换Number 函数

    // Number函数:转换成数值
    
    // 数值:转换后还是原来的值
    console.log(Number(324)); // 324
    
    // 字符串:如果可以被解析为数值,则转换为相应的数值,否则得到NaN。空字符串转为0
    console.log(Number('324'));// 324
    console.log(Number('324abc')); // NaN
    console.log(Number('')); // 0
    
    // 布尔值:true转成1,false转成0
    console.log(Number(false)); // 0
    console.log(Number(true));// 1
    
    // undefined: 转成NaN
    console.log(Number(undefined)); // NaN
    
    // null: 转成0
    console.log(Number(null)); // 0

1.2 对象类型转换Number 函数

  • 先调用对象自身的valueOf方法,如果该方法返回原始类型的值(数值、字符串和布尔值),则直接对该值使用Number方法,不再进行后续步骤。
  • 如果valueOf方法回复合类型的值,再调用对象自身的toString方法,如果toString方法返回原始类型的值,则对该值使用Number方法,不再进行后续步骤。
  • 如果toString方法返回的是复合类型的值,则报错。
    var a = {a: 1};
    console.log('a', Number({a: 1})); // a NaN

2. String 函数:转换成字符串

2.1 原始类型转换String 函数

    // 数值:转为相应的字符串
    console.log(String(123)); // "123"
    
    // 字符串:转换后还是原来的值
    console.log(String('abc')); // "abc"
    
    // 布尔值:true转为“true”,false转为“false”
    console.log(String(true)); // "true"
    
    // undefined:转为“undefined”
    console.log(String(undefined)); // "undefined"
    
    // null:转为“null”
    console.log(String(null)); // "null"

2.2 引用类型转换String 函数

    
    
    // 先调用toString方法,如果toString方法返回的是原始类型的值,则对该值使用String方法;
    // 如果toString方法返回的是复合类型的值,再调用valueOf方法,如果valueOf方法返回的是原始类型的值,则对该值使用String方法
    var b = {
        b: 1,
        toString: function () {
            return {
                b: 2,
            };
        },
        valueOf: function () {
            return 'b';
        },
    };
    console.log('b', String(b)); // b b

3. Boolean 函数:转换成布尔值

   // 以下六个值的转化结果为false,其他的值全部为true
    // undefined
    // null
    // -0
    // +0
    // NaN
    // ''(空字符串)
    console.log('undefined', Boolean(undefined)); // false

    console.log('null', Boolean(null)); // false

    console.log('0', Boolean(0)); // false

    console.log('NaN', Boolean(NaN)); // false

    console.log('', Boolean('')); // false

4. 隐式转换的情况

  • 四则运算 + - * /
  • 判断语句
  • navive调用

5.运算逻辑

  • 运算子之中存在对象(或者准确地说,存在非原始类型的值),
  • 则先调用该对象的valueOf方法。如果返回结果为原始类型的值,
  • 则运用上面两条规则;否则继续调用该对象的toString方法,
  • 对其返回值运用上面两条规则
[] + [] // ""
[] + {} // "[object Object]"
{} + [] // 0    (把 {} 作为代码块,然后 []调用number 规则)
{} + {} // "[object Object][object Object]" (chrome 输出 )
{} + {} // NaN (firefox 输出 )
true + true // 2

typeof

typeof的返回值共有七种:

  • number, boolean, string, undefined, object, function,symbol

1、number

typeof(10);
typeof(NaN);
//NaN在JavaScript中代表的是特殊非数字值,它本身是一个数字类型。
typeof(Infinity);

2、boolean

typeof(true);
typeof(false);

3、string

typeof("abc");

4、undefined

typeof(undefined);
typeof(a);//不存在的变量

5、object

对象,数组,null返回object

typeof(null);
typeof([]);
typeof({});
typeof(window);

6、function

typeof(Array);
typeof(Date);

7、symbol

typeof Symbol() // ES6提供的新的类型