xiecg ’s bolg

你不知道的 JavaScript 中卷笔记

1:类型

内置类型:null, undefined, boolean, number,string, object, 还有 es6 的 symbol

变量是没有类型的,变量的值才有类型。

2:值

函数传参是按值传递还是引用传递 ?

基本类型是按值传递的,object 是按共享传递的。

扩展阅读:js-call-by-sharing

基本类型定义了几个特殊的值:

null 类型只有一个值是 nullundefined 类型也只有一个值是 undefined

数字类型也有几个特殊的值:包含 NaN+Infinity-Infinity-0

扩展阅读:Equality_comparisons_and_sameness

3: 原生函数

JavaScript 中的基本数据类型提供了封装对象,称为原生函数( String, Object, Number 等)。

对于基本类型值,比如 var text = 'text'; 要访问 textlength 方法,引擎会自动对这些值进行封装,就是对应的封装对象来包装他。

4:强制类型转换

将值从一种类型转换为另一种类型通常称为类型转换(type casting),这是显式的情况; 隐式的情况称为强制类型转换(coercion)

也可以这样来区分: 类型转换发生在静态类型语言的编译阶段,而强制类型转换则发生在动态类型语言的运行时(runtime)

4-1: ~ 运算符
1
~42; // -(42+1) ==> 43

-(x+1)x 如果为 -1 时,~ 和一些数字值在一起就会返回假值 0, 其他情况都是返回 真值

-1 是一个 “哨位值”,-1 表示失败,大于等于 0 表示成功。

indexOf 遵循这一惯例:

1
2
3
4
5
var a = 'Hello World';
if ( a.indexOf( 'lo' ) >= 0 ) { ... } // true, 找到匹配
if ( a.indexOf( 'lo' ) != -1 ) { ... } // true, 找到匹配
if ( a.indexOf( 'lo' ) < 0 ) { ... } // true, 没有找到匹配
if ( a.indexOf( 'lo' ) == -1 ) { ... } // true,没有找到匹配

如果换成 ~ 运算符会更简洁:

1
2
3
4
5
var a = 'Hello World';
console.log( ~a.indexOf( 'lo' ) ); // -4, 真值
if ( ~a.indexOf('lo') ) { ... } // true, 找到匹配
console.log( ~a.indexOf('ol') ); // 0, 假值
if ( !~a.indexOf('ol') ) { ... }; // true, 没有找到匹配

字位截取:

1
2
Math.floor( -49.6 ); // -50
~~-49.6; // -49

5:语法

5-1 : 语句和表达式

每一个语句都有一个返回值,哪怕是undefined 这样的。

代码块是没有返回值的,但是利用 eval 却可以。

1
2
var a, b;
a = eval( "if (true) { b = 4 + 38; }" );

ES7 规范中有个 do 表达式 的提案:

1
2
3
4
5
6
7
var a, b;
a = do {
if (true) {
b = 4 + 38;
}
};
a; // 42

还有一个坑经常提到:

1
2
[] + {}; // "[object Object]"
{} + []; // 0

第一行代码 {} 出现在 + 运算符中,会出现类型转换,[] => ''{} => '[object Object]'
第二行代码 {}会被当成一个空的代码块执行,所以只是 +[],根据类型换换会返回 0

6:回调

回调函数是 JavaScript 异步的基本单元。但是随着 JavaScript 越来越成熟,对于异步编程领域的发展,回调已经不够用了。

第一,大脑对于事情的计划方式是线性的、阻塞的、单线程的语义,但是回调表达异步流 程的方式是非线性的、非顺序的,这使得正确推导这样的代码难度很大。难于理解的代码 是坏代码,会导致坏 bug。

我们需要一种更同步、更顺序、更阻塞的的方式来表达异步,就像我们的大脑一样。

####7:Promise

我们确定了通过回调函数表达程序异步和管理并发的两个主要缺陷:缺乏顺序性可信任性

我们不把自己程序的 continuation 传给第三方,而是希望第三方给我们提供了解其任务何时结束的能力,然后由 我们自己的代码来决定下一步做什么。这种范式就称为 Promise