JavaScript 定义了几种数据类型? 哪些是原始类型?哪些是复杂类型?原始类型和复杂类型的区别是什么?
JS定义了7种数据类型:
- 数值(number):整数和小数(比如1和3.14)
- 字符串(string):字符组成的文本(比如"Hello World")
- 布尔值(boolean):true(真)和 false(假)两个特定值
- undefined:表示“未定义”或不存在,即此处目前没有任何值
- null:表示空缺,即此处应该有一个值,但目前为空
- 对象(object):各种值组成的集合
- Symbol:ES6新增
原始数据类型有:
- 数值、字符串和布尔值
复杂数据类型有:
- 对象
注意: undefined
和null
比较特殊,不属于上述两种分类中的任何一种
原始类型和复杂类型的数据区别是:
- 原始类型的数据是数据的基本单元,不能再细分
- 复杂类型的数据往往是原始类型数据的组合,可以把它看做是数据的容器
typeof
和instanceof
的作用和区别?
typeof
和instanceof
都是一种运算符
-
typeof
返回一个值的数据类型 -
instanceof
检测对象的类型
区别是:
-
typeof
在判断字符串、数组、布尔值和undefined
时非常准确,但在判断对象类型时(如数组、正则表达式)结果并不准确 -
typeof
用法为:typeof variable
,返回数据类型名称的字符串 -
instanceof
则能判断变量是不是某种对象类型,弥补了typeof
的不足 -
instanceof
用法为:variable instanceof cunstructor
,返回一个布尔值 - 用
instanceof
检测原始类型的数值始终会返回false
注意:typeof null
返回object
,但null instanceof Object
返回false
如何判断一个变量是否是数字、字符串、布尔、函数
function getType (value) {
if (value && (typeof value === 'number' || 'string' || 'boolean' || 'function')) {
console.log(typeof value);
return;
} else {
console.log('this is not a Number, String, Boolean or Function');
return;
}
}
getType (123); // number
getType ('hello') // string
getType (true) // boolean
getType (function f(){}) // function
NaN是什么? 有什么特别之处?
NaN
表示 Not a Number,即非数字,它与任何值都不相等,包括它自己
如何把非数值转化为数值?
有三个方法可以转化:
-
Number()
,把数据的类型转化为数字,true
转换为1,false
和空字符串转换为0,null
转换为0,数据中含有字符时输出NaN
-
parseInt()
,从字符串中解析出整数,忽视前面的空格,解析到连贯数字的最后一位或小数点前为止 -
parseFloat()
,从字符串中解析出整数,和parseInt()
很像,但是能解析出第一个小数点后的数字
==
与===
有什么区别
-
==
会先转换数据类型后比较,因此: - 如果两个值类型相同,则执行严格相等的运算
- 如果两个值的类型不同:
- 如果一个是null,一个是undefined,那么相等
- 如果一个是数字,一个是字符串,先将字符串转为数字,然后比较
- 如果一个值是true/false则将其转为1/0比较
- 如果一个值是对象,一个是数字或字符串,则尝试使用valueOf和toString转换后比较
- 其它就不相等了
-
===
执行严格的比较,数据类型也必须相等
void 0
和 undefined
在使用场景上有什么区别
有时候 undefined
会被错误地赋值而导致值应该为 undefined
的变量不能与undefined
正确地做相等运算,所以这是会使用void 0
返回的undefined
值来做相等运算。但这种场景很少出现。