1: 考引用类型在比较运算符时候 隐式转换会调用本类型那个方法 toString 和 valueOf?(去年过年吵的很火国外的题)
- if(a == 1 && a == 2 && a == 3){
- console.log("我走进来了");
- }
- <!-- 答案 1:-->
- var a = {num:0};
- a.valueOf = function(){
- return ++a.num
- }
- <!-- 答案 2:-->
- var num = 1;
- function a(){
- return num++;
- }
- if(a() == 1 && a() == 2 && a() == 3){
- console.log("我走进来了");
- }
- <!-- 答案 3:-->
- var num = 0;
- Function.prototype.toString = function(){
- return ++num;
- }
- function i(){}
- <!-- 答案 4:-->
- var a = {[Symbol.toPrimitive]: ((i) => () => ++i) (0)};
2: 考 this 指向的理解?(最后一个输出问题是借鉴网易面试题的)
- var names = "宋伟老师";
- var obj = {
- names: "张健老师",
- showName: function() {
- console.log(this.name);
- },
- returnName: function() {
- return this.name;
- },
- returnFunctionName: function() {
- return function() {
- console.log(this.name);
- }
- }
- }
- obj.showName(); // 输出什么? "张健老师"
- obj.returnName(); // 输出什么? "张健老师"
- obj.returnFunctionName()(); // 输出什么? "宋伟老师"
- obj.showName.call(names); // 输出什么? undefined
- obj.returnName.call(names); // 输出什么? undefined
- obj.returnFunctionName().call(names) // 输出什么? undefined
- var newObj = obj.returnFunctionName().bind(window);
- newObj.call(obj) // 输出什么? "宋伟老师"
- // 为什么最后一个输出 "宋伟老师"? 因为 bind 指向 this 对象后 再一次调用的话 this 指向不会被改变
3: 再来一次 this 指向问题?(能不看答案的同学说出结果 算我输)
- var big = "万达老师";
- var obj = {
- big:"宋伟老师",
- showBig:function(){
- return this.big;
- }
- }
- obj.showBig.call(big); //ƒ big() { [native code] } // 精通 String 的操作方法的同学就把为什么回复出来吧
4: 说出下面 this 长度是多少?(再来一把 this 指向 估计能把这都搞明白的同学 this 指向应该没有能难住的了)
- function a(a, b, c) {
- console.log(this.length); //4
- console.log(this.callee.length); //1
- }
- function fn(d) {
- arguments[0](10, 20, 30, 40, 50);
- }
- fn(a, 10, 20, 30);
- // 第一个输出结果: 因为 this 当前指向的是 arguments arguments 是一个伪数组具备 length 属性 arguments 又是保存函数的实参
fn 调用的时候传入 4 个实参所以 arguments 长度为 4 这个时候 arguments[0]等同于 arguments.a 调用这个函数所以 this 指向的是 arguments 这个伪数组也是 (对象)(听到这还有疑惑小伙伴留言问我)
// 第二个输出结果: callee 是 arguments 的一个属性, 主要返回当前 arguments 直属的函数体所以 this.callees 是返回 fn 每一个函数有一个 length 属性主要用来返回函数的形参的所以就是 1
5: 经典的变量提升问题?
=================== 题一 ===========================
- if(!"abc" in window){
- var abc = 10;
- }
- console.log(abc); //undefined
- // 因为先变量声明提升 所以提升之后 abc 的值系统默认会赋值为 undefined !abc 为 false ,in 是检查对象中是否存在某个属性很显然 false 属于是一个布尔类型不存在对象中所以没有走 if 里面的变量赋值
=================== 题二 ===========================
- console.log(a); //undefined
- if(!("a" in window)){
- var a = 10;
- }
- console.log(a); //undefined
- // 因为先变量声明提升 所以提升之后 a 的值系统默认会赋值为 undefined 变量提升会存在 GO 中也就是 window 所以 ("a" in window) 肯定为 true! 去反一下就为 false 所以不走赋值
=================== 题三 ===========================
- var x = 1;
- if (function f(){}) {
- x += typeof f;
- }
- console.log(x); //1undefined
- // 因为函数题在 () 中会以表达式去运行最后转换为 true, 不会存在函数整体声明提升所以 typeof 为 undefined
6: 面试几率百分 80% 的题!
- function fun(n,o) {
- console.log(o)
- return {
- fun:function(m){
- return fun(m,n);
- }
- };
- }
- var a = fun(0); a.fun(1); a.fun(2); a.fun(3); // 输出什么 undefined 0 0 0
- var b = fun(0).fun(1).fun(2).fun(3); // 输出什么 undefined 0 1 2
- var c = fun(0).fun(1); c.fun(2); c.fun(3); // 输出什么 undefined 0 1 1
- // 答案很显而易见换一个形式看着道题
- function fun(n,o) {
- console.log(o)
- return {
- fun:function(m){
- return fun(m,n);
- }
- };
- }
- var a = fun(0); a.fun(1); a.fun(2); a.fun(3); // 输出什么 undefined 0 0 0
- //fun(0)调用时候等同于
- function fun(n,o) {
- var n=0;
- var o;
- console.log(o) //undefined
- return {
- fun:function(m){
return fun(m,n); ---> n 就获取到 fun 里面的 n 为 0 的值然后调用一次 fun 就会出现下面函数显示
- }
- };
- }
- //a.fun(1)调用时候等同于 fun(1,0)
- function fun(n,o) {
- var n=1;
- var o=0;
- console.log(o) //1
- return {
- fun:function(m){
return fun(m,n); ---> n 就获取到 fun 里面的 n 为 0 的值
- }
- };
- }
- // 以此类推 不知道小伙伴们看懂没 因为感觉语言解释不如分化代码理解好明白
来源: https://juejin.im/post/5a9fa2d3f265da23884c9aa1