JavaScript是每个前端开发者都应该掌握的基础技术,但很多时候,你可能并不完全理解JavaScript。检测一个人的技术水平有两种很简单的方法,看他写的代码,或者让他看别人写的代码。我总结了一些可以测试您对JavaScript的理解的代码问题。你可以试着做一下,看看你能不能全部答对。正确回答所有问题,您就会了解一些JavaScript。第一个问题试图猜测它的输出:constperson={name:'CodeandBeast'}Object.defineProperty(person,'age',{value:18})console.log(person.age)console.log(Object.keys(person))Output:18['name']解析:很多人容易误会第二个输出,因为defineProperty定义的属性默认是不可枚举的。第二个问题试图猜测它的输出:constname='codeandbeast'age=18console.log(deletename)console.log(deleteage)console.log(typeofage)output:falsetrue"undefined"parsing:firstfalse是因为delete只能删除对象上的属性,name不是属性,所以删除失败。第二个是因为我们没有使用任何声明来创建一个变量,它会被当做一个全局变量挂载到window对象上,相当于删除window.age,所以删除成功。第三个未定义是因为年龄被删除了。第三个问题试图猜测它的输出:letperson={name:'CodeandBeast'}constmembers=[person]person=nullconsole.log(members)output:[{name:"CodeandBeast"}]很多人认为输出应该是[null],但是我们只是给变量person设置了一个新的引用,之前的引用还在members中。简单的说,{name:'CodeandBeast'}这个对象存在于某个内存空间,假设它的地址是X201。其逻辑大致如下:letperson=X201constmembers=[X201]persion=null问题4尝试猜测其输出:functionSuperHero(){this.make='CodeandBeast'return{make:'TheBeastandCode'}}constmySuperhero=newSuperHero()console.log(mySuperhero)output:{make:"BeastandCode"}分析:如果构造函数最后返回一个对象,那么之前设置的属性将失效。第五个问题试图猜测它的输出:constname='CodeandBeast'console.log(name.padStart(14))console.log(name.padStart(2))output:"CodeandBeast""CodeandBeast"分析:padStart方法可以在字符串开头填充空格。参数是新字符串的总长度,如果这个长度比原来的字符串长度短,则不进行填充。第六个问题尝试猜测它的输出:console.log(parseInt("7"))console.log(parseInt("7*6"))console.log(parseInt("7Din"))output:777分析:如果parseInt的参数是字符串和数字的组合,那么它会从头开始检查,直到遇到数据类型错误的位置,如果数据类型错误的位置之前有一个有效的数字,则返回数字。第七题尝试猜测其输出:[1,2,3,4].reduce((x,y)=>console.log(x,y))输出:12undefined3undefined4分析:如果我们不传初值reduce,则x将是数组的第一个值,y将是数组的第二个值。第八题试图猜测它的输出:functiongetUserInfo(one,two,three){console.log(one)console.log(two)console.log(three)}constsuperHero='CodeandBeast'constage=1000getUserInfo`${superHero}is${age}岁`getUserInfo`hello`输出:["","is","years"]"codeandbeast"1000["hello"]undefinedundefined解析:我们使用模板字符串语法调用函数时,第一个参数始终是拆分字符串数组。其余的参数是模板表达式的值。第九题试图猜测它的输出:(()=>{letx,y;try{thrownewError()}catch(x){(x=1),(y=2);console.log(x)}console.log(x)console.log(y)})()output:1undefined2分析:catch中访问x,访问的是参数,不是外部变量x。第十题尝试猜测它的输出:classClazz{}console.log(typeofClazz)output:"function"分析:在JavaScript中,Class也是函数。第十一题试图猜测它的输出:constarr=[7,1,4,3,2];for(constelemofarr){setTimeout(()=>console.log(elem),elem);}输出:12347解析:没什么好解释的……第十二题试着猜猜它的输出:constfoo={bar:1};with(foo){varbar=2};console.log(foo.bar);输出:2解析:with的对象将作为全局对象使用。在with中使用var相当于window.[xxx]。然后foo就是那个窗口。
