目录
- 前言
- 正文内容
- 总结
前言
这个东西来源在于本人开学推迟了之后呢,寻思着在家刚好可以去找个地方实习,因为刚刚结束大二,看了下相关岗位需求,因为计网还没学…只能去勉强试试前端开发,嗯然后投简历,hr筛选,被pass,简历,hr筛选,被pass…
终于,有一家 hr 发来了线上测试通知!!!!,但是这毕竟是第一次找实习,稀里糊涂脑子一热凭借着脑子里知识的残留就直接开始线上考试,复习这事情直接抛到了脑后。
主要考的方位有 JavaScript,html,数据结构,计算机网络,前端规范,ajax,vue 差不多这些,还有几个想不起来了,题目整体不是很难(毕竟我家乡的互联网大厂少之又少,可以忽略不计),但是坑多
然后,就遇到了这个…
嗯?!这什么玩意,感叹号加方括号????是我才疏学浅了…
虽然凭借着欧气选对了,但是为了防止再遇到依然不会,于是单独拿出来学习一下这玩意!!
正文内容
直接打开 webstorm 开始实践
javascript"> console.log([]);
console.log([].length);
console.log({});
console.log({}.length);
console.log(([] + {}))
console.log(([] + {}).length)
回忆一下 JavaScript 里 + 的机制,首先是判断是否 Number 型,其次如果其中有一个 string 型,那么另一个变量也会被转型成 string ,如果操作数为对象或者是数组这种复杂的数据类型,那么就将两个操作数都转换为字符串,进行拼接。
从上面控制台打印的结果不难看出 [] 就是个空数组,长度为 0,而 {} 似乎是一个空的 Object 对象 ,对象是没有 length 的。二者相加之后,却变成了 [object Object]。一个 Array 类型,一个 Object 类型,都是复杂数据类型,相加的规则应该是都转成 String 类型之后拼接,那就好理解了
- [ ] 在运算中其实就相当于 ’ ’ ,就是一个空的字符串
- { } 在运算中其实就相当于 [object Object] ,就是一个字符串
所以这俩加起来长度会是 15
接下来再来一组例子
javascript"> console.log(!+[])
console.log((!+[]).length)
console.log(!+{})
console.log((!+{}).length)
console.log(!+[] + {})
console.log((!+[] + {}).length)
这里稍微补充一些 !的知识
- ! 逻辑非,将操作数的布尔值求反
! null —> true (等同于 Boolean ( null ) —> false ,加上非,结果取反)
! undefined —>true, ! 1 —> false, ! [] —> false - !! 类型转换,将对应的类型转换为Boolean型
!! null —> false (等同于 Boolean ( null ) —> false )
!! unsefined —> false, !! 1 ==> true, !! [] —> true
从其他大佬那里拿过来一个图,可以对比看看
了解了这些之后,我们再回来看这个
javascript"> console.log(!+[])
console.log((!+[]).length)
! + []
按照规则,先整体转化成 String 然后拼接成 !''
, 然后就相当于! Boolean ([])
,结果就变成了 true
,一个布尔值自然是没有 length 属性的,所以 undefined。
再来看第二个
javascript"> console.log(!+{})
console.log((!+{}).length)
! + {}
按照规则,先整体转化成 String 然后拼接成 !{}
,然后就相当于! Boolean ({})
,,结果为 true
,同样没有 length 属性的,所以 undefined。
然后看第三个
javascript"> console.log(!+ [] + {})
console.log((!+ [] + {}).length)
- JavaScript 的 + 运算是从左往右 的!!,顺序不同结果不一样
首先! + [] + {}
中的! + []
相加变成true
,然后true + {}
结果变成了true[object Object]
,所以 length 为 19
变个顺序再看看
javascript"> console.log(! + {} + [])
console.log((! + {} + []).length)
首先! + {} + []
中的! + {}
相加变成 true
,然后 true + []
结果变成了true
,所以 length 为 4
最后,再来解决一下这道面试题
javascript">console.log((!+[] + [] + ![]).length)
!+[] + [] + ![]
中首先!+[]
结果为 true
,true + []
的结果依然是 true
,true + ![]
就相当于true + ! Boolean( [] )
,结果就是truefalse
,所以length 就是 9
多说一句:JavaScript中的减法就不会这么金贵,减法会把参与计算的数字全部化为 Number 进行运算,只要无法转换,就会 NAN
javascript"> console.log(false -1)
console.log(true -1)
console.log(true -"a")
总结
平时感觉会的东西稍加改造自己就蒙了,所以通过这些面试题可以更快的提高自己。