js 隐式转换、原型链面试题

15 篇文章 1 订阅

一、查看下列代码,请问执行后弹出什么值
var name = “World!”;
(function () {
var name;
if (typeof name === ‘undefined’) {
name = ‘Jack’;
console.log(‘Goodbye’ + name);
} else {
console.log(‘hello’ + name);
}
})();

分析:
变量声明提升,JS代码分为存储模块和执行模块。
在这里我们应该清楚,当函数内部变量与全局变量同名时 全局变量会被覆盖 因为js是单线程执行var name当前没有赋值 所以类型为undefined

结果:Goodbye Jack

二、考察Math、call、apply
语句var arr=[a,b,c,d];执行后,数组arr中每项都是一个整数,下面得到其中最大整数语句正确的是哪几项?(选择多个)

A. Math.max(arr)
B. Math.max(arr[0], arr[1], arr[2], arr[3])
C. Math.max.call(Math, arr[0], arr[1], arr[2], arr[3])
D. Math.max.apply(Math,arr)

分析:
Math.max(args…)传入参数是任意数量的值
A 传入数组,所以错误
B 可以
C Function.call()可以传入任意多个参数,C正确
D Function.apply()第二个参数以数组形式传递,D正确

结果:B、C、D

三、分析代码,最后执行结果为?
var A = {n: 4399};
var B = function(){this.n = 9999};
var C = function(){var n = 8888};
B.prototype = A;
C.prototype = A;
var b = new B();
var c = new C();
A.n++
console.log(b.n);
console.log(c.n);

分析:

这道题主要的用到了原型链,先查看自身是否有,没有找原型,原型也没有找Object,再找不到就是undefined。

这道题中console.log(b.n);
在查找b.n是首先查找 b 对象自身有没有 n 属性,如果没有会去原型(prototype)上查找
当执行var b = new B()时,函数内部this.n=9999(此时this指向 b) 返回b对象,b对象有自身的n属性,所以返回 9999
console.log(c.n);
同理,当执行var c = new C()时,c对象没有自身的n属性,向上查找,找到原型 (prototype)上的 n 属性,因为 A.n++(此时对象A中的n为4400), 所以返回4400

结果:9999 4400

四、代码之后,arr的值是多少
var arr=[{a:1},{}];
arr.forEach(function(item,idx){
item.b=idx;
});

分析:
forEach()方法是对数组中的每一项运行给定函数,回调函数的参数item为数组当前项,idx为当前索引。
这道题就是把数组每一项添加属性 b,并且属性 b 的值为当前项的数组索引值。

还有就是,forEach()方法没有返回值,所以不能将 arr.foreach()像其他数组迭代方法那样赋值给某一个变量。

结果:[{a:1,b:0},{b:1}]

五、函数定义方式
下列选项中,关于 js 函数定义方式,正确的是

A. function add(a,b){return a+b;} 函数表达式
B. var add=new Function(‘a’,’b’,’return a+b’) 函数表达式
C. function add(a,b){return a+b;} 函数声明
D. var add=function(a,b){return a+b;} 函数声明
E. var add=new Function(‘a’,’b’,’return a+b’); 函数声明

分析:
js函数定义的几种方式

定义方法 代码块
函数声明 function sum(a,b){ return a+b }
函数表达式 var sum = function(a,b){ return a+b }
构造函数 var sum = new Function(‘a’,‘b’,‘return a+b’)//不推荐使用,影响函数解析性能
六、this指向
以下代码输出结果为?

var myObject = {
foo: “bar”,
func: function() {
var self = this;
console.log(this.foo);
console.log(self.foo);
(function() {
console.log(this.foo);
console.log(self.foo);
}());
}
};
myObject.func();

分析:
这道理的关键就在于,方法/函数是由谁调用的,那么其内部的this就指向谁
首先func是由myObject调用的,this指向 myObject。
又因为var self = this;所以self指向myObject。
这个立即执行匿名函数表达式是由window调用的,this指向 window 。
立即执行匿名函数的作用域处于myObject.func的作用域中,在这个作用域找不到self变量,沿着作用域链向上查找self变量,找到了指向 myObject对象的self。

所处域 this指向
window window
普通函数 window
构造函数 指向类的实例对象
定时器 window
自调用函数 windown
结果:bar bar undefined bar

七、观察下列代码输出什么?
假设 output 是一个函数,输出一行文本。下面的语句输出结果是什么?

output(
typeof (function() {
output(“Hello World!”)
})()
);

分析:
在这里先提前说下,任何函数执行完一次,如果没有return返回值和声明变量,都会立即消失。
这段代码的执行流程是,先立即执行匿名自调用函数,输出Hello World! ,函数执行后无返回值,则输出未定义

结果:Hello World! undefined

八、下列代码显示结果是
var x = new Boolean(false);
if (x) {
alert(‘hi’);
}
var y = Boolean(0);
if (y) {
alert(‘hello’);
}

分析:
这道题考察了JS的类型转换,这里的var x是一个对象,任何对象转为布尔值,都为得到 true。
题目的第二部分,一定要注意 y = Boolean(0),而不是 y = new Boolean(0)。这两个有很大区别,用 new 调用构造函数会新建一个布尔对象,此处没有加 new,进行的是显示类型转换,所以就是false

结果:hi

九、假设val已经声明,可定义为任何值。则下面js代码有可能输出的结果为:
var val;
console.log('Value is ’ + (val != ‘0’) ? ‘define’ : ‘undefine’);

分析:
这道题考察了运算符的优先级,加号优先级高于三目运算。低于括号。 所以括号中无论真假 加上前边的字符串都为 true 三目运算为true是输出define

结果: define

十、BOM考察
以下关于History对象的属性或方法描述正确的是( )
A. go表示刷新当前页面。
B. back回到浏览器载入历史URL地址列表的当前URL的前一个URL。
C. forward转到浏览器载入历史URL地址列表的当前URL的下一个URL。
D. length保存历史URL地址列表的长度信息。

分析:

属性 含义
length 返回浏览器历史列表中的URL数量
back() 加载 history 列表中的前一个URL
forward() 加载 history 列表中的下一个URL
go() 加载history列表中的某个具体页面。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值