1.调试用console.log的输出结果可信吗?
console.log()打印出来的内容并不一定可信,一般建议使用debugger。对于基本数据类型number、string、boolean、null、undefined的输出是可信的。但是对于Object等引用类型来说,会出现异常的情况。 不展开对象看时,console.log()是按照代码执行顺序,同步地输出了对象当时的快照。所以我们看到的是预期的值。 展开对象时,它其实是重新去内存中读取对象的属性值,此时对象属性已被更改,所以展开对象后,可能看到的不是预期值了。
2.对象的定义
如果对象里面有两个名称相同的键,则键会被替换掉。它仍然位于原先出现的位置,但是值是最后出现那个键的值
const obj = { a: 1, b: 2, a: 3 }
console.log(obj)
//{ a: 3, b:2 }
3.null和undefined当成数值
1 + null // 1
1 + undefined // NaN
Number(null) // 0
Number(undefined) // NaN
4.parseInt奇怪的 bug
parseInt(1000000000000000000000) // 1 相当于parseInt('1e+21')
parseInt(0.0000008); // 8 相当于parseInt('8e-7')
parseInt(12.33); // 12
自动转为科学计数法的数字,parseInt会将科学计数法的表示方法视为字符串
5. === 与 >=
对象 === 比较的是内存地址,而 >= 将比较转换后的值
{} === {} // false
// 隐式转换 toString()
{} >= {} // true
6.构造函数返回值
-
在构造函数里面,如果不写return的话默认就是返回创建的实例对象。
-
如果写了return, return的是一个基本数据类型的话。比如,boolean,number,undefined等那么仍然返回实例对象;
-
如果写了return,return的是一个对象的话,则返回该对象。原本的指向实例对象的this会被无效化。
// 不返回
function People() {}
const people = new People(); // People {}
// 返回数字
function People() {
return 1;
}
const people = new People(); // People {}
// 返回新对象
function People() {
return {
name: 'zhangsan',
};
}
const people = new People(); // { name: 'zhangsan' }
7.NaN不等于本身
NaN表示一个范围,任何数与它都不相等
const x = NaN;
x !== x // true