简介

2017-02-24  本文已影响5人  lesliefang

console 中输入多行代码, shift + enter

only values has type in JS 只有值有类型,变量是没有类型的

typeof null === 'object' 历史遗留 bug

JS 数据类型

string
number
boolean
null and undefined
object
symbol (new to ES6)

Array 和 Function 其实也是 object,它们是 object 的子类型

转型

== 允许自动转型的情况下进行比较 checks for value equality with coercion allowed
=== 不允许自动转型的情况下进行比较 checks for value equality without allowing coercion

var a = 42;
var b = "foo";
a < b;      // false
a > b;      // false
a == b;     // false

如果两边有一个不是 string 或两边都不是 string, 两个值都会强转为 number 后再比较
b 转为 number 后是 NaN

Hosting 变量和函数提升
var a = 2;

foo();                  // works because `foo()`
                        // declaration is "hoisted"
function foo() {
    a = 3;

    console.log( a );   // 3

    var a;              // declaration is "hoisted"
                        // to the top of `foo()`
}
console.log( a );   // 2

Wherever a var appears inside a scope, that declaration is taken to belong to the entire scope and accessible everywhere throughout.

Strict Mode 应该始终开启
function foo() {
    "use strict";   // turn on strict mode
    a = 1;          // `var` missing, ReferenceError
}

foo();
在低版本的浏览器中使用高版本的特性2种方式
1. Polyfilling (垫片)

将高版本的特性在低版本中再实现一遍,如 ES6 中新添加了 Number.isNaN() 方法, 我们可以写一个像下面的垫片

if (!Number.isNaN) {
    Number.isNaN = function isNaN(x) {
        return x !== x;
    };
}

这样在所有浏览器中都可以使用 Number.isNaN 方法了。 一部分特性是可以通过 Polyfilling 实现的。

2. Transpiling

ES6、ES7 中新的语法无法通过 Polyfilling 部署到低版本中,这时可以通过第三方工具将 ES7、ES6 编译成 ES5 后再发布。
一般通过 Babel 或 Traceur 编译
Babel (https://babeljs.io) (formerly 6to5): Transpiles ES6+ into ES5
Traceur (https://github.com/google/traceur-compiler): Transpiles ES6, ES7, and beyond into ES5

对于 web 前端用 ES6、ES7 开发,打包时用 babel 编译回 ES5 是目前通用的做法。

新版的 Node.js 对 ES6 的支持达到了 99%, 所以 Node 是可以直接用 ES6 开发的。

上一篇下一篇

猜你喜欢

热点阅读