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()