进阶2

1.JavaScript 定义了几种数据类型? 哪些是原始类型?哪些是复杂类型?原始类型和复杂类型的区别是什么?

进阶2_第1张图片
image.png

原始类型:number,string,boolean
复杂类型:object
特殊值:undefined,null
区别:原始类型(primitive type)的值是最基本的数据类型,不能再细分了。而对象称为合成类型(complex type),因为一个对象往往是多个原始类型的值的合成,可以看作是一个存放各种值的容器。

2.typeof和instanceof的作用和区别?

  • typeof:typeof是一元运算符,返回值为字符串,该字符串用来说明运算数的数据类型
进阶2_第2张图片
image.png
  • instanceof:是判断变量是否为某个对象的实例,返回值为true或false
进阶2_第3张图片
image.png

3.如何判断一个变量是否是数字、字符串、布尔、函数

数字,字符串,布尔,函数:利用typeof和toString

4.NaN是什么? 有什么特别之处?

NaN ,即非数值(Not a Number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)
特点:

  • 任何涉及 NaN 的操作(例如 NaN /10)都会返回 NaN ,这个特点在多步计算中有可能导致问题。
  • NaN 与任何值都不相等,包括 NaN 本身。

5.如何把非数值转化为数值?

在js中,有三个函数可以把非数值转换为数值,分别是Number() , ParseInt() , ParseFloat() 。其中Number()函数可以用于任何数据类型,另外2个则专门把字符串转换为数值

Number()转换规则
  • 如果是 Boolean 值,true 和 false 将分别被转换为 1 和0
  • 如果是数字值,只是简单的传入和返回
  • 如来是null 值,返回 0
  • 如果是 undefined,返回NaN
  • 如果是对象,则调用对象的 valueOf() 方法,然后依照前面的规则转换返回的值。如果转换的结果是 NaN,则调用对象的 toString() 方法,然后再次依照前面的规则转换返回的字符串值。
  • 如果是字符串,遵循下列规则:
    • 如果字符串中只包含数字,则将其转换为十进制数值,即"1"会变成1 , "123"会变成123,而"011"会变成11(注意,前导的0被忽略了);
    • 如果字符串中包含有效的浮点格式, 如"1.1",则将其转换为对应的浮点数值(同样,也会忽略前导零);
    • 如果字符串中包含有效的十六进制格式,例如"0xf",则将其转换为相同大小的十进制整数值;
    • 如果字符串是空的(不包含任何字符) ,则将其转换为0;
    • 如果字符串中包含除上述格式之外的字符,则将其转换为 NaN。
ParseInt()转换规则
  • parselnt() 函数在转换字符串时,更多的是看其是否符合数值模式,它会忽略字符串前面的空格,直至找到第一个非空格字符;如果第一个字符不是数字字符或者负号,parseInt() 就会返回 NaN;也就是说,用parselnt() 转换空字符时会返回 NaN(Nurnber() 对空字符返回 0); 如果第一个字符是数字字符,parselnt() 会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符。(例如,"1234blue"会被转换为1234 ,因为"blue"会被完全忽略;类似地,"'22.5"会被转换为22 ,因为小数点并不是有效的数字字符。)
  • 如果字符串中的第一个字符是数字字符,parselnt() 也能够识别出各种整数格式(十进制、八进制和十六进制数) 。也就是说,如果字符以"0x"开头且后跟数字字符,就会将其当作一个十六进制整数;如果字符串以"0"开头且后跟数字字符,则会将其当作一个八迸制数来解析。
ParseFloat()转换规则
  • parseFloat () 是从第一个字符(位置0)开始解析每个字符。而且也是一直解析到字符串末尾,或者解析到遇见一个无效的浮点数字字符为止。也就是说,字符串中的第一个小数点是有效的,而第二个小数点就是无效的了,因此它后面的字符串将被忽略。举例来说,"22.34.5"将会被转换为22.34 。
  • 除了第一个小数点有效之外, parseFloat () 与 parselnt() 的第二个区别在于它始终都会忽略前导的零。parseFloat() 可以识别前面讨论过的所有浮点数值格式,也包括十迸制整数格式,但十六进制格式的字符串则始终会被转换成0。由于 parseFloat() 只解析十进制值,因此它没有用第二个参数指定基数的用法。

6.==与===有什么区别

对于===,以下规则来判断是否相等
  • 如果类型不同,就[不相等]
  • 如果两个都是数值,并且是同一个值,那么[相等];(!例外)的是,如果其中至少一个是NaN,那么[不相等]。(判断一个值是否是NaN,只能用isNaN()来判断)
  • 如果两个都是字符串,每个位置的字符都一样,那么[相等];否则[不相等]。
  • 如果两个值都是true,或者都是false,那么[相等]。
  • 如果两个值都引用同一个对象或函数,那么[相等];否则[不相等]。
  • 如果两个值都是null,或者都是undefined,那么[相等]。
==根据以下规则来判断是否相等
  • 如果两个值类型相同,进行 === 比较。
  • 如果两个值类型不同,他们可能相等。根据下面规则进行类型转换再比较:
    • 如果一个是null、一个是undefined,那么[相等]。
    • 如果一个是字符串,一个是数值,把字符串转换成数值再进行比较。
    • 如果任一值是 true,把它转换成 1 再比较;如果任一值是 false,把它转换成 0 再比较。
    • 如果一个是对象,另一个是数值或字符串,把对象转换成基础类型的值再比较。对象转换成基础类型,利用它的toString或者valueOf方法。 js核心内置类,会尝试valueOf先于toString;例外的是Date,Date利用的是toString转换。
    • 任何其他组合,都[不相等]。

7.break与continue有什么区别

break 语句用于跳出循环。如下图所示

进阶2_第4张图片
image.png

continue 用于跳过循环中的一个迭代。如下图所示

进阶2_第5张图片
image.png

8.void 0 和 undefined在使用场景上有什么区别

对于undefined,它的在全局作用域中,不会被重写,但在局部作用域中可以被重写。
对于void可以给任何给定的表达式求值,并返回 undefined,并且 void 不可被重写,因此void 0是在局部作用域中替代undefined的最佳选择

你可能感兴趣的:(进阶2)