摘要:所以无论还是都会进行类型转换,唯一的区别,就是会置否而不会。这时候,肯定会有人问,假如说我有其他的数据类型呢,又不是数字又不是字符串,比如说数组啊,对象啊,布尔值啥的,那么如果是引用数据类型,则先转为基本数据类型,再进行比较。
上一章主要讲了转换到数字,字符串和布尔类型的一些知识点,那么这一讲接着上面的继续讲。
思考下面这个问题:
console.log(+"123"); // 123 console.log(-"123"); // -123 console.log(+"abc"); // NaN console.log(-"abc"); // NaN
+这个很容易理解,就是把字符串转成了数字,而-这个呢,除了把字符串转为数字以外,还会吧这个数字加否。所以无论+还是-都会进行类型转换,唯一的区别,就是-会置否而+不会。
那么+除了当作一元运算符外,还有一个更广为人知的就是作为加法运算符。
那么加法运算符的话,实际上是有两种可能性的,一种是字符串的拼接,另一种就是做运算。接下来咱们就对这方面详细的讲解一下。
先说结论,如果在+的其中有一个操作数是字符串或者可以转为字符串的话,那么就进行字符串拼接。
反之,如果俩都是数字的话,则进行加法运算。
这时候,肯定会有人问,假如说我有其他的数据类型呢,又不是数字又不是字符串,比如说数组啊,对象啊,布尔值啥的,
那么如果是引用数据类型,则先转为基本数据类型,再进行比较。
如果是布尔呢,如果加法的另一边是数字的话,那么他就会转为数字,如果是字符串的话,就直接拼接啦.
上面说了一大堆的理论的东西,想必大家看着也累了。来上例子。
console.log(true + 11); // 12 console.log(true + false); // 1 console.log(true + "11"); // "true11"
这个很明显可以看出,如果操作数是数字的话,或者说,操作数都是字符串的话,那么布尔值会先转为数字,再进行拼接操作,如果有一个操作数是字符串的话,那就不转啦,直接拼接。
那么如果是对象类型,它是先转为基本数据类型,怎么转呢,其实就是先调用valueOf,如果valueOf不存在,或者返回的不是基本数据类型,就调用toString,如果toString也没有或者是返回的不是基本数据类型呢,那估计就直接报错了,看例子。
var obj = { valueOf() { return [2, 3]; }, toString() { return "sss"; } } var obj1 = { valueOf() { return 111; }, toString() { return "abc"; } } var obj2 = { valueOf() { return []; }, toString() { return { abc: "liuhaitao", } } } console.log(obj + 1); // "sss1" console.log(obj1 + 1); // 112 console.log(obj2 + 1); // "Cannot convert object to primitive value"
那么下面一个例子就很容易理解了。
console.log([1].valueOf()); // [1] console.log([1] + [2]); // 12
因为数组的valueOf的值依然为数组,所以他们转的时候,就会调用toString,所以就转成了字符串啦,俩字符串进行拼接,得到最终结果
减法运算符(-)
很显然,减法运算符就是做减法的,他很单纯,就只是做减法,但是呢,这个有一个知识点,就是,减法里的操作数,如果不是数字的话,那么会先转为数字类型的。
console.log("123" - 0); // 123 console.log([3] - [1]); // 2 console.log({valueOf() { return 3}} - {valueOf() { return 2}}); // 1
这个很明显,第一个和第二个的结果都是转为了数字再进行运算的,那第三个呢,其实这个就是对象的转化方式,如果有valueOf的话,会先执行valueOf找出基本类型值,没有或者不是基本类型值就找toString,最后呢,吧基本类型值转为数字再进行减法运算 。
好了,加法和减法都说完了,那么乘法和除法呢,其实和减法类似,都是转为数字这样的。
console.log("123" * 0); // 0 console.log([3] * [1]); // 3 console.log({valueOf() { return 3}} * {valueOf() { return 2}}); // 6
想看乘法和除法其他的细节和本文关系不是太大,所以就不细讲了,详情请查阅文档ecma文档:
https://www.ecma-internationa...
https://www.ecma-internationa...
还有本节最后一部分,就是有关于逻辑与(&&)和逻辑或(||)
为啥要特地介绍他俩呢,因为他俩的语法和其他语言的语法特性似乎有那么一些区别。来看代码
var a = 42; var b = "abc"; var c = null; console.log(a || b); // 42 console.log(a && b); // "abc" console.log(c || b); // "abc" console.log(c && b); // null
这一块可以看出,他和其他语言的不同之处在于,他的运算的结果,并不是true和false,而是具体的值,也就是说
||符号的时候,如果第一个操作数是true,则返回第一个操作数,如果是false返回第二个,
&&相反,如果第一个操作数是true,则返回第二个操作数,如果是false则返回第一个。
那这个有啥用呢?
其实可以利用这个的特性简化我们的代码,比如说
function exec () { console.log("exec"); } true && exec(); // exec var a = undefined; var b = a || 10; console.log(b); // 10
这个代表了应用的两个方面,&&可以做函数执行的前置判断,后面那个呢,可以做缺省时的默认值,你可以仔细观察一下,在一些压缩代码工具,压缩完后的代码,很多都把if 条件判断改成了&&,这次知道原因了吧。
参考书籍《你不知道的Javascript中卷》
参考文章:https://codeburst.io/javascri...
本文转载自http://www.lht.ren/article/6/
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/100583.html
摘要:一返回值调用外部方法获取的值需要对类型做判断,因为我们对方法返回的值是有期望值类型,但是却不能保证这个接口返回的值一直是同一个类型。 19年目标:消灭英语!我新开了一个公众号记录一个程序员学英语的历程 有提升英语诉求的小伙伴可以关注公众号:csenglish 程序员学英语,每天花10分钟交作业,跟我一起学英语吧 javascript作为一门动态类型语言,具有很高的动态灵活性,当定义函数...
摘要:抽象相等和严格相等。首先,也是如果有对象的话,会把对象转为基本类型值,在进行比较。 这一节,应该算是强制类型转换的最后一个小节了,这一部分呢,主要会讲比较操作中遇到的强制类型转换。 抽象相等(==)和严格相等(===)。 简单且粗略的来说,抽象相等和严格相等的区别就是抽象相等在比较的时候,如果比较的两个数类型不同,会先进行类型转换再比较,而严格类型呢,比较简单粗暴一些,直接返回fals...
摘要:转换为字符串规则如下图代码大致就是普通其他基本类型转为字符串的话,就直接转为其值的字符串表达形式,如果是基本类型的封装对象,会先拆封,然后再转为字符串,如果是普通对象,则会调用其内部的值,如果是极大数和级小数,将会进行一些转化,具体规 转换为字符串规则如下图代码: console.log(String(undefined)); // undefined console.log(Str...
摘要:前缀规范每个局部变量都需要有一个类型前缀,按照类型可以分为表示字符串。例如,表示以上未涉及到的其他对象,例如,表示全局变量,例如,是一种区分大小写的语言。布尔值与字符串相加将布尔值强制转换为字符串。 基本概念 javascript是一门解释型的语言,浏览器充当解释器。js执行时,在同一个作用域内是先解释再执行。解释的时候会编译function和var这两个关键词定义的变量,编译完成后从...
摘要:实际上,我们通常认为是自有类型的唯一成员。比较运算符的操作数可能是任意类型。结果只有,例得到操作值等价的布尔值真值为,假值为等同于,经常称为强制转换。结果返回布尔值的用法是中唯一一个不等于任何值的包括它自己。 说起 js 类型转换,都是头疼吧,晕晕的,但是不行啊,这东西很重要滴! 基础知识 JavaScript的数据类型分为六种,分别为null, undefined, boolean,...
阅读 2619·2023-04-26 02:17
阅读 1582·2021-11-24 09:39
阅读 1052·2021-11-18 13:13
阅读 2465·2021-09-02 15:11
阅读 2751·2019-08-30 15:48
阅读 3371·2019-08-30 14:00
阅读 2389·2019-08-29 13:43
阅读 639·2019-08-29 13:07