一. 下列代码的输出结果为:()
Object obj obj
二.
当引用类型数据和基本数据类型比较时会先调用引用数据类型的valueOf方法,如果得到一个对象,再调用toString方法
三.
const arr=[1,2,3],下列那些做法会导致报错()
- arr=[...arr,4]
- arr.push(4)
- arr.splice(0,2)
- arr.length=0
1.改变arr地址值会报错,而2、3、4只是改变数组内容不会报错
四.函数输出结果
function fun1() {
"use strict";
console.log(this);
}
(function () {
console.log(this);
fun1();
})();
fun1.call(this);
let obj = {
name: "测试",
};
fun1.bind(this).call(obj);
首先执行匿名函数为window;然后执行fun1(),普通函数调用,this为window,严格状态下为undefined;fun1.call(this),this为window;fun1.bind(this).call(obj),因bind不管怎么调用都是那个this值故call(obj)无效为window
window undefined window window
调用方式 | 非严格模式 | 备注 |
---|---|---|
普通函数调用 | window | 严格模式下是 undefined |
构造函数调用 | 实例对象 | 原型方法中 this 也是实例对象 |
对象方法调用 | 该方法所属对象 | 紧挨着的对象 |
事件绑定方法 | 绑定事件对象 | |
定时器函数 | window | |
立即执行函数 | window |
当对函数调用call()和apply()都会调用函数执行。
fun.call()\fun.apply() 和 fun() 的区别:
在调用call()和apply()可以将一个对象指定为第一个参数,即:此时这个对象将会成为函数执行时的this。 就是说此时该对象短暂地拥有该函数的使用权。
原文链接:https://blog.csdn.net/mantou_riji/article/details/123959832
call()方法可以接收多个参数,第一个参数是指定的this对象,如果需要多个参数需要把每个参数都列举出来;
apply()方法与call()方法类似,不同的是传参的方式,第一个参数仍然是指定的this对象,第二个参数是一个类数组
bind()方法传参和call()类似,但是bind()与其他两种方法有一个很大的区别就是bind()会返回一个指定好的this的函数供之后调用
bind() 最简单的用法是创建一个函数,不论怎么调用,这个函数都有同样的 this 值
对于call、apply、bind三种方法的详细可以看学长的这篇文章call、apply、bind三种方法的比较
五. 函数输出结果
function foo(
x,
y = () => {
console.log(x);
}
) {
console.log(x);
var x = 2;
console.log(x);
y();
}
foo(1);
箭头函数调动:y(); 在形参括号里是一个闭包,故箭头函数打出来的x为1
var x=2;是又定义了一个x,若为x=2;则为改变原函数值;
1 2 1
六.
- 请给补全代码,使其结果输出为true
let a = ???;
console.log(a == 1 && a == 2 && a == 3);
答案:
let a = {
n: 1,
valueOf: function () {
return this.n++;
},
};
console.log(a == 1 && a == 2 && a == 3);
若为console.log(a == 1 && a == 2 && a == 4);
则 n: 0,
return Math.pow(2,this.n++);