JS_09
一、JS基础语法进阶
1.1、三元运算符
概述:三元运算符是由三部分组成,使用语法如下:
A?B:C
三元运算符A部分:需要一个布尔值(其他类型的数字需要隐式转换为布尔值)
如果A部分为布尔值真,则返回结果为B,如果布尔值为假,则返回结果C
B与C部分:可以使任意类型数值或者是一些表达式
<script> console.log(true?1:2);//1 console.log(""?1+1:6);//6 </script>
注意:三元运算符经常给变量进行赋值
<script> var age = true?16:NaN; console.log(age);//16 </script>
1.2、类数组对象——arguments
概述:函数体中拥有一个引用类型数据arguments。类数组存在的意义:在函数没有形参的情况下,在函数体中可以获取到传递给函数的实参
【类数组对象:类似于不是数组,因为只能使用数组的length属性,不能使用数组的方法】
<script> //函数的函数体中才有类数组对象arguments function fun(){ //类数组对象是引用类型的数据 console.log(typeof arguments); //在没有给函数写形参的情况下可以接收传递进来的实参 console.log(arguments); var sum = 0; for(var i = 0 ; i < arguments.length ; i++){ sum += arguments[i]; } console.log(sum); } fun(1,2,3,4,5,6,7,8,9,10); </script>
1.3、闭包***
概述:闭包【可以访问其他作用域中的变量的函数称为闭包】
<script> //定义一个全局变量100 var num = 100; //声明一个函数 function fun(){ num++;//此时修改的是全局变量num的值 console.log(num); } //调用函数 fun(); fun(); </script>
当函数fun第一次调用的时候:在函数作用域中没有变量num,因此会沿着作用域链向上(全局)查询。当函数fun第一次执行的时候将全局变量num由100变为101了,当函数fun第二次执行的时候,将全局变量num由101变为102。
1.3.1、闭包经典习题一
<script> //声明第一个函数【外层函数】 function outer(x){ //声明第二个函数【内层函数】 function inner(y){ console.log(x + y );//300 } //调用内层函数 inner(200); } //调用外层函数 outer(100); </script>
在这个例子中,inner函数是闭包。
1.3.2、闭包经典习题二
<script> function outer(){ var a = 100; function inner(){ a += 10; console.log(a); } //返回值是inner函数的声明部分 return inner; } var result = outer(); result(); result(); var result1 = outer(); result1(); result1(); //引用类型的数据比较是否相等时看的是地址是否相等。 console.log(result ==result1); </script>
当outer第一次执行的时候,声明了一个局部变量a=100,以及声明了第一个inner函数并且返回inner的声明部分
当result执行的时候,自身作用域中没有变量a,因此沿着作用域链向上查询【outer】,而且每一次调用都把原来作用域中的a加10
当outer第二次执行的时候,声明了同名变量a=100以及第二个函数inner的声明部分,然后再次返回并调用,但是这次a的值是从100开始的
上述例子中存在两个闭包。