当前位置: 首页 > 科技观察

6个意想不到的JavaScript问题

时间:2023-03-12 01:09:40 科技观察

作为一名前端开发工程师,JavaScript是我们的主要开发语言。它的语法比较简单,生态系统也很完善,在社区的影响力越来越大。在我们的使用过程中,经常会遇到各种奇怪的问题,让我们时常感到困惑。受wtfjs的启发,本文整理了6个常见且有趣的问题。1、奇怪的try..catch:question:下面代码执行后会返回什么?2还是3?(()=>{try{return2;}finally{return3;}})();:bulb:Theansweris3,为什么?这是因为在try...catch...finally语句中,无论是否抛出异常,都会执行finally子句。此外,如果抛出异常,即使没有catch子句来处理异常,finally子句中的语句也会执行。:books:参考MDNtry...catch2,[]和null都是对象:question:下面3行代码返回的结果是什么?typeof[];typeofnull;nullinstanceofObject;:bulb:答案如下:typeof[];//->'object'typeofnull;//->'object'nullinstanceofObject;//falsetypeof运算符返回字符串,必须符合表37:typeof运算符返回值。对于未实现[[Call]]、普通对象、标准特殊对象和非标准特殊对象,它返回字符串'object'。console.log(typeof42);//预期输出:"number"console.log(typeof'前端自学课程');//预期输出:"string"console.log(typeoftrue);//预期输出:"boolean"console.log(typeofundeclaredVariable);//预期输出:"undefined"但是,您可以使用toString方法检查对象的类型。Object.prototype.toString.call([]);//->'[objectArray]'Object.prototype.toString.call(newDate());//->'[objectDate]'Object.prototype。toString.call(null);//->'[objectNull]':books:参考MDNtypeof3。箭头函数返回undefined:question:为什么question函数f2执行后返回undefined?letf1=()=>'前端自学课程';f1();//->'前端自学教程'letf2=()=>{};f2();//->undefined:bulb:Answerus乍一看,它应该返回{},但它返回undefined。本质原因是箭头函数返回的{}是箭头函数语法的一部分。我们可以通过写一个测试用例来看:letf2=()=>{return'前端自学课程'};f2();//->'前端自学教程'所以上面的f2函数返回undefined,当然如果需要返回一个{}对象也是可以的,只是返回值需要用括号括起来:让f2=()=>({});f2();//->未定义4。你还能用反引号来执行函数吗?:question:除了下面的方法,还有其他调用函数的方法吗?函数f(...args){返回args;}f(1,2,3);//->[1,2,3]当然我们可以用反引号调用:f`Hellostring${'前端自学课'},Helloboolean${false},Helloarray${[1,2,3]}`;/*[["你好字符串",",你好布尔值",",你好数组",""],"前端自学教程",false,[1,2,3]]*/:bulb:回答这个问题看起来很棒,但它实际上使用了模板字符串。这是模板字符串的高级形式,标记模板字符串。上面的示例代码中:f函数是模板字面量的标签,标签可以使用该函数解析模板字符串。label函数的第一个参数包含一个字符串值数组。其余参数与表达式有关。:books:参考MDN模板字符串。5.JavaScript中也有标签吗?:question:下面的写法有没有问题?foo:{console.log("你好");打破富;console.log("前端自学课");}:bulb:回答没问题,会返回Hello的字符串。因为foo被识别为标签,所以执行下面的console.log("Hello"),然后执行breakfoo中断执行。我们经常使用带标签的语句和break/continue语句来结束或继续循环:letstr='';loop1:for(leti=0;i<5;i++){if(i===1){继续循环1;}str=str+i;}console.log(str);//预期输出:"0234":books:refertoMDNlabel6.{}{}isundefined:question:questionus你可以在下面测试代码控制台。像这样的结构返回最后定义的对象中的值。{}{};//->未定义{}{}{};//->未定义{}{}{}{};//->undefined{foo:'bar'}{};//->'bar'{}{foo:'bar'};//->'bar'{}{foo:'bar'}{};//->'bar'{a:'b'}{c:'d'}{};//->'d'{a:'b',c:'d'}{};//>SyntaxError:意外的标记':'({}{});//>SyntaxError:Unexpectedtoken'{':bulb:Solution解析为{}时,会返回undefined,解析{foo:'bar'}{}时,表达式{foo:'bar'}将返回“酒吧”。这里的{}有两个意思:代表一个对象,或者代表一个代码块。例如,{}in()=>{}表示一个代码块。所以我们要加上括号:()=>({})才能让它正确返回一个对象。所以,我们现在使用{foo:'bar'}作为代码块,我们可以在终端中这样写:if(true){foo:"bar";}//->'bar'啊哈,结果一样!所以{foo:'bar'}{}中的花括号是代码块。