JavaScript六种数据类型
js的弱类型特性
var num =32;
num = "this is a string";
在这个表达式里,有如下结果:
32+32 // 64
"32" +32 // "3232"
"32"-32 // 0
我们将一些比较基础的js数据类型称为“原始类型”:
- number
- string
- boolean
- null
- undefined
剩下的一种叫“对象类型”:
- object [如Function、Array、Date…]
JavaScript隐式转换
//这里+可以看作是字符串拼接
var x=' The answer is ' + 42;
var y =42 + 'is the answer' ;
// 这里的+ -看作是加减法运算符
"37" - 7 // 30
"37" + 7 //37
巧用+/-规则转换类型,实际上是根据不同的类型做不同的操作。
JavaScript中的运算符有很多,比如:
- “1.23” == 1.23
- 0 == false
- num == undefined
- new Object() == new Object()
- [1,2] == [1,2]
搞清楚这个逻辑,对JavaScript的入门也很重要。
我们来看看严格等于的逻辑:a===b
严格等于顾名思义,首先判断等号两边的类型
- 如果类型不同,返回false,不需要进行下去了
- 如果类型相同:尝试类型转换和比较。如,null == undefined相等,number == string 转number,boolean == ? 转number,object == number | string 尝试对象转为基本类型
JavaScript包装对象
var srt = "string"; // str为基本类型
var srtObj = new String ("string") // strObj为对象类型
JavaScript中有一个比较隐藏的机制:当把一个基本类型尝试以对象的方式去使用的时候,JavaScript会将这个基本类型转化为包装对象,完成这个过程,这个临时对象就会被销毁掉,所以下面的代码中会返回undefined
var a = "string";
alert(a.length); //6
a.t = 3;
alert(a.t); // undefined
JavaScript类型检测
在js中检测类型的方法有很多,比如说:
- typeof
- instanceof
- Object.prototype.toString
- constructor
- duck type
关于typeof:适合基本类型及function检测,遇到null失效
type 100 返回 “number ”
type true 返回 “boolean ”
type function 返回 “function ”
type [1,2] 返回 “object ”
type NaN 返回 “number ”
type null 返回 “object ”
为什么typeof null === “object” ?
这其实是一个历史的原因,事实上在标准规范中尝试过让它返回的结果为null这样一个字符串,但这会导致大量的网站无法访问。
关于obj instanceof Object:适合自定义对象,也可以用来检测原生对象,在不同iframe和window间检测时失效
判断左操作数的对象的原型链上是否有右边这个构造函数的type属性
- [1,2] instanceof Array === true
- new Object() instanceof Array === false
关于Object.prototype.toString
- Object.prototype.toString.apply([]);=== “[object Array]”;
- Object.prototype.toString.apply(function(){}); === “[object Function]”;
- Object.prototype.toString.apply(null);=== “[object Null]”
关于constructor、duck type
constructor会指向构造这个对象的构造函数,由于constructor可以被改写,所以使用的时候要小心。