程序员JavaScript 进阶营

Javascript知识整理——强制类型转换

2017-09-07  本文已影响57人  俗三疯

值类型转换

将值从一种类型转换为另一种类型通常称为类型转换,这是显式的情况;隐式的情况称为强制类型转换

类型转换发生在静态类型语言的编译阶段,而强制类型转换则发生在动态类型语言的运行时

ToString

字符串化规则
JSON.stringify(undefined); //undefined
JSON.stringify(function(){}); //undefined
JSON.stringify(
    [1,undefined,function(){},4]
);                          //"[1,null,null,4]"

ToNumber

转化规则
var c = [4,2];
console.log(Number(c)); //undefined

var a = {
    valueOf: function () {
        return "42"
    },
    toString: function () {
        return "41"
    }

}
var b = {
    toString: function () {
        return "41"
    }
}
// console.log(Number(b)) //41
console.log(Number(a))    //42 (valueOf优先调用)

ToBoolean

假值
假值对象

假值对象时指在常规Javascript语法基础上自己创建了一些外来的值,强制类型转换为false。(如document.all)
而封装了假值的对象,并非假值对象,强制类型转换时仍视作一个对象来看,转为true

var a = new Boolean(false);
var b = new Number(0);
var c = new String("");
console.log(Boolean(a));    //true
console.log(Boolean(b));    //true
console.log(Boolean(c));    //true
真值

假值以外的值
表示假值的字符串强制类型转化仍视为非空字符串看待,转化为true

var a = "false"
var b = "0";
var c = "''";
var d = Boolean(a&&b&&c);
d;              //true

显式强制类型转换

显式强制类型转化是那些显而易见的类型转换

字符串和数字之间的显式转换
var a = 42;
var b = a.toString();
//toString()对a不适用,Javascript引擎自动为42创建一个封装对象,然后调用该对象的toString()方法
var c = "3.14"
var d = +c;
b;          //"42"
d;          //3.14
显式解析数字字符串
var a = "42"
var b = "42px"
Number(a);      //42
parstInt(a);    //42
Number(b);      //NaN
parseInt(b);    //42
parseInt(1/0,19);  //18
//转换为字符串后parse("Infinity",19)
//第一个字符是“I”,以19为基数时值为18,第二个字符不是一个有效的数字字符,解析到此为止。(19为基数时,有效范围为0-9,a-i)
显示转换为布尔值
var a = "0";
var b = [];
var c = {};

var d = "";
var e = 0;
var f = null;
var g;

!!a;    //true
!!b;    //true
!!c;    //true

!!d;    //false
!!e;    //false
!!f;    //false
!!g;    //false

隐式强制类型转换

字符串和数字之间的隐式强制类型转换

+运算符既能用于数字加法,也能用于字符串拼接
简单来说,如果+的其中一个操作数是字符串(或者可以隐式转换为字符串)则执行字符串拼接,否则执行数字加法

var a = "42"
var b = "0";
var c = 42;
var d = 0;
a + b ; // "420"
c + d ; // 42

var e = [1,2];//首先对其调用ToPrimitive抽象操作,再调用[[DefaultValue]],以数字作为上下文
var f = [3,4];
e + f ; //"1,23,4"
布尔值到数字的隐式强制类型转换
function onlyOne(){
    var sum = 0;
    for(var i=0;i<arguments.length;i++){
        if(arguments[i]){
            sum += arguments[i];
        }
    }
}
var a = true;
var b = false;
onlyOne(b,a);       //true
onlyOne(b,a,b,b);   //true
onlyOne(b,a,b,b,a)  //false
隐式强制类型转换为布尔值

以上情况中,非布尔值会被隐式强制类型转化为布尔值,遵循前面介绍过得ToBoolean抽象规则

||和&&

准确来说,应该将它们称为"选择器运算符"
它们的返回值是两个操作数中的一个(且仅一个)

a || b
//相当于
a ? a : b

a && b 
//相当于
a ? b : a
符号的强制类型转换

宽松相等和严格相等

正确的解释是:“==允许在相等比较上进行强制类型转换,而===不允许”

抽象相等
抽象关系比较

以上内容来自《你不知道的JS中卷》的知识整理

上一篇 下一篇

猜你喜欢

热点阅读