打卡 -- js

1、原始类型有哪几种?null是对象吗?基本数据类型和引用数据类型的区别?

01. 原始类型有5种:Number、Boolean、String、Undefined、Null

后来新增symbol以及未来ES10新增的BigInt(任意精度整数)七类

  Number:用来表示整数和浮点数,还有一种特殊的值即NaN,
            这个数值用来表示一个本来要返回数值的操作数未返回数值的情况
           (这样就不会抛出错误了)

  Boolean:有两个字面值:true和false

  String:用于表示由零或多个16位Unicode字符组成的字符序列,即字符串。
字符串可以由单引号(')或双引号(")表示。

   Undefined:只有一个值,即特殊的undefined,声明变量但是没有初始化,
              这个变量的值就是undefined

  Null:只有一个值null,表示一个空对象指针,正式使用typeof操作符检测null会返回object

引用类型有3种:Object类型、Array类型、Function类型

02. null是对象

03. 基本数据类型和引用数据类型的区别:

基本数据类型存储在内存,存储的是值,基本数据类型在内存中分别占有固定大小的空间,他们的值保存在栈空间,我们是通过按值来访问的。

复杂数据类型的值大小不固定,栈内存中存放地址指向堆内存中的对象,是按引用访问的。栈内存中存放的只是该对象的访问地址,在堆内存中为这个值分配空间。由于这种值的大小不固定,因此不能把它们保存到栈内存中。但内存地址大小的固定的,因此可以将内存地址保存在栈内存中。 这样,当查询引用类型的变量时, 先从栈中读取内存地址, 然后再通过地址找到堆中的值。对于这种,我们把它叫做按引用访问。
当我们把对象赋值给另外一个变量的时候,复制的是地址,指向同一块内存空间,当其中一个对象改变时,另一个对象也会变化。

附加:

打卡 -- js_第1张图片

打卡 -- js_第2张图片

 

2、说一下JS中类型转换的规则?

显式转换

通过手动进行类型转换,Javascript提供了以下转型函数

  1. 转换为数值类型:Number(mix)、parseInt(string,radix)、parseFloat(string)
  2. 转换为字符串类型:toString(radix)、String(mix)
  3. 转换为布尔类型:Boolean(mix)

隐式转换

  •   isNaN(mix)
  •   递增递减操作符(包括前置和后置)、一元正负符号操作符
  •   加法运算操作符
  •   乘除、减号运算符、取模运算符
  •   逻辑操作符(!、&&、||) 逻辑非(!)操作符
  •   关系操作符(<, >, <=, >=)
  •   相等操作符(==)

 

 

3、== 和 === 区别,什么情况 == ?

一言以蔽之:== 先转换类型再比较,=== 先判断类型,如果不是同一类型直接为false

  •   === 表示恒等于,比较的两边要绝对的相同
先说 ===,这个比较简单,具体比较规则如下:
1、如果类型不同,就不相等

2、如果两个都是数值,并且是同一个值,那么相等;例外的是,如果其中至少一个是NaN,那么不相等。
(判断一个值是否是NaN,只能用isNaN()来判断) 

3、如果两个都是字符串,每个位置的字符都一样,那么相等;否则不相等。 

4、如果两个值都是true,或者都是false,那么相等。 

5、如果两个值都引用同一个对象或函数,那么相等;否则不相等。 

6、如果两个值都是null,或者都是undefined,那么相等
  • 再说 ==,具体比较规则如下:
1、如果两个值类型相同,进行 === 比较,比较规则同上
 
2、如果两个值类型不同,他们可能相等。根据下面规则进行类型转换再比较: 
       a、如果一个是null、一个是undefined,那么相等。 
       b、如果一个是字符串,一个是数值,把字符串转换成数值再进行比较。 
       c、如果任一值是 true,把它转换成 1 再比较;如果任一值是 false,把它转换成 0 再比较。 
       d、如果一个是对象,另一个是数值或字符串,把对象转换成基础类型的值再比较。
       e、任何其他组合(array数组等),都不相等

 

4、为什么 0.1+0.2 != 0.3 ?

因为 JS 采用 IEEE 754 双精度版本(64位),并且只要采用 IEEE 754 的语言都有该问题,所以浮点数计算是不精确的。

下面可以用原生解决 0.1+0.2 的问题:

parseFloat((0.1 + 0.2).toFixed(10))

 

5、深拷贝与浅拷贝的区别?如何实现?

简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短。如果B没变,那就是深拷贝,自食其力。 

6、new的原理是什么?通过new的方式创建对象和通过字面量创建有什么区别?


 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(知识总结)