在这里记录着每天自己遇到的一道印象深刻的前端问题,以及一道生活中随处可见的小问题。
强迫自己形成积累的习惯,鞭挞自己不断前行,共同学习。
[] == ![]
结果为 true
,而 {} == !{}
却为 false
点击 首先了解一下类型转化的规则:
1、如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值——false 转换为 0,而 true 转换为 1;
2、如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值
3、如果一个操作数是对象,另一个操作数不是,则调用对象的 valueOf()(boolean 对象方法)方法或者 toString()方法,用得到的基本类型值按照前面的规则进行比较
null 和 undefined 是相等的
4、要比较相等性之前,不能将 null 和 undefined 转换成其他任何值
5、如果有一个操作数是 NaN,则相等操作符返回 false ,而不相等操作符返回 true。重要提示:即使两个操作数都是 NaN,相等操作符也返回 false 了;因为按照规则, NaN 不等于 NaN (NaN 不等于任何值,包括他本身)
6、如果两个操作数都是对象,则比较它们是不是同一个对象,如果两个操作数都指向同一个对象,则相等操作符返回 true;否则,返回 false
7、 !
可将变量转换成 boolean 类型,null、undefined、NaN 以及空字符串('')取反都为 true,其余都为 false。
现在开始分析题目
[] == ![]; // 先转化右边 ![], // `!`可将变量转换成 boolean 类型,null、undefined、NaN 以及空字符串('')取反都为 true,其余都为 false。 // 所以 ![] => false => 0 // 左边 [], 因为[].toString() 为空字符串,所以 [] => '' // 综上, '' == 0, 为 true
{} == !{} // 先转化右边 !{}, // `!`可将变量转换成 boolean 类型,null、undefined、NaN 以及空字符串('')取反都为 true,其余都为 false。 // 所以 !{} => false => 0 // 左边 ({}).toString() => "[object Object]" // 综上, "[object Object]" == 0, 为 false 状态码: 客户端的每一次请求,服务器都必须给出回应。回应包括 HTTP 状态码和数据两部分。
服务器回应: API 返回的数据格式,不应该是纯文本,而应该是一个 JSON 对象,因为这样才能返回标准的结构化数据。所以,服务器回应的 HTTP 头的 Content-Type
属性要设为 application/json。
优点
简洁明了,一目了然;轻量,直接通过 http,不需要额外的协议,post/get/put/delete 操作
缺点
当一次更新的内容多的时候需要调用更多的接口。删除也是,如果我想批量删除呢?
ppi 越高,每英寸像素点越多,图像越清晰;我们可以类比物体的密度,密度越大,单位体积的质量就越大,ppi 越高,单位面积的像素越多。 ppi 在 120-160 之间的手机被归为低密度手机,160-240 被归为中密度,240-320 被归为高密度,320 以上被归为超高密度(例如:苹果的 Retina 屏幕)
__proto__
和 prototype
的区别 ?
点击 __proto__
,可称为隐式原型,一个对象的隐式原型指向构造该对象的构造函数的原型,这也保证了实例能够访问在构造函数原型中定义的属性和方法。
指数位为负数的怎么保存?为了减少不必要的麻烦,IEEE 规定了一个偏移量,对于指数部分,每次都加这个偏移量进行保存,这样即使指数是负数,那么加上这个偏移量也变为正数啦。为了使所有的负指数加上这个偏移量都能够变为正数,IEEE 规定 1023 为双精度的偏移量。 因此指数部分为 -4 + 1023 = 1019, 转化成 11 位二进制为:01111111011 因此 0.1 在内存中的保存为: 0 01111111011 1001100110011001100110011001100110011001100110011001
var args=[].slice.call(arguments,1)
是什么意思?
点击 先看原函数:
function a() { var args = [].slice.call(arguments, 1); console.log(args); } a("haha", 1, 2, 3, 4, 5); // log出[1, 2, 3, 4, 5] a("run", "-g", "-b"); // log出['-g', '-b'] 复制代码
0.1 + 0.2 !== 0.3
?
点击 IEEE-754 精度问题
所有使用 IEEE-754 数字实现的编程语言都有这个问题。
0.1 和 0.2 的二进制浮点数表示并不是精确的,所以相加后不等于 0.3。这个相加的结果接近 0.30000000000000004。
首先将 0.1 转化为 2 进制
// 0.1 十进制 -> 二进制 0.1 * 2 = 0.2 取0 0.2 * 2 = 0.4 取0 0.4 * 2 = 0.8 取0 0.8 * 2 = 1.6 取1 0.6 * 2 = 1.2 取1 0.2 * 2 = 0.4 取0 0.4 * 2 = 0.8 取0 0.8 * 2 = 1.6 取1 0.6 * 2 = 1.2 取1 //0.000110011(0011)` 0.1二进制(0011)里面的数字表示循环
你会发现 0.1 转二级制会一直无线循环下去,根本算不出一个正确的二进制数。
所以我们得出 0.1 = 0.000110011(0011),那么 0.2 的演算也基本如上所示,所以得出 0.2 = 0.00110011(0011)
六十四位中符号位占一位,整数位占十一位,其余五十二位都为小数位。因为 0.1 和 0.2 都是无限循环的二进制了,所以在小数位末尾处需要判断是否进位(就和十进制的四舍五入一样)
那么把这两个二进制加起来会得出 0.010011....0100 , 这个值算成十进制就是 0.30000000000000004