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

首先typeof bar === "object"是检测bar是否是对象的可靠方法,但在javascriptnull也被认为是对象,因此以下代码在控制台中将输出true:

var bar = null;
console.log(typeof bar == "object");

所以知道了null的问题,同时检测bar是否是null,就可以避免这一问题啦:

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

bar是一个数组的时候,例如,当var bar = []的时候;在很多情况下,这是期望行为,因为数字是真正的对象,但如果你想数组也返回false时,可以修改上述方案:

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

二、下面的代码将输出什么到控制台?为什么?

(function(){
var a = b = 3;
})(); console.log(typeof a == "undefined");
console.log(typeof b == "undefined");

var a = b = 3;这句代码等同于:b = 3; var a = b;这时候变量b是不加var声明的变量,也就是全局变量,在函数内部没有var声明的变量是隐式全局变量。所以控制台打印的结果为:truefalse。 如果再深入一步:在严格模式(使用use strict),结果又会怎样? 在严格模式下运行的结果是:报错:b is not undefined;这正是严格模式的特点,避免不必要的bug(避免全局变量污染)。

三、关于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();

在外部函数中,thisself都是指向myObject,所以两者都可以正确的引用和访问foo,在内部函数中,this不再指向myObject,结果是this.foo没有在内部函数中被定义。在ECMA5之前,在内部函数中的this将指向全局的window对象;反之,因为作为ECMA5,内部函数中的功能this是未定义的。所以控制台将输出:bar ;bar ;undefined ;bar ;

四、use strict有什么意义和好处?

use strict 是一种在JavaScript代码运行时自动实行更严格解析和错误处理的方法。 严格模式的一些主要优点包括:

1.使调试更加容易。那些被忽略或默默失败了的代码错误,会产生错误或抛出异常,因此尽早提醒你代码中的问题,你才能更快地指引到它们的源代码。

2.防止意外的全局变量。如果没有严格模式,将值分配给一个未声明的变量会自动创建该名称的全局变量。这是JavaScript中最常见的错误之一。在严格模式下,这样做的话会抛出错误。

3.消除this强制。如果没有严格模式,引用null或未定义的值到this 值会自动强制到全局变量。这可能会导致许多令人头痛的问题和让人恨不得拔自己头发的bug。在严格模式下,引用 null或未定义的this值会抛出错误。

4.不允许重复的属性名称或参数值。当检测到对象中重复命名的属性,例如: var object = {foo: "bar", foo: "baz"};) 或检测到函数中重复命名的参数时,例如: function foo(val1, val2, val1){}) 严格模式会抛出错误,因此捕捉几乎可以肯定是代码中的bug可以避免浪费大量的跟踪时间。

5.使eval()更安全。在严格模式和非严格模式下,eval() 的行为方式有所不同。最显而易见的是,在严格模式下,变量和声明在eval() 语句内部的函数不会在包含范围内创建(它们会在非严格模式下的包含范围中被创建,这也是一个常见的问题源)。

6.在delete使用无效时抛出错误。delete 操作符(用于从对象中删除属性)不能用在对象不可配置的属性上。当试图删除一个不可配置的属性时,非严格代码将默默地失败,而严格模式将在这样的情况下抛出异常。

五、小心javascript自动插入分号机制?看下面的代码,它们会返回什么?

function foo1(){
return {
bar:"hello"
};
}
function foo2(){
return
{
bar:"hello"
};
}
console.log("foo1 returns:");
console.log(foo1());
consoel.log("foo2 returns:");
console.log(foo2());

以上代码将会打印出:

foo1 returns:
Object {bar:"hello"}
foo2 returns:
undefined

原因是这样的,当碰到 foo2()中包含return语句的代码行(代码行上没有其他任何代码),分号会立即自动插入到返回语句之后。请仔细留意上面两个函数中return的不同之处,foo2函数的return是单独一行的。也不会抛出错误,因为代码的其余部分是完全有效的,即使它没有得到调用或做任何事情(相当于它就是是一个未使用的代码块,定义了等同于字符串"hello"的属性 bar)。所以,在使用return语句的时候,要留意javascript的这个特点,尽可能不要将return关键字写在独立的一行,避免不必造成不必要的错误。 在《JavaScript语言精粹》这本书里,这个“自动插入分号”机制被划入到了JavaScript的毒瘤里面,与之并列的前面的全局变量。

