资讯专栏INFORMATION COLUMN

Javascript基础之-强制类型转换(一)

leon / 1551人阅读

摘要:转换为字符串规则如下图代码大致就是普通其他基本类型转为字符串的话,就直接转为其值的字符串表达形式,如果是基本类型的封装对象,会先拆封,然后再转为字符串,如果是普通对象,则会调用其内部的值,如果是极大数和级小数,将会进行一些转化,具体规

转换为字符串规则如下图代码:

console.log(String(undefined));  // "undefined"
console.log(String(null));     // "null"
console.log(String(true));    // "true"
console.log(String(+0));      // "0"
console.log(String(-0));    // "0"
console.log(String(-20));   // "-20"
console.log(String(Infinity));  // "Infinity"
console.log(String(new Number(123)))    // 123
console.log(String(new Object()))    // [object Object]
console.log(100000000000000000000000000000);   // 1e+29

大致就是普通其他基本类型转为字符串的话,就直接转为其值的字符串表达形式,

如果是基本类型的封装对象,会先拆封,然后再转为字符串,

如果是普通对象,则会调用其内部[class]的值,

如果是极大数和级小数,将会进行一些转化,具体规则请参考ecma 官方文档https://www.ecma-internationa...

请思考下面的代码

var obj = {
  toString() {
    return "toString";
  }
}
console.log(String(obj))   // toString
var obj1 = Object.create(null);
obj1.valueOf = function() {
  return "valueOf";
}
console.log(String(obj1)); // valueOf

上面这个代码似乎可以看出,实际上普通对象转为字符串的过程,似乎就是toString()的一个过程,也就是调用其内部toString()的一个过程

如果toString()没有咋办,调用valueOf,如果这个也没有呢,就直接报错了。

转换为数字的规则

普通转换为数字的规则如下:

console.log(Number(true));  // 1
console.log(Number(0b1101))   // 13
console.log(Number(false));  // 0
console.log(Number("123"));  //123
console.log(Number("123a"));  //NaN
console.log(Number(undefined));  // NaN
console.log(Number(null));   // 0

不过呢,如果是对象类型的咋办呢,实际上同上的一点是,如果是基本类型封装后的对象,会先拆封,也就是转为基本类型值,然后再转为数字,比如说

console.log(Number(new String("123123")));   // 123123
console.log(Number([1]));   // 1
console.log(Number([1, 3]));   // NaN

可能你会疑惑,说,为啥数组只有一个数据的时候可以转换,有两个数据的时候就是NaN了呢,原因在这里,看代码

console.log([1].valueOf());  // [1]
console.log([1, 3].valueOf());   // [1, 3]
console.log([1].toString());  // 1
console.log([1, 3].toString());   //1, 3

可以看到,valueOf没有返回基本类型值,所以转而使用toString转为基本类型值,这俩字符串再转为数字的结果就一目了然了,和上面的是一样的

那么转为数字的过程中,valueOf和toString是哪个先执行的呢?

看代码

var a = {
  valueOf() {
    return 2;
  },
  toString() {
    return 3;
  }
}
var b = {
  valueOf() {
    return [1, 3];
  },
  toString() {
    return 3;
  }
}
var c = {
  toString() {
    return 3;
  }
}
var d = Object.create(null);
console.log(Number(a));  // 2
console.log(Number(b));  // 3
console.log(Number(c));  // 3
console.log(Number(d));  // Uncaught TypeError: Cannot convert object to primitive value

这个其实就说明了一个问题,就是说对象转数字的时候,会先找valueOf(),如果valueOf()没有,或者是说转的是非基本数据类型的,将会使用toString(),最后基本类型专成数字类型的,如果valueOf和toString()都没有,就直接报错了

转化为数字呢,除了以上使用Number(),还可以使用+符号,这个也可以实现从其他类型转换到字符串

console.log(+"abc");  // NaN
console.log(+"1111");  //1111
console.log(+[1]);  // 1
var obj = {
  valueOf() {
    return "1111";
  }
}
console.log(+obj);   // 1111

如果原数据类型是Date,那么可以用Number或者+转为以微秒为单位的unix时间戳

var d = new Date( "Mon, 18 Aug 2014 08:53:06 CDT" );
console.log(+d);    // 1408369986000
console.log(Number(d));   //1408369986000


parseInt和Number()的区别:看例子

var a = "123abc";
console.log(+a);   // NaN
console.log(parseInt(a));  // 123
console.log(parseInt("abc123"));  // NaN

实际上,parseInt会从左往右进行解析,找到非字符串的时候停止,如果一开始就不可转为数字,那么就返回NaN

parseInt其他一些坑点,这里就不细说了,想看的,可以找《你不知道的Javascript》了解细节

