JavaScript中超级经典的面试题
2017-08-08 16:06
239 查看
1.此题考擦变量提升
依次输出结果:30 40 60 接着执行new (test.init())(); 输出60 40 60
详解:1. 30 40 60 先输出30 这个a是window的a 此时this指向test对象,所以接着输出40 此时p指向go函数 p属于window下的变量,
go函数里面this指向window,此时在打印会输出60
2. 60 40 60 接着执行分解后的A输出60 40 因为第一个a是window下面的a 60 第二a是test对象下的a 40,接着执行上面标注的代码B
创建一个go对象, 此时this指向go对象 但是构造函数的属性优先级高于原型链中的优先级 所以输出60
2.对上面的代码稍微在变化一下 仔细在看一下
总结:
4000
一句代码之差输出结果就不一样 一次输出30 40 60 此时不关test什么事
3.考擦按址传递还是按值传递
按址传递和按值传递区别在于你copy的是地址还是值,一般情况下基本数据类型字符串 数值型 bool是属于值引用,只是对值的拷贝,数组和对象属于址引用,是对地址的拷贝,还是上代码,简单明了
4. 考擦异步操作和同步操作
输出结果:什么都不输出,页面直接卡死, 原因:setTimeout setInterval ajx 事件操作eg:click 属于异步操作 while for循环同步 等到同步操作结束后,才会去执行异步操作,所以会直接卡死
this.a = 30; var obj = { a: 40, test : function () { // console.log('111111111111'); // console.log(this); console.log(a); console.log(this.a); //40 function fn() { this.a = 60; // console.log('2222222'); 这两行是调试方便调式的 想用可以打开 console.log(this); console.log(this.a); } fn.prototype.a = 70; return fn; } }; var p = obj.test(); p(); new (obj.test())(); //上面一句等价于下面两句代码 // var s = new (test.init()); //s是属于window对象 A // s(); //谁调用go方法 this就指向谁 此时指向window B
依次输出结果:30 40 60 接着执行new (test.init())(); 输出60 40 60
详解:1. 30 40 60 先输出30 这个a是window的a 此时this指向test对象,所以接着输出40 此时p指向go函数 p属于window下的变量,
go函数里面this指向window,此时在打印会输出60
2. 60 40 60 接着执行分解后的A输出60 40 因为第一个a是window下面的a 60 第二a是test对象下的a 40,接着执行上面标注的代码B
创建一个go对象, 此时this指向go对象 但是构造函数的属性优先级高于原型链中的优先级 所以输出60
2.对上面的代码稍微在变化一下 仔细在看一下
this.a = 30; var obj = { a: 40, test : function () { // console.log('111111111111'); console.log(this); //此时this指向obj对象 console.log(a); console.log(this.a); //40 function fn() { this.a = 60; // console.log('2222222'); 这两行是调试方便调式的 想用可以打开 console.log(this); //指向window console.log(this.a); } fn.prototype.a = 70; // return fn; fn(); //就这个一句代码跟上面不一样 } }; obj.test(); // obj.test(); //在执行一次 依次输出60 40 60
总结:
4000
一句代码之差输出结果就不一样 一次输出30 40 60 此时不关test什么事
3.考擦按址传递还是按值传递
按址传递和按值传递区别在于你copy的是地址还是值,一般情况下基本数据类型字符串 数值型 bool是属于值引用,只是对值的拷贝,数组和对象属于址引用,是对地址的拷贝,还是上代码,简单明了
//值引用 var a = 'hello'; var b = a; b = 'world'; //此时对b进行修改并不会影响a的值 以为这是指引用,只是拷贝的值 非地址 所以并不影响a值的变化 console.log(a); console.log(b); //址引用 var arr1 = [1,2,3,1,43,12,12,1]; var arr2 = arr1; arr2.push(100); //此时修改arr2的值 会同时改变arr1的值 因为他们是指向的同一块地址 console.log(arr2); console.log(arr1);
4. 考擦异步操作和同步操作
$(document).click(function () { console.log(1); }) setTimeout(function () { console.log(2); },0) while(true){ console.log(3); }
输出结果:什么都不输出,页面直接卡死, 原因:setTimeout setInterval ajx 事件操作eg:click 属于异步操作 while for循环同步 等到同步操作结束后,才会去执行异步操作,所以会直接卡死
相关文章推荐
- 超级实用的javascript经典大全 js大全
- 5个经典的JavaScript面试题
- 5个经典的JavaScript面试题
- 9个JQuery和5个JavaScript经典面试题
- JAVA经典面试题(二)--如何体现JavaScript的继承关系?
- JavaScript一道经典闭包面试题
- javascript经典面试题之for循环click
- JAVASCRIPT中经典面试题
- javascript经典面试题 全局变量和局部变量 变量作用域
- JAVASCRIPT中经典面试题
- 一个经典的JavaScript面试题
- 100 Interview Questions for Software Developers 面试题 超级的经典
- 前端,别闹 学习Javascript闭包(Closure)及几个经典面试题理解
- 单线程 JavaScript 的异步机制与经典 for 循环面试题
- 5个JavaScript经典面试题
- JavaScript同步、异步、回调执行顺序之经典闭包setTimeout面试题分析
- JavaScript经典面试题
- 5个经典的JavaScript面试题
- 5个JavaScript经典面试题
- JavaScript同步、异步、回调执行顺序之经典闭包(setTimeout面试题分析)