六、NaN是什么?如何测试一个值是否等于NaN

NaN属性代表一个“不是数字”的值。这个特殊的值是因为运算不能执行而导致的,不能执行的原因要么是因为其中的运算对象之一非数字。例如:"abc" / 4,要么是因为运算的结果非数字。例如:除数为零。虽然NaN 意味着“不是数字”,但是它的类型,不管你信不信,是Number

console.log(typeof NaN === "number")   // true

此外, NaN 和任何东西比较,甚至是它自己本身,结果是false:

console.log(NaN == NaN)   // false

一种半可靠的方法来测试一个数字是否等于NaN,是使用内置函数 isNaN(),但即使使用isNaN() 依然并非是一个完美的解决方案。 一个更好的解决办法是使用value !== value,如果值等于NaN,只会产生true。因为只有NaN 这货,才会自己不等于自己。 另外,ES6提供了一个新的Number.isNaN() 函数,这是一个不同的函数,并且比老的全局isNaN()函数更可靠。

七、以下代码的运行结果是什么?

1.console.log(1 + "2" + "2"); // "122";

2.console.log(1 + +"2" + "2"); // "32";

根据运算的顺序,要执行的第一个运算是+"2"(第一个"2"前面的额外 +被视为一元运算符),因此,JavaScript"2" 的类型转换为数字,然后应用一元 + 号(即将其视为一个正数)。其结果就是得到一个数字2

3.console.log(1 + -"1" + "2"); // "02";

4.console.log(+"1" + "1" + "2"); // "112";

5.console.log("a" - "b" + "2"); // "NaN2";

6.console.log("a" - "b" + 2); // NaN;

八、关于逻辑运算符,下面代码的运行结果是什么?

console.log( 0 || 1);   // 1;
console.log( 1 || 2); // 1;
console.log( 0 && 1); // 0;
console.log( 1 && 2); // 2;

JavaScript中, ||&& 都是逻辑运算符,用于在从左至右计算时,返回第一个可完全确定的“逻辑值”。

九、以下代码输出的结果是什么?为什么?

var a = {},
b = {key:"b"},
c = {key:"c"};
a[b] = 123;
a[c] = 456;
console.log(a[b]);

JavaScript在设置对象的属性的时候,会暗中字符串化参数值;在以上代码中bc都是对象,把它们设置为对象a的参数,它们都将被转换为"[object Object]", 所以a[b]a[c]都相当于a['object Object'];所以a[c]会将a[b]的值覆盖掉,因此,设置或引用a[c]和设置或引用a[b] 完全相同。所以得到的答案是 456

十、说明以下代码的异同?

line-height:15px;
line-height:150%;
line-height:1.5;
line-height:1.5em;

行高为150%时,会根据父元素的字体大小先计算出行高值然后再让子元素继承。所以当line-height:150%时,子元素的行高等于父元素的fontSize值 * 150%;

当line-height:1.5em时,会根据父元素的字体大小先计算出行高值然后再让子元素继承。所以当line-height:1.5em时,子元素的行高等于父元素的fontSize值 * 1.5em;

当line-height:1.5时,会根据子元素的字体大小动态计算出行高值让子元素继承。所以,当line-height:1.5时,子元素行高等于子元素的fontSize值 * 1.5 = 45px;如果没有子元素,则以自身的fontSize值为准

十一、关于this指向,以下代码将输出什么?

var person = {
_name: 'I am John',
sayHello: function (){
return this._name;
}
}; var sayHello = person.sayHello; console.log(sayHello());
console.log(person.sayHello());

代码运行的结果是:

undefined
I am John

在执行sayHello()的时候,当访问到this._name时,此时的this已经不再是person 对象,而是全局窗口对象,也就是widnow对象。与此同时,widnow对象并不存在_name属性,所以返回的是undefined

