浏览 1793 次
锁定老帖子 主题:Javascript面试题解析
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2016-07-18
第一题 /* 解析: + 优先级大于 ? 此题等价于: 'Value is true' ? 'Something' : 'Nothing' 所以结果是:'Something' */ var val = 'smtg'; console.log('Value is ' + (val === 'smtg') ? 'Something' : 'Nothing'); 第二题 /* * 解析: * typeof 返回一个表示类型的字符串 typeof 的结果请看下面: **type** **result** Undefined "undefined" Null "object" Boolean "boolean" Number "number" Symbol "symbol" Host object Implementation-dependent Function "function" Object "object" instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上 所以输出["object", false] */ function two(){ console.info([typeof null, null instanceof Object]); //["object", false] 第三题 /* [JavaScript中的稀疏数组与密集数组][1] 解析: 一般来说,JavaScript中的数组是稀疏的,也就是说,数组中的元素之间可以有空隙 其实在javascript中并没有常规的数组,所有的数组其实就是一个对象。 javascript的数组根本没有索引,因为索引是数字,而js中数组的索引是string, arr[1]其实就是arr["1"],给arr["1000"] = 1,arr.length也会自动变为1001. 这些表现的根本原因就是,JavaScript中的对象就是字符串到任意值的键值对.注意键只能是字符串. 看一下 Array.prototype.filter 的部分代码: var t = Object(this); var len = t.length >>> 0; if (typeof fun !== 'function') { throw new TypeError(); } var res = []; var thisArg = arguments.length >= 2 ? arguments[1] : void 0; for (var i = 0; i < len; i++) { if (i in t) { // 注意这里!!! var val = t[i]; if (fun.call(thisArg, val, i, t)) { res.push(val); } } } 从上面可知filter对数组进行遍历时,会首先检查这个索引值是不是数组的一个属性.测试一下: console.info(0 in ary); //true console.info(1 in ary); //true console.info(4 in ary); //false console.info(10 in ary); // false 也就是说3~9的索引根本没有是初始化 所以答案:[]; */ var ary = [0,1,2]; ary[10] = 10; console.info(ary.filter(function(x) { return x === undefined;})); 第四题 /* 解析: y 被赋值到全局. x 是局部变量. 所以打印 x 的时候会报 ReferenceError */ (function(){ var x = y = 1; })(); console.log(y); // 1 console.log(x); // error 第五题 /* 解析: 当函数参数涉及到 any rest parameters, any default parameters or any destructured parameters 的时候, 这个 arguments 就不在是一个 mapped arguments object 了....., 所以答案是12,这个需要好好体会一下 */ function sidEffecting(ary) { ary[0] = ary[2]; } function bar(a,b,c=3) { c = 10 sidEffecting(arguments); return a + b + c; } bar(1,1,1); 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2016-07-20
itxdl 写道 Javascript的一些面试题让很多同学感到头疼,下面就根据兄弟连教育(www.lampbrother.net)毕业学员面试遇到的面试题,给大家做一个简单的分享,希望对初入职场的你们有一些帮助:Javascript面试题解析。
第一题 /* 解析: + 优先级大于 ? 此题等价于: 'Value is true' ? 'Something' : 'Nothing' 所以结果是:'Something' */ var val = 'smtg'; console.log('Value is ' + (val === 'smtg') ? 'Something' : 'Nothing'); 第二题 /* * 解析: * typeof 返回一个表示类型的字符串 typeof 的结果请看下面: **type** **result** Undefined "undefined" Null "object" Boolean "boolean" Number "number" Symbol "symbol" Host object Implementation-dependent Function "function" Object "object" instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上 所以输出["object", false] */ function two(){ console.info([typeof null, null instanceof Object]); //["object", false] 第三题 /* [JavaScript中的稀疏数组与密集数组][1] 解析: 一般来说,JavaScript中的数组是稀疏的,也就是说,数组中的元素之间可以有空隙 其实在javascript中并没有常规的数组,所有的数组其实就是一个对象。 javascript的数组根本没有索引,因为索引是数字,而js中数组的索引是string, arr[1]其实就是arr["1"],给arr["1000"] = 1,arr.length也会自动变为1001. 这些表现的根本原因就是,JavaScript中的对象就是字符串到任意值的键值对.注意键只能是字符串. 看一下 Array.prototype.filter 的部分代码: var t = Object(this); var len = t.length >>> 0; if (typeof fun !== 'function') { throw new TypeError(); } var res = []; var thisArg = arguments.length >= 2 ? arguments[1] : void 0; for (var i = 0; i < len; i++) { if (i in t) { // 注意这里!!! var val = t[i]; if (fun.call(thisArg, val, i, t)) { res.push(val); } } } 从上面可知filter对数组进行遍历时,会首先检查这个索引值是不是数组的一个属性.测试一下: console.info(0 in ary); //true console.info(1 in ary); //true console.info(4 in ary); //false console.info(10 in ary); // false 也就是说3~9的索引根本没有是初始化 所以答案:[]; */ var ary = [0,1,2]; ary[10] = 10; console.info(ary.filter(function(x) { return x === undefined;})); 第四题 /* 解析: y 被赋值到全局. x 是局部变量. 所以打印 x 的时候会报 ReferenceError */ (function(){ var x = y = 1; })(); console.log(y); // 1 console.log(x); // error 第五题 /* 解析: 当函数参数涉及到 any rest parameters, any default parameters or any destructured parameters 的时候, 这个 arguments 就不在是一个 mapped arguments object 了....., 所以答案是12,这个需要好好体会一下 */ function sidEffecting(ary) { ary[0] = ary[2]; } function bar(a,b,c=3) { c = 10 sidEffecting(arguments); return a + b + c; } bar(1,1,1); 恩学习了。。。。 |
|
返回顶楼 | |