有意思的面试题汇总----持续更新

1 .考验基本功,基本数据的运算

    console.log([]== ![])  //输出true

    !的运算优先级比=  高;

    => console.log([]==false)
    
    [] 转化成数字 是  0

    false  转化成数字也是 0;

    至于为什么要转化成数字在进行比较,这个我只能说你es运算规则是这样的

2 . 1000个苹果分别状态10个箱子里面,如何分配才能取任意数字的苹果

    1, 2,4,8,16........

    这题考的是二进制

3.js中所有的变量都可以当作对象使用,除了两个列外null和undefined

                        var  d = 2.toString();
			
			console.log(d)  //报错      这里报错了,是因为js解析器的问题,试图将  点操作符 解析成 浮点数的一部分
			
			var  s = 2..toString();
			
			console.log(s)    //2
			
			var a = 2 .toString();
			
			console.log(a);   //2
			
			var b = (2).toString();
			
			console.log(b)   //2
  1. 对象的应用,当对象被赋值另一个对象时,对象原来的引用断开
        function setname(obj){
            obj.name = "js";
            obj = { name : "node"}
        }
        var newobj = {name : 'jq'}
        setname(newobj);
        console.log(newobj.name)    //js


  1. 构造函数里面 显示的return 基本数据和引用数据类型的坑爹处
    function Bar() {
    return 2;
    }
     new Bar(); // 返回新创建的对象

    function Test() {
    this.value = 2;

        return {
           foo: 1
        };
    }
new Test(); // 返回的对象                 //   当构造函数中显示的return 一个值得时候;这个是数字,则返回新创建的对象
                                                                                      这个值是对象,则覆盖新创建的对象

6.考验基本功,基本数据的运算 和1是类似

    console.log({}==!{})   //false            // 这里是不解释了   还是运算的规则
  • 基本遵循以下规则

1

  1. 如何访问以下数组的值
    var obj = [];

    obj[{}] = "博主"     //   怎么访问到博主

8.原生js实现深拷贝

            function deepClone(obj){
   	 	var obj1 = {};
   	 	
   	 	for (var attr in obj) {
   	 		if(typeof obj[attr] != 'object'){
   	 			obj1[attr] = obj[attr]
   	 		}else{
   	 			var temp = obj[attr];
   	 			obj1[attr] = deepClone(obj[attr])    //主要这里巧妙 利用递归
   	 		}
   	 	}
   	 	
   	 	return obj1;
   	 }

9.原型与参数的障碍

                        //创建一个构造函数
			 function Person(name,age){
			 	this.name = name ;
			 	this.age = age || 18;
			 }
			 //给构造函数的原型添加方法和属性
			 Person.prototype.sex = "你叫什么名字"
			 
			 var p1 = new Person('网吧')
			 var p2 = new Person();
			 
			 console.log(p1.name) //网吧
			 //undefine   //name是参数,参数被声明,却未传递参数,所以是undefine
			 console.log(p2.name) 
			
			 console.log(p2.sex)  //  实例化对象自身世没有的;就去原型链上寻找
  1. {}.toString() 为什么会报错,console.log({}.toSting())是正常的
   在解析的时候{},有两种意义,===代码块  ===对象
	{}单独出现时,默认被理解为 代码块
	如果想 {} 作为对象被解释,需要将 {} 转换成表达式

11 . console.log(3==ture) 和 if(3){console.log(true)
}

   //上述两种情况为什么会输出结果不同

    ==================================

    很遗憾,如果你纠结这个问题,你只能去布兰登艾奇了,这货创造了这样的js

12.return 返回至的问题

      //构造函数的作用
     约定, 构造函数默认是初始化对象的, 因此返回的就是对象本身, 不用写 return.

      但是如果在构造函数中写了 return, 那么 return 后如果是 值类型或 空 则无效, 
      如果是引用类型则返回该引用类型. 那么由 new 创建的这个对象就被丢弃.==========================注意这里是返回,而不是覆盖,this是不能被赋值的

      当构造函数非常复杂的时候, 需要根据传入的参数创建不同结构的对象的时候, 
      可以考虑将代码的逻辑分组, 然后每一组都单独返回数据 则使用 return this. 
      其目的是为了更好的维护代码

13.es5中新增数组遍历方法forEach

    forEach(function(){  //this  })   //这里面的this指向谁

    $.each 中回掉函数this 又是指向 谁

14.运算优先级的问题

    function Foo() {
			    getName = function () { alert (1); };  //当函数被调用的时候,会产生一个隐式全局变量
			    console.log(this)
			    return this;
			}
			Foo.getName = function () { alert (2);};
			Foo.prototype.getName = function () { alert (3);};
			var getName = function () { alert (4);};
			function getName() { alert (5);}
			
			//请写出以下输出结果:
			Foo.getName();   //2  
			getName();		//4
			Foo().getName();  //1
			getName();     //1
			new Foo.getName();  //2   
			new Foo().getName(); // 3
			new new Foo().getName(); //3      //这最后几个完全是运算优先级的问题

  1. 当函数名和参数名重名的时候,参数传值值无效
    function a(b){
        alert(b);     //函数体
        function b(){
        alert(b)
        b()   //函数体
    }
    }
    a(1)    
  1. 闭包的引用问题

    var f1 = (function(){
				var i =0;
				return function(){
					console.log(i++)
				}
			})();
			
			var f2 = (function(){
				var i =0;
				return function(){
					console.log(i++)
				}
			})()
			
			f1();
			f1 = null;   //断开引用
			f1();    //报错
			f2();

17 . 有点意思,这个靠大家都没注意过的问题---arguments的类型

    (function(){ 
	  return typeof arguments; 
	})();
  1. 答案是,到目前为止我还不知道 为什么
    100['toString']['length']

19,表示式对函数的影响


    var x = 10;
	var foo = {
	    x: 20,
	    bar: function () {
	        var x = 30;
	        return this.x;
	    }
	};
	console.log(
	    foo.bar(),    //20
	    (foo.bar)(),   //20  
	    (foo.bar = foo.bar)(), 	//10	
	    (foo.bar, foo.bar)()    //10
	);
欢迎各位大虾指正
原文地址:https://www.cnblogs.com/he-zhi/p/6954306.html