思考下面这个问题:
  
  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"
  
  1
  
  2
  
  3
  
  这个很明显可以看出,如果操作数是数字的话,或者说,操作数都是字符串的话,那么布尔值会先转为数字,再进行拼接操作,如果有一个操作数是字符串的话,那就不转啦,直接拼接。
  
  那么如果是对象类型,它是先转为基本数据类型,怎么转呢,其实就是先调用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([www.dasheng178.com].valueOf()); // [1]
  
  console.log([1] + [2]); // 12
  
  1
  
  2
  
  因为数组的valueOf的值依然为数组,所以他们转的时候,就会调用toString,所以就转成了字符串啦,俩字符串进行拼接,得到最终结果
  
  减法运算符(-)
  
  很显然,减法运算符就是做减法的,他很单纯,就只是做减法,但是呢,这个有一个知识点,就是,减法里的操作数,如果不是数字的话,那么会先转为数字类型的。
  
  console.log("123" - 0); // 123
  
  console.log([3] - [1]); // 2
  
  console.log({valueOf() { return 3}} - {valueOf() { return 2}}); // 1
  
  1
  
  2
  
  3
  
  这个很明显,第一个和第二个的结果都是转为了数字再进行运算的,那第三个呢,其实这个就是对象的转化方式,如果有valueOf的话,会先执行valueOf找出基本类型值,没有或者不是基本类型值就找toString,最后呢,吧基本类型值转为数字再进行减法运算 。
  
  好了,加法和减法都说完了,那么乘法和除法呢,其实和减法类似,都是转为数字这样的。
  
  console.log("123" * 0); // 0
  
  console.log([3] * [www.michenggw.com]); // 3
  
  console.log({valueOf() { return 3}} * {valueOf() { return 2}}); // 6
  
  1
  
  2
  
  3
  
  想看乘法和除法其他的细节和本文关系不是太大,所以就不细讲了,详情请查阅文档ecma文档:
  
  https://www.ecma-international.org/ecma-262/5.1/#sec-11.5.1
  
  https://www.ecma-international.org/ecma-262/5.1/#sec-11.5.2
  
  还有本节最后一部分,就是有关于逻辑与(&&)和逻辑或(||)
  
  为啥要特地介绍他俩呢,因为他俩的语法和其他语言的语法特性似乎有那么一些区别。来看代码
  
  var a = 42;
  
  var b = "abc";
  
  var c =www.ysyl157.com 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 (yongshiyule178.com) {
  
  console.log('exec');
  
  }
  
  true && exec(www.mhylpt.com/ ); // exec
  
  var a = undefined;
  
  var b = a || 10;
  
  console.log(b); // 10这个代表了应用的两个方面,&&可以做函数执行的前置判断,后面那个呢,可以做缺省时的默认值,你可以仔细观察一下,在一些压缩代码工具,压缩完后的代码,很多都把if 条件判断改成了&&,这次知道原因了吧。
  
  ---------------------

