ECMAScript 6入门常用语法及知识总结
一,语言特性,es6新增加的特性
ES6增加了let和const声明,以及箭头函数,ES6规定暂时性死区和修订变量提,块级作用域,ES5只有全局作用域和函数作用域
javascript最大特点异步回调,闭包函数,动态绑定
二,语言特性,作用域变化
ES5规定,函数只能在顶层作用域和函数作用域之中声明,不能在块级作用域声明
ES6引入了块级作用域,明确允许在块级作用域之中声明函数。块级作用域之外不可引用
if (true) {function f() {}} // 非法,浏览器提前支持都能运行,不会报错
try {function f() {} } catch(e) { }// 非法,浏览器提前支持都能运行,不会报错
考虑到环境差异太大,避免在块级作用域内声明函数,应该写成函数表达式,而不是函数声明语句。
// 函数声明语句 {let a = 'secret';function f() {return a;}}
// 函数值表达式 {let a = 'secret';let f = function () {return a;};}
三,ES6新增了 let 命令,用来声明变量。它的用法类似于 var ,但是所声明的变量,只在 let 命令所在的代码块内有效
let 不像 var 那样会发生“变量提升”现象。所以,变量一定要在声明后使用,否则报错。
四,const命令 const 声明一个只读的常量。一旦声明,常量的值就不能改变。
const 的作用域与 let 命令相同:只在声明所在的块级作用域内有效。同样存在暂时性死区。
复合类型的变量,变量名不指向数据,而是指向数据所在的地址。只是保证指向的地址不变,不保证数据。
const foo = {};foo.prop = 123;foo.prop// 123 foo = {}; // TypeError: "foo" is read-only
如果真的想将对象冻结,应该使用 Object.freeze 方法。 const foo = Object.freeze({});
// 常规模式时,下面一行不起作用;// 严格模式时,该行会报错 foo.prop = 123;
五,其他语法特性
对象的解构赋值,字符串的解构赋值,数值和布尔值的解构赋值,函数参数的解构赋值,圆括号问题。
不能使用圆括号的情况,可以使用圆括号的情况(赋值语句的非模式部分)模式指解构剥离预见圆括号
Promise yield async await
六,语法误区代码示例
input.map(item => item + 1); es6->es5 Babel/Traceur input.map(function (item) {return item + 1;}); {let a = 10;var b = 1;} b // 1 ; a // ReferenceError: a is not defined. for (let i = 0; i < arr.length; i++) {} console.log(i);//ReferenceError: i is not defined var a = []; for (var i = 0; i < 10; i++) { a[i] = function () {console.log(i);};} a[6](); // 10 var a = []; for (let i = 0; i < 10; i++) { a[i] = function () {console.log(i);};} a[6](); // 6 var tmp = 123; if (true) { tmp = 'abc'; // ReferenceError let tmp; } //TDZ(temporal dead zone) typeof x; // ReferenceError let x; typeof undeclared_variable // "undefined" function bar(x = y, y = 2) {return [x, y];}bar(); // error function bar(x = 2, y = x) {return [x, y];}bar(); // [2, 2] function func(arg) { let arg; // error } function func(arg) { { let arg; // right } } {{{let insane = 'Hello World'; {{let insane = 'Hello World';} console.log(insane); // error } }}}; 'use strict';if (true) {function f() {} } // right function f() { console.log('I am outside!'); } (function () {f();}()); //I am outside! Vue.component('edit-component', { data: function() { return { message: '' }; }, methods: { send: function() { that = this; axios.post('/', $.param({ md: this.message })).then(function(response) { that.message = response.data.replace(/(^\s*)|(\s*$)/g, '');}); } } } Date.prototype.Format = function(fmt) {} // run bind function
箭头函数总结:
1,箭头前面的是入参,不是一个参数参数需要用括号,推荐始终使用括号
2,箭头后面函数体一条语句可以省略大括号及分号,推荐单条语句可省略
3,箭头函数返回值取决函数体的return语句,匿名调用(箭头函数)(入参)
4,箭头函数作为普通入参,入参先传箭头入参,返回值传入普通函数参数
5,this在箭头函数中按照词法作用域绑定,返回对象x => ({ foo: x })
var funcWithThreeParam = (a, b, c) => { console.log(''); }
var funcWithThreeParam = (a,b) => { console.log(''); }
var funcWithThreeParam = (a) => { console.log(''); }
var funcWithThreeParam = () => { console.log(''); }
var funcWithThreeParam = a => { console.log(''); }
funcWithThreeParam(); // below call like ( fn )(a);
a => { console.log(''); }
a => console.log('')
() => console.log('')
(a) => console.log('')
(a,b) => console.log('')
JS数组和字典,JS 的数组Array,既是一个数组,也是一个字典(Dictionary)
var a = new Array(); a[0] = "Acer"; a[1] = "Dell";
var a = new Array(); a["Acer"] = 5; a["Dell"] = 6;
for (var i in a) { console.log(i + " : " + a[i]) };
Array .pop() .push() .sort() .reverse() a[num/key] a.key
123.toString(); // SyntaxError 123..toString(); // '123', (123).toString(); // '123'
typeof Number('123'); // 'number' typeof new Number(123); // 'object'
JSON.stringify(dic), JSON.parse(str)
不要使用new Number()、new Boolean()、new String()创建包装对象;
.用parseInt()或parseFloat()来转换任意类型到number;
.用String()来转换任意类型到string,或者直接调用某个对象的toString()方法;
.通常不必把任意类型转换为boolean再判断,因为可以直接写if (myVar) {...};
.typeof操作符可以判断出number、boolean、string、function和undefined;
.判断Array要使用Array.isArray(arr);
.判断null请使用myVar === null;
.判断某个全局变量是否存在用typeof window.myVar === 'undefined';
.函数内部判断某个变量是否存在用typeof myVar === 'undefined'。
结尾彩蛋,相关java面试问题,虽然很傻的问题,但就是考验你是否常用。
java: String length() & ArrayList lenght
java:try finally all have return will run finally