java程序设计简明教程答案张晓龙_好程序员Java教程分享JavaScript面试问题及答案(一)...

好程序员Java教程分享JavaScript面试问题及答案(一)

7d1c05385909a79ae3bf0ab1a36a2b70.png

1.使用 typeof bar === "object" 来确定 bar 是否是对象的潜在陷阱是什么?如何避免这个陷阱?

尽管 typeof bar === "object" 是检查 bar 是否对象的可靠方法,令人惊讶的是在JavaScript中 null 也被认为是对象!

因此,令大多数开发人员惊讶的是,下面的代码将输出 true (而不是false) 到控制台:

var bar = null;console.log(typeof bar === "object"); // logs true!

只要清楚这一点,同时检查 bar 是否为 null,就可以很容易地避免问题:

console.log((bar !== null) && (typeof bar === "object")); // logs false

要答全问题,还有其他两件事情值得注意:

首先,上述解决方案将返回 false,当 bar 是一个函数的时候。在大多数情况下,这是期望行为,但当你也想对函数返回 true 的话,你可以修改上面的解决方案为:

console.log((bar !== null) && ((typeof bar === "object") || (typeof bar === "function")));

第二,上述解决方案将返回 true,当 bar 是一个数组(例如,当 var bar = [];)的时候。在大多数情况下,这是期望行为,因为数组是真正的对象,但当你也想对数组返回 false 时,你可以修改上面的解决方案为:

console.log((bar !== null) && (typeof bar === "object") && (toString.call(bar) !== "[object Array]"));

或者,如果你使用jQuery的话:

console.log((bar !== null) && (typeof bar === "object") && (! $.isArray(bar)));

2.下面的代码将输出什么到控制台,为什么?

(function(){ var a = b = 3;

})();console.log("a defined? " + (typeof a !== 'undefined'));console.log("b defined? " + (typeof b !== 'undefined'));

由于 a 和 b 都定义在函数的封闭范围内,并且都始于 var关键字,大多数JavaScript开发人员期望 typeof a 和 typeof b 在上面的例子中都是undefined。

然而,事实并非如此。这里的问题是,大多数开发人员将语句 var a = b = 3; 错误地理解为是以下声明的简写:

var b = 3;var a = b;

但事实上,var a = b = 3; 实际是以下声明的简写:

b = 3;var a = b;

因此(如果你不使用严格模式的话),该代码段的输出是:

a defined? falseb defined? true

但是, b 如何才能被定义在封闭函数的范围之外呢?是的,既然语句 var a = b = 3; 是语句 b = 3; 和 var a = b;的简写, b 终成为了一个全局变量(因为它没有前缀 var 关键字),因此仍然在范围内甚至封闭函数之外。

需要注意的是,在严格模式下(即使用 use strict),语句var a = b = 3; 将生成ReferenceError: b is not defined的运行时错误,从而避免任何否则可能会导致的headfakes /bug。 (还是你为什么应该理所当然地在代码中使用 use strict 的好例子!)

3.下面的代码将输出什么到控制台,为什么?

var myObject = {

foo: "bar

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值