你不知道的js

74 阅读2分钟

1.调试用console.log的输出结果可信吗?

console.log()打印出来的内容并不一定可信,一般建议使用debugger。对于基本数据类型number、string、boolean、null、undefined的输出是可信的。但是对于Object等引用类型来说,会出现异常的情况。 不展开对象看时,console.log()是按照代码执行顺序,同步地输出了对象当时的快照。所以我们看到的是预期的值。 展开对象时,它其实是重新去内存中读取对象的属性值,此时对象属性已被更改,所以展开对象后,可能看到的不是预期值了。

微信图片_20230421100604.png

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