JavaScript易错点总结

1、Boolean和Number运算

console.log(Boolean([]))//true,while([])相当于while(Boolean([]))
console.log(Boolean(''))//false
console.log(Boolean(0))//false
console.log(Boolean(null))//false
console.log(Boolean(undefined))//false
console.log(Boolean(NaN))//false
console.log(Number([]))//0
console.log(Number(''))//0
console.log(Number(null))//0
console.log(Number(undefined))//NaN
console.log(Number(NaN))//NaN
console.log(null==undefined)//true
console.log(null===undefined)//false
console.log([]==true?true:false)//false,空数组
console.log([1]==true?true:false)//true,非空数组

2、数组差值时的map陷阱

想象一下你有这样的代码:

var a = [1, 2, 3];

a)这会导致崩溃吗?

a[10] = 99;

b)这个输出是什么?

console.log(a[6]);

a)它不会崩溃。 JavaScript引擎将使阵列插槽3至9成为“空插槽”。

b)在这里,a [6]将输出未定义的值,但时隙仍为空,而不是未定义的。在某些情况下,这可能是一个重要的细微差别。例如,使用map()时,map()的输出中的空插槽将保持为空,但未定义的插槽将使用传递给它的函数重映射

var b = [undefined];

b[2] = 1;

console.log(b); // (3) [undefined, empty × 1, 1]

console.log(b.map(e => 7)); // (3) [7, empty × 1, 7]

3、typeof undefined == typeof NULL的值是什么?console.log(typeof typeof 1);返回什么

该表达式将被评估为true,因为NULL将被视为任何其他未定义的变量。
注意:JavaScript区分大小写,我们在这里使用NULL而不是null。

console.log(typeof undefined)//'undefined'
console.log(typeof Undefined)//'undefined'
console.log(typeof UNDEFINED)//'undefined'
console.log(typeof null)//'object'
console.log(typeof Null)//'undefined'
console.log(typeof NULL)//'undefined'
console.log(typeof typeof 1);//'string'

4、以下代码输出什么

var b = 1;
        function outer() {
            var b = 2
            function inner() {
                b++;
                console.log(b)
                var b = 3;
                console.log(b)
            }
            inner();
        }
        outer();

输出:

NaN
3

上述代码inner()函数相当于

function inner () {
//变量提升
    var b; // b is undefined

    b++; // b is NaN
    console.log(b);
    b = 3; // b is 3

    console.log(b); // output "3"

}

5、你如何克隆一个对象?

var obj = {a: 1 ,b: 2}
//Object.assign(目标,源1,源2)
var objclone = Object.assign({},obj);

现在objclone的值是{a:1,b:2},但指向与obj不同的对象。
但请注意潜在的缺陷:Object.clone()只会执行浅拷贝,而不是深拷贝。这意味着嵌套的对象不会被复制。他们仍然引用与原始相同的嵌套对象

let obj = {
    a: 1,
    b: 2,
    c: {
        age: 30
    }
};

var objclone = Object.assign({},obj);
console.log('objclone: ', objclone);

obj.c.age = 45;
console.log('After Change - obj: ', obj.c.age); // 45 - This also changes
console.log('After Change - objclone: ', objclone.c.age); // 45

6、考虑下面的代码。输出是什么,为什么?

(function () {

    try {

        throw new Error();

    } catch (x) {

        var x = 1, y = 2;

        console.log(x);

    }

    console.log(x);

    console.log(y);

})();
//输出
1
undefined
2

var语句被提升(没有它们的值初始化)到它所属的全局或函数作用域的顶部,即使它位于with或catch块内。但是,错误的标识符只在catch块内部可见。它相当于:

(function () {

    var x, y; // outer and hoisted

    try {

        throw new Error();

    } catch (x /* inner */) {

        x = 1; // inner x, not the outer one

        y = 2; // there is only one y, which is in the outer scope

        console.log(x /* inner */);

    }

    console.log(x);

    console.log(y);

})();

7、以下代码的输出是什么?

var length = 10;

function fn() {
    console.log(this.length);
        console.log(this)
}

var obj = {

  length: 5,

  method: function(fn) {

    fn();

    arguments[0]();

  }

};

obj.method(fn, 1);

输出:

10
Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, frames: Window, …}
2
Arguments(2) [ƒ, 1, callee: ƒ, Symbol(Symbol.iterator): ƒ]

首先,由于fn作为函数方法的参数传递,函数fn的作用域(this)是窗口。 var length = 10;在窗口级别声明。它也可以作为window.length或length或this.length来访问(当这个===窗口时)。

方法绑定到Object obj,obj.method用参数fn和1调用。虽然方法只接受一个参数,但调用它时已经传递了两个参数;第一个是函数回调,其他只是一个数字。

当在内部方法中调用fn()时,该函数在全局级别作为参数传递,this.length将有权访问在Object obj中定义的var length = 10(全局声明)而不是length = 5.

现在,我们知道我们可以使用arguments []数组访问JavaScript函数中的任意数量的参数。因此arguments[0]只不过是调用fn()。在fn里面,这个函数的作用域成为参数数组,并且记录参数[]的长度将返回2。

8、以下代码的输出是什么?

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

原因如下:设置对象属性时,JavaScript会隐式地将参数值串联起来(相同的键值后者覆盖前者)。在这种情况下,由于b和c都是对象,它们都将被转换为“[object Object]”。因此,a [b]和a [c]都等价于[“[object Object]”],并且可以互换使用。因此,设置或引用[c]与设置或引用[b]完全相同。

参考资料

37个JavaScript基本面试问题和解答

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,692评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,482评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,995评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,223评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,245评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,208评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,091评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,929评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,346评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,570评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,739评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,437评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,037评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,677评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,833评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,760评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,647评论 2 354

推荐阅读更多精彩内容

  • 策划要求施法范围显示为球形,和地面上的物体相交处高亮,我开始想用Projector投影,但是只能实现柱形,后来想到...
    rekcah1986阅读 2,550评论 0 6
  • 晚上开会时,旁边一同事把他的烟放在了桌子上,因为就在我斜前方,我无聊的就顺手拿在了手中把玩着。 不知出于何种想法,...
    浪里周小白阅读 238评论 0 0
  • 花儿在生长的过程中,一边吸纳进各种养分,一边释放出各种信号,在一个完全开放的能量系统里,花儿一呼一吸间即达成了生命...
    文心访艺阅读 237评论 1 1
  • 常用快捷键 快捷键一:开启代码提示 PS: 习惯了Xcode开发的小编用到JAVA的Eclipse是很不习惯的,其...
    KODIE阅读 1,016评论 0 1