js常见问题总结归纳的更多相关文章

  1. js知识简单归纳

    js简单的归纳 基本类型 number,string,boolean,null,undefined 组合类型 一种对象类型: object 数组 函数 对象 正则 关于函数 作用域 闭包 构造函数 原 ...

  2. Vue.js常见问题

    1.Vuejs组件 vuejs构建组件使用 Vue.component('componentName',{ /*component*/ }): 这里注意一点,组件要先注册再使用,也就是说: Vue.c ...

  3. JS 常见问题

    JavaScript 是一种有趣的语言,我们都喜欢它,因为它的性质.浏览器是JavaScript的主要运行的地方,两者在我们的服务中协同工作.JS有一些概念,人们往往会对它掉以轻心,有时可能会忽略不计 ...

  4. JS常见问题总结

    1. 什么是 JavaScript ? JavaScript 是一种具有面向对象的.解释型的.基于对象和事件驱动的.跨平台的.弱类型的程序设计语言 2. JavaScript 与 ECMAScript ...

  5. js小知识归纳(待续)

    1.javascript 中 if (window != top) top.location.href = location.href;的意思 如果当前窗口不是最上层窗口(比如是在Iframe中),那 ...

  6. JS常见问题

    语法错误 由于编程语言中的语法比自然语言的语法要严格得多,因此在编写脚本时对细节应倍加关注.例如,如果您本意是将字符串作为某个参数,但是在键入时忘了使用引号引起来,就会产生问题. 脚本解释顺序 对 J ...

  7. js常见问题之为什么点击弹出的i总是最后一个

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. Ember.js入门教程、博文汇总

    第一章 对象模型 Ember.js 入门指南——类的定义.初始化.继承 Ember.js 入门指南——类的扩展(reopen) Ember.js 入门指南——计算属性(compute properti ...

  9. Node.js实战(一)之概述

    , 一.Node.js介绍 Node.js是一个Javascript运行环境(runtime environment),发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进 ...

随机推荐

  1. Exadata中的dbserver_backup.sh脚本

    dbserver_backup.sh脚本在老版本的exadata中,它存放在/opt/oracle.SupportTools目录中,主要用于/根文件系统和/boot分区的备份.dbserver_bac ...

  2. js unicode

    参考 http://www.ruanyifeng.com/blog/2014/12/unicode.html

  3. 消息中间件 | 消息协议 | STOPM -- 《分布式 消息中间件实践》笔记

    12年,STOMP1.2规范发布  简单的文本消息传输协议,提供一种可互相操作的连接格式,允许客户端与任意消息服务器进行交互 主要的概念     STOMP包含客户端和服务器,其中客户端指生产者或消费 ...

  4. C++ | char* 在类中实践笔记

    在C++中,当类中定义有char * 变量时,在传参,构造函数,复制构造函数如何创建及赋值,来一个简单的例子就明了: #include<iostream> #include<stri ...

  5. Luogu P4159 [SCOI2009]迷路 矩阵快速幂+精巧转化

    大致就是矩阵快速幂吧.. 这个时候会发现这些边权$\le 9$,然后瞬间想到上回一道题:是不是可以建一堆转移矩阵再建一个$lcm(1,2,3,4,5,6,7,8,9)$的矩阵?...后来发现十分的慢q ...

  6. P2161 [SHOI2009]会场预约 (线段树:线段树上的不重复覆盖数)

    题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...

  7. mysql中 if语句的使用

    Mysql的if既可以作为表达式用,也可在存储过程中作为流程控制语句使用,如下是做为表达式使用: IF(expr1,expr2,expr3) IF表达式 代码如下: 如果 expr1 是TRUE (e ...

  8. eclipse导入maven项目有时出现web.xml is missing的问题

    今天导入一个从Git上pull下来的项目导入eclipse时,报错web.xml is missing,但是我检查了webapp下面的WEB-INF目录下是有web.xml的,然后就纠结了.纠结了半天 ...

  9. JVM基础知识2 垃圾收集器与内存分配策略

    如何判断堆中的哪些对象可以被回收 主流的程序语言都是使用根搜索算法(GC Roots Tracing)判定对象是否存活 基本思路是:通过一系列名为“GC Roots”的对象作为起点,从这些节点开始向下 ...

  10. Maven的安装以及介绍

    附录:带阿里源的maven用户设置文件-settings.xml <?xml version="1.0" encoding="UTF-8"?> &l ...