一 数据类型分类
1. 普通类型: string number boolean null undefined
2. 对象类型(object): function Array Date RegExp Error
二 类型检测
Js 中类型检测方法:
1.typeof
2.instanceof (obj instanceof Object)
instanceof 运算符用于一个构造函数的prototype属性所指向的对象是否存在另外一个要检测的对象上。
instanceof坑:不一样window或iframe之间的对象类型检测不能使用instanceof!
instanceof在判断对象是否是数组,Data,正则等时很好用。
(1) 普通用法
(2) 继承中判断实例是否属于它的父类
(3) 复杂用法
总结
模拟函数 A instanceof B
//一张图理解prototype、proto和constructor的三角关系 (参考此博文,能够详细了解原型链)
https://www.cnblogs.com/xiaohuochai/p/5721552.html
3.Object.prototype.toString
须要注意的是IE6/7/8中 Object.prototype.toString.apply(null)返回“[object Object]”。
4.constructor
//一张图理解prototype、proto和constructor的三角关系 (参考此博文,能够详细了解原型链)
https://www.cnblogs.com/xiaohuochai/p/5721552.html
5.如何检测一个变量是字符串
有另一种方法:将变量和空字符拼接后再和原来变量作全等判断
三 显式转换和隐式转换
A.显式转换:
1. Number:
(1)原始类型值的转换规则
Number: 不变
String: 若是能够被解析为数值,则转换为相应的数值,不然获得NaN。空字符串转为0。
Boolean:true转成1,false转成0。
undefined:转成NaN。
null:转成0。
(2)对象的转换规则
先调用对象自身的valueOf方法,若是该方法返回原始类型的值(数值、字符串和布尔值),则直接对该值使用Number方法,再也不进行后续步骤。
若是valueOf方法返回复合类型的值,再调用对象自身的toString方法,若是toString方法返回原始类型的值,则对该值使用Number方法,再也不进行后续步骤。
若是toString方法返回的是复合类型的值,则报错。
2. String
(1)原始类型值的转换规则
数值:转为相应的字符串。
字符串:转换后仍是原来的值。
布尔值:true转为“true”,false转为“false”。
undefined:转为“undefined”。
null:转为“null”
(2)对象的转换规则
若是要将对象转为字符串,则是采用如下步骤。
先调用toString方法,若是toString方法返回的是原始类型的值,则对该值使用String方法,再也不进行如下步骤。
若是toString方法返回的是复合类型的值,再调用valueOf方法,若是valueOf方法返回的是原始类型的值,则对该值使用String方法,再也不进行如下步骤。
若是valueOf方法返回的是复合类型的值,则报错。
// String方法的这种过程正好与Number方法相反
Boolean函数
如下六个值的转化结果为false,其余的值所有为true。
undefined
null
-0
+0
NaN
''(空字符串)
(2)对象的转换规则
全部对象的布尔值都是true,甚至连false对应的布尔对象也是true。
Boolean(new Boolean(false))
// true
请注意,空对象{}和空数组[]也会被转成true。
Boolean([]) // true
Boolean({}) // true
B.隐式转换
+ 200 + '3' 变成字符串
- * / % '200' - 3 变成数字
++ -- 变成数字
> < 数字的比较 、字符串的比较
! 取反 把右边的数据类型转成布尔值
==
// alert( Number('……') ); NaN
// alert( '……'-9 ); NaN
//NaN 数据类型转换失败的时候,会返回NaN;
// alert( '2' == 2 ); //true
// alert('10'>9) 返回true, 此时是数字的比较
// alert( '10000000' > '9' ); 返回false,此时是字符串的比较,比较的是两者的编码;
// > < 是数字的比较与字符串的比较
// alert(!'ok'); 这时候返回false
在预期为布尔值的地方,系统会自动调用内部的Boolean方法来转换
// Boolean方法 能够将任意类型的变量转为布尔值
'+'运算符
字符串: 两个运算子之中,只要有一个是字符串,则另外一个无论是什么类型,都会被自动转为字符串,而后执行字符串链接运算
两个运算子都为数值或布尔值 // 这种状况下,执行加法运算,布尔值转为数值(true为1,false为0)
运算子之中存在对象(或者准确地说,存在非原始类型的值),则先调用该对象的valueOf方法。若是返回结果为原始类型的值,则运用上面两条规则;不然继续调用该对象的toString方法,对其返回值运用上面两条规则。
'a==b'
'123' == 123
0 == false
null == undefined
new Object() == new Object()
[1,2] == [1,2]
'a===b'
null === null
true
undefined === undefined
true
NaN === NaN
false
new Object() === new Object()
false
四 常见面试题分享
1.JS变量按照存储方式区分为哪些类型,并描述其特色
答案:值类型和引用类型 值类型存储的是值 赋值以后原变量的值不改变 引用类型存储的是地址 赋值以后是把原变量的引用地址赋值给新变量 新变量改变原来的会跟着改变