你不知道的 JavaScript 中卷笔记
1:类型
内置类型:null
, undefined
, boolean
, number
,string
, object
, 还有 es6 的 symbol
。
变量是没有类型的,变量的值才有类型。
2:值
函数传参是按值传递还是引用传递 ?
基本类型是按值传递的,object
是按共享传递的。
扩展阅读:js-call-by-sharing
基本类型定义了几个特殊的值:
null
类型只有一个值是 null
,undefined
类型也只有一个值是 undefined
数字类型也有几个特殊的值:包含 NaN
,+Infinity
,-Infinity
,-0
。
扩展阅读:Equality_comparisons_and_sameness
3: 原生函数
JavaScript 中的基本数据类型提供了封装对象,称为原生函数( String
, Object
, Number
等)。
对于基本类型值,比如 var text = 'text';
要访问 text
的 length
方法,引擎会自动对这些值进行封装,就是对应的封装对象
来包装他。
4:强制类型转换
将值从一种类型转换为另一种类型通常称为类型转换(type casting)
,这是显式的情况; 隐式的情况称为强制类型转换(coercion)
。
也可以这样来区分: 类型转换
发生在静态类型语言的编译阶段
,而强制类型转换
则发生在动态类型语言的运行时(runtime)
。
4-1: ~ 运算符
|
|
在 -(x+1)
中 x
如果为 -1
时,~ 和一些数字值在一起就会返回假值 0
, 其他情况都是返回 真值
。
-1
是一个 “哨位值”,-1
表示失败,大于等于 0
表示成功。
indexOf
遵循这一惯例:
|
|
如果换成 ~
运算符会更简洁:
|
|
字位截取:
|
|
5:语法
5-1 : 语句和表达式
每一个语句都有一个返回值,哪怕是undefined
这样的。
代码块是没有返回值的,但是利用 eval
却可以。
|
|
ES7 规范中有个 do 表达式
的提案:
|
|
还有一个坑经常提到:
第一行代码 {}
出现在 +
运算符中,会出现类型转换,[] => ''
,{} => '[object Object]'
。
第二行代码 {}
会被当成一个空的代码块执行,所以只是 +[]
,根据类型换换会返回 0
。
6:回调
回调函数是 JavaScript 异步的基本单元。但是随着 JavaScript 越来越成熟,对于异步编程领域的发展,回调已经不够用了。
第一,大脑对于事情的计划方式是线性的、阻塞的、单线程的语义,但是回调表达异步流 程的方式是非线性的、非顺序的,这使得正确推导这样的代码难度很大。难于理解的代码 是坏代码,会导致坏 bug。
我们需要一种更同步、更顺序、更阻塞的的方式来表达异步,就像我们的大脑一样。
####7:Promise
我们确定了通过回调函数
表达程序异步和管理并发的两个主要缺陷:缺乏顺序性
和可信任性
。
我们不把自己程序的 continuation
传给第三方,而是希望第三方给我们提供了解其任务何时结束的能力,然后由 我们自己的代码来决定下一步做什么。这种范式就称为 Promise
。