Javascript基础之-强制类型转换(二)的更多相关文章

  1. 谈 JavaScript 中的强制类型转换 (2. 应用篇)

    这一部分内容是承接上一篇的, 建议先阅读谈 JavaScript 中的强制类型转换 (1. 基础篇) 前两章讨论了基本数据类型和基本包装类型的关系, 以及两个在类型转换中十分重要的方法: valueO ...

  2. 详细理解javascript中的强制类型转换

    将值从一种类型转换为另一种类型通常称为类型转换,这是显式的情况:隐式的情况称为强制类型转换,JavaScript 中的强制类型转换总是返回标量基本类型值,如字符串.数字和布尔值. 如何理解: 类型转换 ...

  3. JS基础_强制类型转换-String

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. JS基础_强制类型转换

    强制类型转换 将一个数据类型强制转换为其他的数据类型 类型转换主要指,将其他数据类型,转换为 string.number.boolean 1.将其他数据类型转换为string(返回值是强转后类型的值) ...

  5. 谈 JavaScript 中的强制类型转换 (1. 基础篇)

    1. 从基本包装类型讲起 讨论基本包装类型的前提是了解基本数据类型(也可以称为原始类型, 简单数据类型等).然后通过基本数据类型调用方法的行为, 引出基本包装类型的概念和作用. 1.1 基本数据类型 ...

  6. JavaScript基础知识总结(二)

    JavaScript语法 二.数据类型 程序把这些量.值分为几大类,每一类分别叫什么名称,有什么特点,就叫数据类型. 1.字符串(string) 字符串由零个或多个字符构成,字符包括字母,数字,标点符 ...

  7. javascript基础学习(十二)

    javascript之BOM 学习要点: 屏幕对象 History对象 Location对象 一.屏幕对象 Screen对象是一个由javascript自动创建的对象,该对象的主要作用是描述客户端的显 ...

  8. JavaScript基础(语法类型转换、运算符、语句)

    1.类型转换: 分为自动转换和强制转换,一般用强制转换. 其他类型转换为整数:parseint(): 其他类型转换为小数:parsefloat(): 判断是否是一个合法的数字类型:isNaN(): 是 ...

  9. JavaScript基础入门教程(二)

    说明 前一篇博客介绍了js以及一些关于js基本类型的简单知识,本篇博客将详细介绍js的基础类型,捎带介绍对象类型,更详细的对象类型的说明将后续再讲. js中类型的说明 js中的类型分为基本类型和对象类 ...

随机推荐

  1. Linux怎样创建FTP服务器--修改用户默认目录-完美解决 - 费元星

    在创建FTP服务器之有先命令: ps -ef |grep vsftpd 查一下系统有没有安装vsftpd这个服务器,如果出现如下图所示的界面说明没有安装.   然后再执行:yum install vs ...

  2. 最新flowable研究学习及其汉化flowable6.3中文

    flowable 是activiti的分支,现在感觉比activiti要强大一些,官网是 https://flowable.org/ 下载最新的6.31版本. 放到tomcat下面,汉化需要对flow ...

  3. Qt-第一个QML程序-1-项目工程的建立

    这个小程序是我发的第一个完整的QMl程序,这个程序也会持续的更新,一步一步的完善起来,最后会有一个什么样的结果也是不知道,只是把自己目前掌握的QML相关的东西都慢慢的写进来,积累起来 先展示一下运行结 ...

  4. 怎样下载JDBC驱动

    MySQL官网: https://www.mysql.com/ 请注意: 需要把mysql-connector-java-5.1.45-bin.jar放到C:\JMeter\apache-jmeter ...

  5. 【WXS全局对象】JSON

    方法: 原型:JSON.stringify( Object ) 说明:将 object 对象转换为 JSON 字符串,并返回该字符串. 返回:[String] 原型:JSON.parse( [Stri ...

  6. lintcode671 循环单词

    循环单词   The words are same rotate words if rotate the word to the right by loop, and get another. Cou ...

  7. 227. Mock Hanoi Tower by Stacks【LintCode java】

    Description In the classic problem of Towers of Hanoi, you have 3 towers and N disks of different si ...

  8. JAVA基础学习之路(四)定义简单java类

    简单java类开发一般原则: 类名称必须有意义,再怎么说,要让人家看的明白吧 类之中所有属性必须使用private封装,并提供setter,getter方法 类之中可以有多个构造方法,但是必须保留有一 ...

  9. 孤荷凌寒自学python第八十天开始写Python的第一个爬虫10

    孤荷凌寒自学python第八十天开始写Python的第一个爬虫10 (完整学习过程屏幕记录视频地址在文末) 原计划今天应当可以解决读取所有页的目录并转而取出所有新闻的功能,不过由于学习时间不够,只是进 ...

  10. mysql中的select语句where条件group by ,having , order by,limit的顺序及用法

    -- 语法: SELECT select_list FROM table_name [ WHERE search_condition ] [ GROUP BY group_by_expression ...