关于arguments、纯函数、柯里化、组合函数、eval、严格模式

1.arguments

2.纯函数

3.柯里化

4.eval

5.严格模式

6.with

1.arguments

1)什么是arguments:是函数调用的时候传入的实参组成的伪数组

2)函数.length:形参个数:注意当函数形参里面有剩余参数或默认参数,或者参数解构,都不算在函数.length里面

3.什么是伪数组,伪数组就是有长度也可以通过索引去获取索引下的值,但是不能用Array类的foreach、map等方法

4.如何判断这是一个真数组

// 1.通过instanceof 原理:通过原型链查找有没有Array类 缺点:不能检测基础类型以及 instanceof Object都是true
// 2.Array.isArray() 
// 3.Objece.prototype.toString.call() 可以检测基础类型
// 每一个继承 Object 的对象都有 toString 方法,如果 toString 方法没有重写的话,会返回 [Object type],其中 type 为对象的类型。但当除了 Object 类型的对象外,其他类型直接使用 toString 方法时,会直接返回都是内容的字符串,所以我们需要使用call或者apply方法来改变toString方法的执行上下文。

function qo(x,y,z) {
  let length=arguments.length
  let arr=[]
  for (let index = 0; index < length; index++) {
    arr.push(arguments[index])
  }
  console.log(Array.isArray(arr));//true
  console.log(Array.isArray(arguments));//false
  console.log(arr instanceof Array);//true
  console.log(arguments instanceof Array);//false
  console.log(Object.prototype.toString.call(arr));//[object Array]
  console.log(Object.prototype.toString.call(arguments));//[object Arguments]
}
qo(1,2,3)

4.如何把伪数组转化为真正的数组

function qo(x,y,z) {
  let length=arguments.length
  // 第一种
  let arr=[]
  for (let index = 0; index < length; index++) {
    arr.push(arguments[index])
  }
  console.log(Array.isArray(arr));//true
  console.log(Array.isArray(arguments));//false
  // 第二种 改变原型链
  console.log(Array.isArray([].slice.call(arguments)));//true
  // 第三种 用扩展运算符
  console.log(Array.isArray([...arguments]));//true
}
qo(1,2,3)

2.纯函数

纯函数就是有固定的输入后有固定的输出,并且不会对函数外的变量等产生影响,就是没有副作用的函数

function foo(num1, num2) {
  return num1 * 2 + num2 * num2
}

3.柯里化

传入一部分参数去调用,返回一个会处理剩余参数的函数

//sum1就是柯里化函数
function sum1(x) {
  return function(y) {
    return function(z) {
      return x + y + z
    }
  }
}

var result1 = sum1(10)(20)(30)

4.eval

把字符串当做js进行执行,开发中不建议这么做,因为1.可读性差 2.字符串容易被篡改,造成被攻击3.不会被js引擎优化 注意eval的str里面如果是let或const定义的 会放在字符串作用内 如果是var 则会改变外层作用域的变量

let str='var m="message"'
eval(str)
console.log(m);

5.严格模式

注意:ES6 的模块自动采用严格模式,不管你有没有在模块头部加上"use strict";

如何开启严格模式

// js文件内开启严格模式
"use strict"
function foo() {
  // 函数内开启严格模式
  "use strict";
}

开启严格模式后,浏览器和编译器会对我们的代码进行检测,使我们的代码更具规范,检测内容包括:

1.变量的创建必须进行var let const的命名

2.函数形参名字不能一样

3.js未来可能会定义的语义不能使用

4.不能用0123的八进制

5.静默错误会报错

什么是静默错误,就是对不能赋值或赋值不会成功的内容进行赋值操作

6.不能删除不能删除的内容

7.this默认不在绑定全局对象

8.eval不再为上层引用对象

当不开启的时候m会打印1,当开启后会报错

"use strict"
let str="var m=1"
eval(str)
console.log(m);

9.with不能使用

6.with

/with语句可以形成自己的作用域,在with语句中打印age时,会输出obj对象中的age属性,但在with语句中打印不存在的属性message时,会向外层的作用域一层一层去查找

var message = 'Hello World';

var obj = { name: 'jam', age: 20 }
function foo () {
    with (obj) {
        console.log(age) 
        console.log(message) 
    }
    console.log(message)
}
foo()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值