arguments
function函数自带一个关键字arguments,只在函数内部起作用,永远指向当前函数的调用者传入的所有参数,用法类似于数组。
函数不定义任何参数,还是可以拿到参数的个数和值
function foo(x) {
console.log('x = ' + x); // 10
for (var i=0; i<arguments.length; i++) {//参数个数
console.log('arg ' + i + ' = ' + arguments[i]); // 10, 20, 30
}
}
foo(10, 20, 30);
rest参数
function foo(a, b, …rest),rest参数写在最后,前面有…,将参数以数组的形式存储。与数组的使用方法一致。
变量作用域
- 函数体内部声明的变量函数体外不可以使用。
- 函数体内部声明的变量与其他函数声明的变量互相独立,互不干扰。
- 函数嵌套时,内部函数可以调用外部函数的变量,外部不可以访问内部。
- JavaScript的函数在查找变量时从自身函数定义开始,从“内”向“外”查找。如果内部函数定义了与外部函数重名的变量,则内部函数的变量将“屏蔽”外部函数的变量。
- 函数会将所有变量的声明提升到顶部,但不会提升变量的赋值。
全局作用域
JavaScript默认的全局对象是window
顶层函数的定义和全局作用域的变量都是window的属性。
把自己的所有变量和函数全部绑定到一个全局变量中,减少在不同js文件中的命名冲突。
局部变量
let替代var可以申明一个块级作用域的变量,比如在for循环中。
ES6标准引入了新的关键字const来定义常量,const与let都具有块级作用域。
解构赋值
数组解构赋值
//x = hello, y = JavaScript, z = ES6
var [x, y, z] = ['hello', 'JavaScript', 'ES6'];
//有层次嵌套的赋值,嵌套层次和位置要保持一致
let [x, [y, z]] = ['hello', ['JavaScript', 'ES6']];
//忽略某些值进行赋值
let [, , z] = ['hello', 'JavaScript', 'ES6'];
对象解构赋值
var person = {
name: '小明',
age: 20,
gender: 'male',
passport: 'G-12345678',
school: 'No.4 middle school'
address: {
city: 'Beijing',
street: 'No.1 Road',
zipcode: '100001'
}
};
var {name, age, passport} = person;
//保证嵌套层次一致,对应的属性不存在,变量将被赋值为undefined
//passport:id语法是将变量id获得passport属性
var {name,passport:id, address: {city, zip}} = person;