JavaScript 定义了几种数据类型? 哪些是原始类型?哪些是复杂类型?原始类型和复杂类型的区别是什么?
JavaScript语言的每一个值,都属于某一种数据类型。JavaScript的数据类型,共有六种。
- 数值(number):整数和小数(比如1和3.14)
- 字符串(string):字符组成的文本(比如"Hello World")
- 布尔值(boolean):true(真)和false(假)两个特定值
- undefined:表示“未定义”或不存在,即此处目前没有任何值
- null:表示空缺,即此处应该有一个值,但目前为空
- 对象(object):各种值组成的集合
数值、字符串、布尔值称为原始类型(primitive type)的值,即它们是最基本的数据类型,不能再细分了。
将对象称为复杂类型(complex type)的值,因为一个对象往往是多个原始类型的值的合成,可以看作是一个存放各种值的容器。
至于undefined和null,一般将它们看成两个特殊值。
typeof和instanceof的作用和区别?
typeof是一元运算符,返回值为字符串,该字符串用来说明运算数的数据类型。返回的值有number、boolean、undefined、function、object、string
- number:数字会返回number类型
- boolean:boolean值只有true和false
- undefined:当变量未被声明时会返回undefined
- function:当运算数为函数时,返回function
- obeject:对象、数组、null会返回object。正因为typeof遇到数组、null都会返回object,所以我们要判断某个对象是否是数组或者某个变量是否是对象的实例时就要使用instanceof
- string:当运算数为字符串时会返回string
instanceof用于判断某个变量是否是某个对象的实例,返回值为true或false
var a=new Date();console.log(a instanceof Date);
true
console.log(a instanceof Array)
false
如何判断一个变量是否是数字、字符串、布尔、函数
typeof和toString
toString方法举例:
NaN是什么? 有什么特别之处?
NaN ,即非数值(Not a Number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)
特点:
- 任何涉及 NaN 的操作(例如 NaN /10)都会返回 NaN ,这个特点在多步计算中有可能导致问题。
- NaN 与任何值都不相等,包括 NaN 本身。
如何把非数值转化为数值?
-
Number:
- 如果是 Boolean 值,true 和 false 将分别被转换为 1 和0
- 如果是数字值,只是简单的传入和返回
- 如来是null 值,返回 0
- 如果是 undefined,返回NaN
- 如果是对象,则调用对象的 valueOf() 方法,然后依照前面的规则转换返回的值。如果转换的结果是 NaN,则调用对象的 toString() 方法,然后再次依照前面的规则转换返回的字符串值。
- 如果是字符串,遵循下列规则:
1. 如果字符串中只包含数字,则将其转换为十进制数值,即"1"会变 成1 , "123"会变成123,而"011"会变成11(注意,前导的0被忽略了);
2. 如果字符串中包含有效的浮点格式, 如"1.1",则将其转换为对应的浮点数值(同样,也会忽略前导零);
3. 如果字符串中包含有效的十六进制格式,例如"0xf",则将其转换为相同大小的十进制整数值;
4. 如果字符串是空的(不包含任何字符) ,则将其转换为0;
5. 如果字符串中包含除上述格式之外的字符,则将其转换为 NaN。
-
parseInt:
- 忽略字符串前面的空白字符,找到第一个非空白字符
- 如果第一个字符不是-或者数字返回NaN
- 如果是继续解析,直到非数值模式为止
- 0开头会当做八进制,0x开头会当做十六进制,但是可以指定第二个参数指定基数
-
parseFloat:
- parseFloat () 是从第一个字符(位置0)开始解析每个字符。而且也是一直解析到字符串末尾,或者解析到遇见一个无效的浮点数字字符为止。也就是说,字符串中的第一个小数点是有效的,而第二个小数点就是无效的了,因此它后面的字符串将被忽略。举例来说,"22.34.5"将会被转换为22.34 。
- 除了第一个小数点有效之外, parseFloat () 与 parselnt() 的第二个区别在于它始终都会忽略前导的零。parseFloat() 可以识别前面讨论过的所有浮点数值格式,也包括十迸制整数格式,但十六进制格式的字符串则始终会被转换成0。由于 parseFloat() 只解析十进制值,因此它没有用第二个参数指定基数的用法。
==与===有什么区别
对于===:
- 如果类型不同,就[不相等]
- 如果两个都是数值,并且是同一个值,那么[相等];(!例外)的是,如果其中至少一个是NaN,那么[不相等]。(判断一个值是否是NaN,只能用isNaN()来判断)
- 如果两个都是字符串,每个位置的字符都一样,那么[相等];否则[不相等]。
- 如果两个值都是true,或者都是false,那么[相等]。
- 如果两个值都引用同一个对象或函数,那么[相等];否则[不相等]。
- 如果两个值都是null,或者都是undefined,那么[相等]。
对于==:
如果两个值类型相同,进行 === 比较。
-
如果两个值类型不同,他们可能相等。根据下面规则进行类型转换再比较:
- 如果一个是null、一个是undefined,那么[相等]。
- 如果一个是字符串,一个是数值,把字符串转换成数值再进行比较。
- 如果任一值是 true,把它转换成 1 再比较;如果任一值是 false,把它转换成 0 再比较。
- 如果一个是对象,另一个是数值或字符串,把对象转换成基础类型的值再比较。对象转换成基础类型,利用它的toString或者valueOf方法。 js核心内置类,会尝试valueOf先于toString;例外的是Date,Date利用的是toString转换。
- 任何其他组合,都[不相等]。
break与continue有什么区别
break:跳出循环,在一个循坏体内,一旦碰到break那么立即跳出循坏,后面所有的循坏都将不再执行。
for(var i=1;i<10;i++){
if(i%4 == 0){
break;
}
console.log(i);打印的结果是(1,2,3)
}
continue:跳出本次循环后,执行下次循坏
for(var i=1;i<10;i++){
if(i%4 == 0){
continue;
}
console.log(i);打印的结果是(1,2,3,5,6,7,9)
}
void 0 和 undefined在使用场景上有什么区别
对于undefined,它的在全局作用域中,不会被重写,但在局部作用域中可以被重写。
对于void可以给任何给定的表达式求值,并返回 undefined,并且 void 不可被重写,因此void 0是在局部作用域中替代undefined的最佳选择