赞
踩
for of
循环es5
专门用来遍历对象和数组的 for in
循环
遍历对象
// 遍历对象
var obj = {
name:'huasheng',
age:28,
}
for(var key in obj){//用for in循环遍历obj这个对象
console.log(key,obj[key]);
}
key
是obj
的属性名,这些属性名原本是字符串类型的key[obj]
获取的是key
的属性值
遍历数组
//遍历数组
var arr = [1,2,3,4];
for(var key in arr){
console.log(key,arr[key]);//for in循环也可以遍历数组
}
key
原数组对应的索引位置是字符串类型的arr[key]
获取的是数组的值
es6
中专门用来遍历数组的 for of
循环
通过for of
获取数组成员
let arr = [3,4,5,6];
for(var value of arr){
console.log(value,typeof value);
}
value
是数组成员项(值),对应数组成员的值arr
你用来存储的变量,他变量里面对应的值是数组里面的成员(值),数组成员是什么就是什么arr
是你需要遍历到的数组(存储库)
通过for of
循环 获取数组成员的索引位置
let arr = [3,4,5,6];
for(var index of arr.keys()){
console.log(index);//遍历每一圈都用index值存储着对应的索引位置
}
console.log(arr.keys())
;//他是一个迭代器是一个对象(keys
函数执行结果是一个迭代器)
如果你用for of
循环遍历数组中的索引位置,就是通过arr.keys
你遍历这个数组的迭代器
通过for of
循环 获取数组成员的索引位置和对应的值
let arr = [3,'包',5,6];
for(var detail of arr.entries()){
//现在通过for of循环来遍历 arr.entries这个函数执行生成的迭代器
console.log(detail);//这样的遍历方式就可以得到索引项加上数组成员
}
console.log(arr.entries());
他是一个迭代器是一个对象(entries
函数执行结果是一个迭代器)
通过for of
循环如何同时得到对应的索引和值
let arr = [3,'包',5,6];
for(var [index,value] of arr.entries()){
console.log(index,value);
}
通过for of
循环来遍历到arr.entries
这个迭代器的时候他会把数据存放在一个数组中,这种写法本质上是一个结构赋值,for of
循环遍历到迭代器的时候把得到数据放在一个变量中,通过结构赋值来拆解变量中的数组
函数的参数
在es5
中传递实参和形参的时候是一一对应的:如下
function auto(a){//形参
console.log(a)
}
auto(2);//实参
在es6
传递参数的时候可以通过结构赋值的方式传递参数
es6
通过结构赋值的方来给数组赋值(来拆解数组)
function auto([a,b,c]){//形参
console.log(a,b,c);
}
auto([1,2,3])//实参
这个本质上就是结构赋值(拆解数组的结构 a=1 b=2 c=3
) 在es6
中可以用结构赋值的方式来传递参数
用结构赋值传递参数的好处:就是来拆解数组和对象的时候显得很方便
es5
通过传递参数方式来给拆解数组
function auto(arr){
var a = arr[0];
var b = arr[1];
var c = arr[2];
console.log(a,b,c);
}
auto([1,2,3]);
在es5中通过取下标的方式来拆解数组是很麻烦的,增加了代码的重复量和变量声明的次数(弊端)
那么如何拆解对象来给函数传参数
function auto({name,age}){
console.log(name,age)
}
auto({name:'huasheng',age:28})
实参和形参都以匹配模式的形式来匹配这个对象的形参name
和age
查询实参name
和age
对象匹配成功声明name
和age
属性值是huasheng
和28
那么如何拆解字符串来给函数传参数
function auto([a,b,...c]){
//字符串的结构赋值本质和数组的结构赋值是一致的
//...c声明了c要把后面的所有数据全部收集起来并以数组的形式展示
console.log(a,b,c)// a=h b=u c=["a", "s", "h", "e", "n", "g"]
}
auto('huasheng')
在函数传递参数的时候,传递的是一个字符串实参是用这种匹配模式来写的(结构赋值)
如何给实参设置默认值(匹配模式下)
function auto([a,b,c,d=3]){//形参写匹配模式的格式
console.log(a,b,c,d);//a=1 b=2 c=3 d=2
}
auto([1,2,3]);//实参写匹配模式的格式
当d
接收的是undefined
的时候默认值就会生效,在结构赋值的时候可以给的不到的值数字一个默认值(前提接收的是undefined
默认值才会启动)
如何不在匹配模式下设置默认值(此方式不是解构赋值)
function auto(x,y=2){//设置形参的默认值(前提是形参是undefined的时候)
console.log(x,y)
}
auto(2)
当实参没有传递的时候,形参接收的是undefined
(默认值)那么形参的默认值就会生效
总结es6
函数传参数新增功能
es6
新增的函数特点
函数传参练习
// 第一题 // function log(x,y = 'world'){ // console.log(x,y) // log()打印 'Hello' 'world' // log()打印 'Hello' 'China' // log()打印 'Hello' '' // } // log('Hello'); // log('Hello','China'); // log('Hello',''); // 第二题 // function foo(x,y = 5){ // console.log(x,y) /* foo()打印 undefined 5 foo()打印 1 5 foo()打印 1 2 foo()打印 报错 */ // } // foo({});//{}这是一种对象匹配模式(可以拆解空对象) // foo({x:1}); // foo({x:1,y:2}); // foo();//在不传参数的时候要匹配一种模式的话,那么他会报错(也不可以用来匹配null) // 第三题 // function f(x = 1,y){ // return [x,y]; /* f()打印 1 undefined f()打印 2 undefined f()打印 报错(SyntaxError表示语法错误) f()打印 1 1 */ // } // f(); // f(2); // f(, 1); // f(undefined,1); // 第四题 // function f(x,y = 5,z){ // return [x,y,z]; /* f()打印 undefined 5 undefined f()打印 1 5 undefined f()打印 1 5 2 */ // } // f();//f()是函数加上()执行,现在的形参没有匹配模式自然就不是结构赋值 // f(1); // f(1,undefined,2);
函数的作用域
当给函数的形参设置默认值的时候()
已经生效了,则就会生成一个独立的块级作用域(()
则是块级作用域)
function auto (x,y=2){//接收外界传递实参的形参(函数作用域)
//当形参y接收不到数据的时候值是undefined
//在给形参y设置默认值的时候默认值他已经生效了
console.log(x,y)
}
auto(2)//外界传递的实参
验证:形参的默认值生效的时候就会生成一个块级作用域
验证一
var x = 1;
function f(x,y = x){//当前y的值是undefined默认值启动
//一旦默认值启动就会生成作用域(块级作用域)
//当前y=x自己身上没有x他就会往自身的作用域去找x变量
//当前x已经被赋值了结果y找到这个赋值的变量那么就是y=x(2)
console.log('我是'+y)//自己身作用域没有y这个变量就会去父级作用域里面去()
//生成的块级作用域里面寻找变量y,y=2打印2
}
f(2)
当形参设置的默认值一旦生效,就形成块就作用域,{}
生成函数作用域的父级是()
生成的块级作用域({}
父级作用域是()
)
验证二
let x = 1;
function f(y = x){//当前形参y的值是undefined
//一旦形参的值没有接收任何数据(undefined)的话那就会启动默认值并且生成自己的块级作用域
//x会去父级作用域里面去找父级作用域是全局作用域GO
//找到了x并且赋值,在打印y当前x已经有了值了就会作为默认值给y结果打印出来是1
let x = 2;
console.log(y);//1
}
f();
//当形参的默认值生效就会生成块级作用域
验证三
var x = 1;
function foo(x = x){
console.log(x);//报错 ReferenceError: x is not defined
}
foo();
//现在形参x没有接收到任何的实参值是undefined,
//一旦实参的值是undefined的话默认值启动,自动的生成了一个块级作用域,
//当前是x启动了默认值结果一看默认值也是x(默认值启动的时候形参变量都是用let声明的),
//在同一个作用域中let不可以同时声明两个变量现在就相当于变量x的默认值有是变量x,
//这就造成了变量x的占时性死区(占时性死区包含代码前面的区域和一遍的值),照成了占时先死区那么就会报错
es5
暗示全局变量的补充
function fn1(){
function fn2(){
x = 2;
}
fn2();
}
fn1();
console.log(x)
当一个变量没有定义直接赋值的话,那么这个变量叫做暗示全局变量(全局中有x
变量)
其实当变量没有声明就赋值的话这个变量并不是全局变量,而是父级变量
因为fn1
中根本就没有这个变量他会默认的把你添加到全局当中的
那么当fn1
函数中有x呢???
function fn1(){
var x;
function fn2(){
x = 2;
}
fn2();
console.log(x)
}//那么x=2就是往父函数中赋值了一个2
fn1()
// console.log(x)
当一个函数没有声明直接赋值的话,那么我会去父级作用域去找那么父级作用域中有用x声明的变量那么这个x=2就是父级里面的x=2了,所以说全局中就没有x这个变量了,就是给父级作用域中的x赋了一个值
当一个变量没有声明就赋值这是这叫做暗示父级变量,那么在父级中都没有声明过呢那我就会从父级的父级去找一直找的全局,如果全局中都没有声明变量那么我就会给你挂在全局当中
es5
暗示全局变量的补充(暗示父级)
练习1
/* GO{ x:undefined --->x:1 foo:function(){} } */ var x = 1; function foo(x , y = function(){ x = 2;}){ /* { x:undefined -->x:2 y:function(){} AO{//暗示父级变量去找父级中有没有相对应的变量 x:2 } } */ var x = 3; y(); console.log(x);//打印3 /* AO{ x:undefined -->x:3 } */ } foo(); console.log(x);//打印1 /* 全局变量GO中有一个变量x值是1,还有一个函数当函数执行函数内部没有传递实参, 结果形参的值是undefined默认值启动x=undefined y=function(){}是一个死函数, 在foo函数AO中声明了一个变量x值是3挂在AO上, y()就想当于形参y的匿名函数执行里面有一个x=2表示暗示父级变量, 这个变量去父级去找有没有对应的变量(()的块级作用域), 有对应的变量x=2 y=undefined,在AO中首先找到了x=3所以就打印3,在全局中找到了1就打印1 */
练习二
/* GO{ x:1 --> x:undefined foo:function(){} } */ var x = 1; function foo(x , y = function() { x = 2}){ /* { x:undefined ---> x:3 -->x:2 y:function(){ x = 2 } AO{ } } */ x = 3; y(); console.log(x);//打印2 } foo(); console.log(x)//打印1 /* 在全局中声明了一个变量x值是1,然后有一个函数这个函数加上()执行被启动了 生成AO对象x:undefined y:function() {x = 2} x=3表示暗示父级自己没有就会去父级中找 x:undefined --> x=3,然后这个匿名函数被启动了匿,名函数体里面有 x=2表示暗示父级自己没有就会去父级中找 当前这个父级是()的块级作用域 x = 3 --> x = 2 */
函数的 length
属性
函数作用对象他是有length
属性的 如下:
function auto(a,b,c){};
console.dir(auto)
函数的length
属性是用来记录形参的个数
function auto(a,b,c=2){};
auto(1,2,3)
console.dir(auto)
函数的length
属性本来是用来存储形参的非默认值(不会记录带有默认值的形参),实参一一对应也不会记录带有默认值的形参
函数的length
的属性不会记录带有默认值的形参(形参只要带有默认值这种写法就不会记录你,不管你有没有生效)
函数的length
属性 存储的是形参的个数(设置默认值的形参会被剔除掉)
指定了默认值以后,函数的length属性,将返回没有指定默认值的参数个数。也就是说,指定了默认值后,length属性将失真。
rest
参数
function auto(){
console.log(arguments);
//arguments是函数内部的关键词他存储了所有的实参集合他返回结果是一个类数组
}
auto(1,2,3);
那如何让123存放在数组当中呢??
function auto(...args){//通过...把实参数据收集起来放在一个变量(真数组)当中
console.log(args);
//通过...把实参数据收集到args这个变量中并且放置在一个数组当中他返回的是一个新的数组
}
auto(1,2,3);
...args
...
收集数据的作用args
中注意,rest 参数之后不能再有其他参数(即只能是最后一个参数),否则会报错。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。