// 0 ("0" 来自于 "0.000008")
console.log(parseInt( 0.000008 ));
// 8 ("8" 来自于 "8e-7")
console.log(parseInt( 0.0000008 )); 
// 250 ("fa" 来自于 "false")
console.log(parseInt( false, 16 ));
// 15 ("f" 来自于 "function..")
console.log(parseInt( parseInt, 16 )); 
console.log(parseInt( "0x10" )); // 16
console.log(parseInt( "103", 2 )); // 2



转化为布尔值

下面是假值列表,理论上说,除了以下内容以外的值都是true

console.log(Boolean(undefined));
console.log(Boolean(null));
console.log(Boolean(false));
console.log(Boolean(+0));
console.log(Boolean(-0));
console.log(Boolean(NaN));
console.log(Boolean(""));

这里有一点需要说明,规范里有提到,所有的对象都是true,所以这方面尤其需要注意的就是下面的例子了

console.log(Boolean(new Boolean(false)));  // true
console.log(Boolean(new String("")));  // true
console.log(Boolean(new Number(0)));  // true

返回的都是true,虽然他是对假值得封装,但是他们是对象,是对象就返回true,所以用假值对象或者其他看起来像价值的字符串来进行if判断是不靠谱的

var bObj = new Boolean(false);
var a = [];
var d = {};
var e = function() {}
var f = "false";
var g = "0";
var h = """";
if (a && d && e && f && g && h) {
  console.log("all right");  // all right
}

一般显式的吧数据转为布尔型,除了使用Boolean()以外,还可以使用!!符号,也就是连着反转两次

console.log(!!undefined);  // false
console.log(!!new Boolean(false));  // true



好了就到这里了,这一次因为东西比较零散,准备了一阵子,希望大家有所收获

参考书籍《你不知道的Javascript中卷》

本文转载自http://www.lht.ren/article/5/

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/100561.html

相关文章

  • Javascript基础-强制类型转换(三)

    摘要:抽象相等和严格相等。首先,也是如果有对象的话,会把对象转为基本类型值,在进行比较。 这一节,应该算是强制类型转换的最后一个小节了,这一部分呢,主要会讲比较操作中遇到的强制类型转换。 抽象相等(==)和严格相等(===)。 简单且粗略的来说,抽象相等和严格相等的区别就是抽象相等在比较的时候,如果比较的两个数类型不同,会先进行类型转换再比较,而严格类型呢,比较简单粗暴一些,直接返回fals...

    GeekGhc 评论0 收藏0
  • Javascript基础-强制类型转换(二)

    摘要:所以无论还是都会进行类型转换,唯一的区别,就是会置否而不会。这时候,肯定会有人问,假如说我有其他的数据类型呢,又不是数字又不是字符串,比如说数组啊,对象啊,布尔值啥的,那么如果是引用数据类型,则先转为基本数据类型,再进行比较。 上一章主要讲了转换到数字,字符串和布尔类型的一些知识点,那么这一讲接着上面的继续讲。 思考下面这个问题: console.log(+123); // 123 ...

    kk_miles 评论0 收藏0
  • JavaScript学习总结(基础部分

    摘要:前缀规范每个局部变量都需要有一个类型前缀,按照类型可以分为表示字符串。例如,表示以上未涉及到的其他对象,例如,表示全局变量,例如,是一种区分大小写的语言。布尔值与字符串相加将布尔值强制转换为字符串。 基本概念 javascript是一门解释型的语言,浏览器充当解释器。js执行时,在同一个作用域内是先解释再执行。解释的时候会编译function和var这两个关键词定义的变量,编译完成后从...

    AlanKeene 评论0 收藏0
  • JavaScript 需要检查变量类型

    摘要:一返回值调用外部方法获取的值需要对类型做判断,因为我们对方法返回的值是有期望值类型,但是却不能保证这个接口返回的值一直是同一个类型。 19年目标:消灭英语!我新开了一个公众号记录一个程序员学英语的历程 有提升英语诉求的小伙伴可以关注公众号:csenglish 程序员学英语,每天花10分钟交作业,跟我一起学英语吧 javascript作为一门动态类型语言,具有很高的动态灵活性,当定义函数...

    Songlcy 评论0 收藏0
  • 从hello world看JavaScript隐藏的黑魔法

    摘要:如果类型转换你还不是很了解,可以先读下这篇来理解一下从看隐式强制转换机制。函数可对通过编码的字符串进行解码。而作者封装的也是基于这两者来实现输出黑魔法字符串的。同时通过,返回了一个匿名函数形成了闭包。为了达到装逼的效果。 写在最前 事情的起因是这段看起来不像代码的代码: showImg(https://segmentfault.com/img/remote/14600000126810...

    cnio 评论0 收藏0

发表评论

0条评论

leon

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<