类型转换;Symbol的强制类型转换易出错;假值对象;标签语句。

书摘&心得

1、类型与变量

  • 万物皆对象(简单标量基本类型除外)
    • 数组也是对象,也能有属性
    • 函数是对象,能有属性
      • 函数的长度是声明的参数个数
  • js变量没有类型,只是个容器,值才有
    • js类型隐式转换的根本原因
    • undefined和not defined是两回事,有没有容器是重点
    • undefined代表容器从没赋值过,null代表容器曾经有值但现在没有
  • NaN是数字类型,与自己不相等

    2、值与引用

  • js中引用始终指向值

  • 一切由值决定【中卷30】

    • 基本类型的值会在变量中传递时发生复制
    • 引用类型的值在变量中传递时不发生复制

      3、原生函数

  • 原生函数创建基本类型的封装对象,是二次封装【中卷34】

  • 让js决定何时使用封装对象
  • .valueOf可拆封封装对象【中36】
  • Symble不是对象,是简单标量基本类型【中43】
  • Function Array RegExp的原型对象是默认值,原型对象只创建一次,可以优化性能【45】

    4、强制类型转换

  • 类型转换发生在编译阶段,强制类型转换发生在runtime

  • 强制类型转换的返回值总是标量基本类型
  • JSON.stringify()
    • 不是强制类型转换,但涉及ToString强制类型转换
    • toJSON返回的是可被JSON.stringify安全转换的JSON值,而不是JSON字符串【50】
      • 合理应用可以避免try catch
  • 对象的强制类型转换都是true,除了假值对象
    • 假值对象≠封装了假值的对象
      • 封装了假值的对象:new Boolean(false)
    • 假值对象:外来值,比如document.all
  • 非操作符~的用法(避免抽象渗漏)【61】
    • ~和indexOf连用可以将结果强制类型转换
    • 个人想法:其实无所谓,过度使用这些技巧可能反而造成代码可读性下降。
  • 解析字符串允许字符串中存在非数字,而转换不行
  • 奇妙的结果
    • pareseInt(1/0, 19) === 18【64】
    • pareseInt先将收到的第一个值转换为字符型
  • 符号Symble的强制类型转换要小心【77】
    • 不能被强制转换为数字,但是能被强制转换为布尔值。
    • image.png
  • 宽松相等允许在比较时发生强制类型转换,而严格相等不允许

    5、语法

  • 语句statement和表达式expression的区别

    • 表达式expression与运算符组成了语句statement
    • 语句statement都有一个结果值【93】
    • 表达式可能有副作用?(a++、=、delete)
      • 我们经常用的aa && aa();
  • javaScript的标签语句可以给语句打个标签【101】
    • image.png
    • JSON不会被认为是标签因为标签不可带双引号
      • JSON-P能将JSON转换为合法的javaScript
    • break在循环外也可以配合标签使用
    • forEach无法通过break tag跳出,报syntaxerror。
  • 在ES6之前,获取函数所有参数得通过arguments数组,ES6可以用剩余参数
  • 在函数中省略return、return;、return undefined效果相同
  • finally会复写try和catch的return值

    附录

  • 不要拓展原生原型【126】

    • 出了奇怪的bug第一个想法是Hack问题