前言
题目来自Daily-Interview-Question 木易杨
欢迎star,加入讨论
本文记录自己对题目的解决方式以及综合大神们的看法。
题目
1、分别写出如下代码的返回值
String('11') == new String('11')
String('11') === new String('11')
答案:
true
false
理由:
==
操作符会调用toString()方法
实际运行的是
String('11') == new String('11').toString()
===
比较就比较严格,因为String('11')是字符串,new String('11')是对象,所以不相等。
2、不用加减乘除运算符,求整数的7倍
位运算 NOT
符号:~
位运算 NOT 实质上是对数字求负,然后减 1。
位运算 AND
符号:&
相同为1,不同为0
位运算 OR
符号:|
有1就是1
位运算 OR
符号:^
不同为1,相同为0
左移运算
符号:<<
左移运算保留数字的符号位。
左移x位就是乘以2的x次方
有符号右移运算
符号:>>
有符号右移运算保留数字的符号位。
有符号右移x位就是除以2的x次方
无符号右移运算
符号:>>>
对于正数跟有符号运算结果一致
对于负数:
//把这个数字转换成无符号的等价形式(尽管该数字本身还是有符号的),可以通过以下代码获得这种形式:
let iUnsigned64 = -64 >>> 0
alert(iUnsigned64.toString(2))
//11111111111111111111111111000000
此题未完待续
扩展
- 不使用临时变量,交换两个数
答案:
let a = 5
let b = 8
b = a ^ 0
a = b ^ 0
3、React / Vue项目时为什么要在列表组件中写 key,其作用是什么?
答案:
React / Vue项目时为什么要在列表组件中写 key,其作用是什么?
Vue中的key
- key是给每一个vnode的唯一id,可以依靠key,更准确, 更快的拿到oldVnode中对应的vnode节点。
- 因为带key就不是就地复用了,在sameNode函数 a.key === b.key对比中可以避免就地复用的情况。所以会更加准确。
- 利用key的唯一性生成map对象来获取对应节点,比遍历方式更快。
- 另外,vue中某些情况下不带key可能性能更好,在遍历模板简单的情况下,会导致虚拟新旧节点对比更快,节点也会复用。而这种复用是就地复用。
React中的key
- key帮助React识别哪些项目已更改,已添加或已删除。应该为数组内部的元素赋予键,以使元素具有稳定的标识
4、['1', '2', '3'].map(parseInt) what & why ?
['1', '2', '3'].map(parseInt)
答案:
['1', '2', '3'].map(parseInt) what & why ?
- map函数的第一个参数callback接收两个参数,第一个参数代表当前被处理的元素,而第二个参数代表该元素的索引。
- parseInt则是用来解析字符串的,使字符串成为指定基数的整数。
parseInt(string, radix)
1、parseInt('1', 0) //radix为0时,且string参数不以“0x”和“0”开头时,按照10为基数处理。这个时候返回1
2、parseInt('2', 1) //基数为1(1进制)表示的数中,最大值小于2,所以无法解析,返回NaN
3、parseInt('3', 2) //基数为2(2进制)表示的数中,最大值小于3,所以无法解析,返回NaN
4、map函数返回的是一个数组,所以最后结果为[1, NaN, NaN]
扩展:
let unary = fn => val => fn(val)
let parse = unary(parseInt)
console.log(['1.1', '2', '0.3'].map(parse))
输出结果是?
答案:
[1,2,0]
理由:
将parseInt放进unary的意思是返回一个只带一个参数的parseInt函数出来。
parseInt第二个参数默认为十进制。
用babel编译一下就好理解多了
"use strict";
var unary = function unary(fn) {
return function (val) {
return fn(val);
};
};
var parse = unary(parseInt);
console.log(['1.1', '2', '0.3'].map(parse));
网友评论