51CTO诚邀您9月23号和秒拍/国美/美团元专家一路聊智能CDN的优化之路,抓紧时光哦!
尽管 typeof bar === "object" 是检查 bar 是否对象的靠得住办法,令人惊奇的是在JavaScript中 null 也被认为是对象!
是以,令大年夜多半开辟人员惊奇的是,下面的代码将输出 true (而不是false) 到控制台:
- var bar = null; console.log(typeof bar === "object"); // logs true!
只要清跋扈这一点,同时检查 bar 是否为 null,就可以很轻易地避免问题:
这种技巧的另一个特点是,许可一个易于引用的(假设更短的)别号用于全局变量。这平日用于,例如,jQuery插件中。jQuery许可你应用jQuery.noConflict(),来禁用 $ 引用到jQuery定名空间。在完成这项工作之后,你的代码仍然可以应用$ 应用这种闭包技巧,如下所示:
- (function($) { /* jQuery plugin code referencing $ */ } )(jQuery);
- 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的话:
请留意 Math.ceil() 和 Math.floor() 在膳绫擎的实现中等同于 Math.round()。
- console.log((bar !== null) && (typeof bar === "object") && (! $.isArray(bar)));
2.下面的代码将输出什么到控制台,为什么?
因为 a 和 b 都定义在函数的封闭范围内,并且都始于 var关键字,大年夜多半JavaScript开辟人员期望 typeof a 和 typeof b 在膳绫擎的例子中都是undefined。
然而,事实并非如斯。这狼9依υ?题是,大年夜多半开辟人员将语句 var a = b = 3; 缺点地舆解为是以下声明的简写:
但事实上,var a = b = 3; 实际是以下声明的简写:
- b = 3;
- var a = b;
是以(如不雅你不使悠揭捉?格模式的话),该代码段的输出是:
- a defined? false
- b 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.下面的代码将输出什么到控制台,为什么?