es6 入门代码整理

302 阅读2分钟

最近把阮一峰老师的es6入门看了一下,整理了里面的一点例子方便观看和复习

function bar(x = y, y = 2) {
    return [x, y];
};
bar() // 报错,暂时性死区
function () {            
    console.log(tmp);            
    if (false) {                
        var tmp = "hello world"            
    }        
};
f(); // undefined

function f() {            
    console.log("outside");        
}           
(function () {            
    if (false) {                
        function f() {                    
            console.log("inside")                
        }            
    }        
}());
//es5 inside
//es6 outside

const foo = Object.freeze({});
foo.prop = 123;// 不起作用

// 彻底冻结对象,包括属性
var constantize = function (obj) {
    Object.freeze(obj);
    Object.keys(obj).forEach( (key , value) => {
        if ( typeof obj[key] === "object") {
            constantize(obj[key]);
        }
    })
}

// constants.js模块
const A = 1;
const B = 2;

// text1.js模块
import * as constants from "./constants.js";
console.log(constants.A);
console.log(constants.B);

//text2.js模块
import {A , B} from "./constants.js";
console.log(A);
console.log(B);

var 声明的全局变量就是全局对象(window)的属性,node.js中,模块的全局变量必须显式的声明成global对象的属性。let、const、class声明的全局变量不属于全局对象的属性。 

变量的解构赋值

let [a, [b, [c]]] = [1, [2, [3]]];

结构不成功,变量等于undefined

注意,等号左边的值必须转换成对象后具有iterator接口,或者本身具有iterator接口

var [a, [b, [c]]] = [1, [2, [3]]];            
function* fibs() {                
    var a = 0;                
    var b = 1;                
    while (true) {                    
        yield a;                    
        [a, b] = [b, b + a];                
    }            
}            
var [one, two, three, four] = fibs();

fibs本身是一个generator函数,本身具有iterator接口。

对象的解构赋值

实际上,对象的解构赋值相当于这样,先找到同名属性,然后再将值赋值给对应的变量

let {foo: foo, baz: baz} = {foo: 123, baz: 234};

let baz
let {bar : baz} = {bar : 1}//报错,Duplicate declaration "baz"

var node = {
    loc: {
        start: {
            line: 1,
            column: 2
        }
    }
}
var {loc: {start: {line}}} = node;
这里loc和start都是模式不会被赋值

默认值

var {message : msg = "a msg"} = {};
var {x = 3} = {x : undefined};

var x;
({x} = {x: 1});//没有()的话,js会把{}解析成代码块,从而发生语法错误

数值和布尔值的赋值

先转换成对象

let {toString: s} = 123;
s === Number.prototype.toString;
let {toString: s} = true;
s === Boolean.prototype.toString;

null和undefined无法转换成对象,所以无法解构赋值

字符串的Unicode表示方法

6种字符串表示方法

'\z' === 'z';
'\172' === 'z';
'\x7A' === 'z';
'\u007A' === 'z';
'{\u007A}' === 'z';

codePointAt()

var s = "我是";
s.charCodeAt();
s.codePointAt();

都是转换成码点,但是第二个方法能识别四字节的字符,其参数是该字符在字符串的位置,还是建议使用for...of循环

function is32bit(a) {
    return a.codePiontAt() > 0xFFFF;
}
判断四字节最简方法