归纳了一下数据类型的判断方法等
很好的验证方法:在控制台中打印
打印出的内容需要到网页F12中的console部分查看
举例:
1 2 3 4 5
| <script> var name_01="marry",age=18,email="marry@qq.com",address; console.log(name_01); </script>
|
在网页F12中看到的就是marry
typeof检测变量类型
功能 |
检测变量类型 |
语法 |
typeof 变量 或 typeof(变量) |
返回值 |
类型,有可能是:number、undefined、string、boolean、object、function |
typeof
能得到的6种类型:number、undefined、string、boolean、object、function。
- 注意:null 空指针,也是一个对象,会返回object
- 很明显,typeof运算符 只能区分 值类型:
1 2 3 4
| typeof undefined; typeof "hlz"; typeof 123; typeof true;
|
- 对于 引用类型 ,typeof运算符只能区分出 函数 :
1 2 3 4
| typeof {}; typeof []; typeof null; typeof console.log;
|
- 注意:
- typeof来判断数据类型其实并不准确。比如数组、正则、日期、对象的typeof返回值都是object,这就会造成一些误差。
- 准确判断可以从构造函数(instanceof)、原型链(prototype.isPrototypeOf)上下手,具体可以看下面的“如何判断一个对象是不是数组类型”中的例子。
null空对象指针
- null值表示一个空对象指针
- 如果定义的变量准备在将来用于保存对象,那么最好将改变量初始化为null而不是其他值。(如果将来用于保存字符串,则可以**使用
“”
**,意为空字符串。)
举例:1 2 3 4
| var setting=null;
var setting="";
|
- 说明:undefined值是派生自null值的,所以undefined= = null
的返回结果是true。
undefined尚未赋值
- undefined,一个特殊值,通常用于指示变量尚未赋值。
- 在高级程序设计语言设计应用程序时,用于指示变量尚未用单等号进行赋值(常量未定义)。
null(对象)与undefined(变量)
- null的类型是一个对象,用来表示一个变量没有任何数值,而undefined是指变量没有定义任何值(没有赋值)。
- 在JavaScript中,关键字null表示空值的意思,它表示对象为空,或者变量没有引用任何对象。如果当一个变量的值为null,则表明它的值不是有效的对象、数组、数值、字符串和布尔型等。如果使用alert(typeof(null))来检测null值的类型,则返回object,说明它是一个对象类型。
- 而undefined与null不同,它表示无值的意思,并且具有独一无二的类型,它区别任何对象、数组、数值、字符串和布尔型。alert(typeof(undefined))的返回值为undefined。
- 总的来说,null是不限于类型的空对象指针,而undefined是限于类型的变量还没有赋值。
Number整数和浮点数
- Number :表示整数和浮点数
- NaN :即非数值( Not a Number )是一个特殊的数值
面试常考!
说明:
- 任何涉及NaN的操作(例如NaN/10 )都会返回NaN。
- NaN与任何值都不相等,包括NaN本身。
- 如果typeof一个NaN,你会在F12中看到number,因为NaN是特殊的number
isNaN()判断是否“非数值”
- 语法:
isNaN(n)
- 功能:检测n是否是“非数值”
- 返回值:boolean
- 参数:参数n可以是任何类型
- 说明 :isNaN()对接收的数值,先尝试转换为数值,再检测是否为非数值。(”16”虽然是字符串,但”16”可以转换为16,所以还是false)
- 注意:只有遇到Nan他才会返回true,其他不管是什么类型,包括true与false都被算作是数值,返回false!
- 举例:
1 2 3 4 5 6 7 8 9
| <script> var name_01="marry",age=18,email="marry@qq.com",address; var id="16" console.log(typeof(age)); console.log(typeof(age-"abc")); console.log(typeof(email)); console.log(typeof(id)); </script>
|
注意:true与false都被算作是数值!1 2 3 4 5 6 7
| console.log(Number.isNaN(NaN)); console.log(Number.isNaN(-NaN)); console.log(Number.isNaN(1)); console.log(Number.isNaN('1')); console.log(Number.isNaN(true)); console.log(Number.isNaN(false));
|
把非数值转换为数值
- Number()
- parseInt()
- parseFloat()
- Number()可以用于任何数据类型
- parseInt()和parseFloat()则专门用于把字符串转换成数值。
但是最好少用Number()
- 只有数字开头的字符串可以使用parseInt()和parseFloat(),非数字开头的只能使用Number()【实际上非数字开头用Number()也没用】
parseInt()
- parseInt() 函数可解析一个字符串,并返回一个整数。
- 语法:
parseInt(string, radix)
- string:必需。要被解析的字符串。(空则返回Nan)
- radix:可选。表示要解析的数字的基数**(即多少进制)**。【面试常考】
- 该值介于 2 ~ 36 之间。如果radix小于 2 或者大于 36,则 parseInt() 将返回 NaN。
- 省略radix或其值为 0,parseInt() 会根据 string 来判断数字的基数。
- 如果 string 以 1 ~ 9 的数字开头,则数字将以 10 为基础来解析。(即解析为十进制的整数)
- 如果string以 “0x” 或 “0X” 开头,将以 16 为基数。(即把 string 的其余部分解析为十六进制的整数)
- parseInt()会忽略字符串前面的空格,直至找到第一个非空格字符。如果字符串的第一个字符不能被转换为数字,那么 parseFloat() 会返回 NaN。
- 也就是说,要想让parseInt()提取数字,字符串必须是数字开头,比如”18px”,不能是”abc18”。parseInt(“abc18”)会得到NaN
- 注意:转换空字符串返回NaN。
- 举例:
1 2 3 4 5 6
| parseInt("10"); //返回 10 parseInt("19",10); //返回 19 (10+9) parseInt("11",2); //返回 3 (2+1) parseInt("17",8); //返回 15 (8+7) parseInt("1f",16); //返回 31 (16+15) parseInt("010"); //未定:返回 10 或 8
|
- 针对参数2举例:
1 2 3
| <script> console.log(parseInt("0xf"));//得到的是15,并不是取0,而是把16进制转换过来了.也可以写成console.log(parseInt("0xf",16)); </script>
|
parseFloat()
- parseFloat :从第一个字符开始解析每个字符,直至遇见一个无效的浮点数字符为止。
- 说明:
除了第一个小数点有效外,parseFloat()与parseInt()的第二个区别在于它始终都会忽略前导的零。
- 举例:
1 2 3 4 5 6 7 8 9
| <script> var d=parseFloat("12.34px"); console.log(d); console.log(parseFloat("12.34.56px")); console.log(parseInt("0123")); console.log(parseFLoat("0123")); </script>
|
Number()
- 返回值:
如果参数是 Date 对象,Number() 返回从 1970 年 1 月 1 日至今的毫秒数。
如果对象的值无法转换为数字,那么 Number() 函数返回 NaN。
- null与空字符, number 默认把其转化为0
面试题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| <body> <script> var x; console.log(x);
var y = null; console.log(y);
console.log(null == 0); console.log(undefined == 0); console.log(undefined == null);
console.log(Number("")); console.log(Number(null)); console.log(Number(undefined)); console.log(Number("2")); console.log(Number("a2")); console.log(Number("222 333"));
console.log(parseInt("")); console.log(parseInt(null)); console.log(parseInt(undefined)); console.log(parseInt("22")); console.log(parseInt("a22")); console.log(parseInt(22)); console.log(parseInt(" 22")); console.log(parseInt("22 33")); </script> </body>
|
(面试题)如何判断一个对象是不是数组类型
- 首先我们需要知道:
在 JavaScript 中,几乎“所有事物”都是对象。(具体可以看笔记“js对象 学习笔记(1)”)
typeof {}
和typeof []
的结果都是object:使用typeof来判断引用类型的数据类型其实并不准确,数组、正则、日期、对象的typeof返回值都是object。
instanceof 运算符
- 语法:
object instanceof constructor
- 作用:判断引用类型(对象、数组、函数)属于哪个构造函数(
Object()
、Array()
、Funtion()
)。【也就是让我们去找这个 引用类型 里有没有 构造函数的显示原型】
- 从构造函数入手,instanceof运算符 用来测试一个对象(引用类型(对象、数组、函数))在其原型链中是否存在一个构造函数的prototype属性,返回一个布尔值,如果左侧的对象是右侧对象的实例,返回true,否则返回false。(MDN)
- typeof 和 instanceof 都可以用来判断变量,typeof方法 返回一个字符串,来表示数据的类型。但是typeof来判断引用类型的数据类型其实并不准确。比如数组、正则、日期、对象的typeof返回值都是object,这就会造成一些误差。
- 我们常用typeof判断基础类型(除null),用instanceof判断引用类型和null(除Array)
1 2 3 4 5 6
| typeof null === 'object' null instanceof Object
[] instanceof Object [] instanceof Array
|
- 更多可参考《JS class和继承 原型和原型链》
isPrototypeOf()
- 语法:
prototypeObj.isPrototypeOf(object)
- 从原型入手,用于测试一个对象(prototypeObj)是否存在于另一个对象(object)的原型链上(MDN)
- 注意:(可参考《JS class和继承 原型和原型链》)
- 构造函数的显示原型
prototype
是个对象
- 实例对象的隐式原型
__proto__
指向构造函数的显示原型prototype
,这样构成的原型链。所以下面例子中,找[]
的原型链会一路找到Array.prototype
- 例子:可以利用
isPrototypeOf()
方法,判定Array.prototype
是不是在[]
/{}
的原型链上,如果是,则返回true,否则false:1 2
| Array.prototype.isPrototypeOf([]); // true Array.prototype.isPrototypeOf({}); // false
|
Array.isArray()方法
- 这是js提供的方法,用于判断对象是不是数组类型,如下:
1 2 3 4
| Array.isArray([1, 2, 3]); Array.isArray({foo: 123}); Array.isArray('foobar'); Array.isArray(undefined);
|
- MDN中比较了isArray和instanceof的区别,当
Array.isArray()
不可用的使用,MDN做了补丁,说明还是比较推荐使用前面讲的方法 Object.prototype.toString.call(obj)
。