安装babel-cli、babel-preset-envvue
根目录下配置.babelrcwebpack
{
"presets": ["env"]
}
复制代码
转换web
babel xx.js -o xx.js
复制代码
固然咱们也能够借助webpack、gulp来实现转换json
let关键字提供了除var之外另外一种变量声明方式,能够将变量绑定到所在的任意做用域中(一般是{...}内部),换句话说,let为其声明的变量隐式地劫持了所在的块级做用域。gulp
{
let bar = 2
}
console.log(bar) //ReferenceError
复制代码
let进行的声明不会在做用域中进行提高数组
{
console.log(bar) //ReferenceError
let bar = 2
}
复制代码
let不容许重复命名promise
let bar = 2
let bar = 3 // error
复制代码
let循环babel
for (let i=0; i<3; i++) {
console.log(i)
}
console.log(i) // ReferenceError
/*let不只将i绑定到for循环块中,并从新绑定到循环的每一迭代中,确保上一个循环迭代结束时的值从新赋值*/
复制代码
const 一样能够建立块级做用域,可是以后任何试图修改的操做都会报错数据结构
const bar = 2
bar = 4 // ReferenceError
复制代码
数组:元素按次序排列,变量取值由位置决定函数
let [a, b, c] = [1, 2, 3] // a-1, b-2, c-3
let [a, ...b] = [1, 2, 3] // a-1, b-[2, 3]
复制代码
对象:变量名必须和属性名相同
let {foo, bar} = {foo: 1, bar: 2} // foo-1, bar-2
复制代码
字符串
const [a, b, c, d, e] = 'devin' // a-d, b-e, c-v, d-i, e-n
let {length: len} = 'devin' // len-5 length属性
复制代码
函数
function foo([x, y]) { do sth }
foo([1, 2])
复制代码
扩展运算符
let arr1 = [1, 2, 3]
let arr2 = [...arr1]
console.log(arr2) // [1, 2, 3]
let {x, y, ...z} = {x: 1, y: 2, a: 3, b: 4} // x-1, y-2, z-{a: 3, b: 4}
复制代码
rest运算符
function foo (...arg) {
console.log(arg.length)
}
foo(1, 2, 3) // 3
复制代码
模版字符串
const name = 'welllee'
console.log(`hello ${name}, how r u ?`) // hello welllee, how r u ?
复制代码
字符串遍历
const name = 'welllee'
for (let item of name) {console.log(item)} // w e l l l e e
// 补充for...of
1.区别于forEach(),能够正确响应return, break, continue
2.遍历map, set对象(需解构)
for (let [key, value] of xxx) {console.log(key, value)}
3.不支持普通对象(使用Object.keys())
for (let key of Object.keys(xxx)) {
console.log(key, xxx[key])
}
复制代码
at
'welllee'.at(1) // e 相似charAt()
复制代码
includes 查找字符串
'welllee'.includes('w') // true 相似indexOf()
复制代码
startsWith & endsWith 开头&结尾是否存在xxx
'welllee'.startsWith('w') // true
'welllee'.endsWith('e') // true
复制代码
repeat 复制字符串
'welllee'.repeat(2) // wellleewellee
复制代码
Number.isFinite() 数字验证
Number.isNaN() NaN验证
Number.parseInt() 整型转换
Number.parseFloat() 浮点型转换
Number.isInteger() 数值是否为整数
Math.trunc() 去除小数部分,返回整数部分
Math.sign() 判断一个数是整数,负数,仍是0。正数返回+1,负数返回-1,0返回0, -0返回-0,其余返回NaN
Array.from() 将伪数组转为数组
还能够用[].slice.call()
复制代码
Array.of() 将一组值专为数组
Array.of(1, 2, 3) // [1, 2, 3]
复制代码
find() 找出数组中的成员
[1, 2, 3].find((value, index, array) => {
return value > 1
}) // 2
找到后就return,中止查找
复制代码
fill(value, start, end) 使用给定值填充数组
[1, 2, 3].fill('a', 1, 2) // [1, 'a', 3]
复制代码
entries()键值对遍历、keys()键名遍历、 values()键值遍历
for (let [index, elem] of ['a', 'b'].entries()) {
console.log(index, elem) // 0 'a', 1 'b'
}
for (let index of ['a', 'b'].keys()) {
console.log(index) // 0, 1
}
for (let elem of ['a', 'b'].values()) {
console.log(elem) // 'a', 'b'
}
复制代码
数组的空位
forEach(), filter(), every() 和some()都会跳过空位
map()会跳过空位,但会保留这个值
join()和toString()会将空位视为undefined,而undefined和null会被处理成空字符串
复制代码
默认参数
function foo (a, b = 1) {
return a + b
}
foo(1) // 2
复制代码
扩展运算符和rest运算符(上文已说起)
主动抛出错误
{
throw new Error('出错啦~')
}
复制代码
严格模式
'use strict'
在严格模式下使用默认参数会报错
复制代码
获取须要传递参数的个数
function foo (a, b) {do sth}
foo.length // 2
复制代码
箭头函数
const foo = (a, b) => a + b
foo (1, 2) // 3
(1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。
(2)不能够看成构造函数,也就是说,不可使用new命令,不然会抛出一个错误。
(3)不可使用arguments对象,该对象在函数体内不存在。若是要用,能够用Rest参数代替。
(4)不可使用yield命令,所以箭头函数不能用做Generator函数。
复制代码
Object.is(val1, val2) 比较两个值是否相等
let a = {xx: 1}
let b = {xx: 1}
console.log(Object.is(a.xx, b.xx)) // true
复制代码
Object.assign() 对象的合并,实行的是浅拷贝
let a = {xx: 1}
let b = Object.assign({}, a)
console.log(b) // {xx: 1}
复制代码
Object.keys() object.values() object.entries()
参考上文数组的遍历
复制代码
set相似于数组,可是成员的值都是惟一的,能够用来数组去重,set自己是一个构造函数,用来生产set数据结构。
数组去重复
const item =new Set([1,2,3,3])
console.log([...item]) // [1,2,3]
复制代码
set属性:
Set.prototype.constructor
Set.prototype.size
复制代码
set方法:
add() delete() has() clear()
复制代码
遍历:
keys() values() entries()
复制代码
map相似于对象,也是键值对的集合,可是“键”的范围不限于字符串,各类类型的值(包括对象)均可以看成键。
可使用扩展运算符(...)将Map转换为数组,反过来,将数组传入 Map 构造函数,就能够转为 Map了。
map方法:
set(key,value)
get(key)
delete(key)
has(key)
clear()
复制代码
遍历:
keys() values() entries() forEach()
复制代码
1.symbol能够用symbol函数生成,能够做为对象的属性名使用,保证不会与其余属性重名
let a = Symbol()
let b = Symbol()
let obj = {
[a] : 'no 1'
}
obj[b] = 'no 2'
复制代码
2.symbol函数能够接受一个字符串做为参数
let s = Symbol('a')
let q = Symbol('a')
console.log(s === q) // false
复制代码
3.symbol值不能与其余类型的值进行运算,可是能够转为bool值
4.symbol做为属性名,不会被for-in,for-of遍历获得,不会被 object.keys(),json.stringify() object.getOwnPropertyNames()返回,可是能够经过object.getOwnPropertySymbols()方法获取对象的全部symbol 属性名
class People {
constructor (name) { //构造函数
this.name = name
}
say () { //方法
console.log('xxx')
}
}
继承
class Student extends People {
constructor () {
}
}
复制代码
一个容器,保存着将来才会结束的事件
promise构造函数接受一个函数做为参数,该函数的两个参数(resolve,reject)也是函数
resolve 将promise对象状态从未完成到成功,reject将promise对象状态从未完成到失败
function test (val) {
return new Promise(function (resolve, reject) {
if (条件) {
resolve(结果)
} else {
reject(错误)
}
})
}
test('xxx').then(res => {
//
})
复制代码
由function*来定义,除了return 语句,还能够用yield返回屡次
直接调用generator仅仅是建立了一个generator对象,并无去执行它
执行它有2个方法:
不断的调用next(),每次遇到yield就返回一个对象{value:,done:true/false},当done的值是true就是返回return的值
for....of循环迭代generator对象的方法
function* fib(max) {
var t, a=0, b=1, n=1;
while (n < max) {
yield a;
t = a +b;
a = b;
b =t;
n ++;
}
return a;
}
for (let x of fib(5)) {
console.log(x) // 0, 1, 1, 2, 3
}
复制代码
var target = {
name: 'xxx'
};
var handler = {
get: function(target, key) {
console.log(`${key} 被读取`);
return target[key];
},
set: function(target, key, value) {
console.log(`${key} 被设置为 ${value}`);
target[key] = value;
}
}
var aaa = new Proxy(target, handler)
aaa.name // name被读取 'xxx'
aaa.name = 'welllee' // name被设置为welllee 'welllee'
补充:vuejs 数据双向绑定原理
复制代码
变量必须声明后再使用
函数的参数不能有同名属性,不然报错
不能使用with语句
不能对只读属性赋值,不然报错
不能使用前缀0表示八进制数,不然报错
不能删除不可删除的属性,不然报错
不能删除变量delete prop,会报错,只能删除属性delete global[prop]
eval不会在它的外层做用域引入变量
eval和arguments不能被从新赋值
arguments不会自动反映函数参数的变化
不能使用arguments.callee
不能使用arguments.caller
禁止this指向全局对象
不能使用fn.caller和fn.arguments获取函数调用的堆栈
增长了保留字(好比protected、static和interface)