数据类型
使用typeof判断类型注意点
typeof可以用来判断数据类型,但是,对于复杂类型无能为力,比如
typeof null //object
typeof /^abc$/ //object
typeof [1,2,3] //object
typeof new Date() //object
typeof undefined //undefined
typeof function(){return 1;} //function
可以看到,null、数组、正则、日期几种类型都返回object,若完美判断类型最好使用Object.prototype.toString.call 的方法。
undefined 和 null
undefined表示定义的变量未赋予任何值,自动会得到undefined。
但注意区别
var message;
console.log(message); //undefined;
console.log(info); //报错 info is not defined
以上,message变量声明了,但没有手动赋值,因此自动得到了undefined,但是info变量连声明都没有,所以是会报错的。
为什么undefined == null为真?
原理是因为在javascript中,undefined值派生自null,因此ECMA-262规定它们相等
对象转布尔值的规则
javascript中任何一种类型都能转换为布尔(boolean)值,转换的规则如下:
数据类型 | 转换为true的值 | 转换为false的值 |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | ""空字符串 |
Number | 任何非零数字(包括无穷大) | 0 和 NaN |
Object | 任何对象 | null |
Undefined | 不适用 | undefined |
举几个栗子:
Boolean({}); //true
Boolean(null); //false
Boolean(undefined); //false
Boolean(100); //true
Boolean(Infinity); //true
Boolean(NaN); //false
Number数值类型
浮点数的计算
在javascript中,小数点右侧有值才会当做浮点数处理,比如1.2,如果小数点右则无值或是0,都当做整数来处理如:1.0。
javascript中由于使用IEEE754来处理浮点数,因此千万不要使用浮点数计算后的结果进行比较!举个栗子:
0.1+0.2 //0.30000000000000004
并不是你想象的0.3。
NaN
NaN在javascript中是一个特殊的数值,表示“不是一个数字”(Not a Number),javascript中引入NaN是为了处理数值操作返回未知的情况,这样就不会抛出错误终止程序运行了(比如java就会抛错)。
0/0 //0除0,的结果是NaN
Number('hello') //转换数值类型失败时也是NaN
NaN与任何值进行计算还是NaN
NaN + 1 //NaN
NaN与任何值比较都不相等,自己也是
NaN == false //false
NaN == 0 //false
NaN == 1 //false
NaN == null //false
NaN == NaN //false
若想判断是不是NaN,应使用isNaN()函数
数值转换
转换为数值类型有几个规则
- 如果是布尔值,true转为1,false转为0
- 如果是数值,直接返回
- 如果是null,转为0
- 如果是undefined,转为NaN
- 如果是字符串,比较复杂,有以下规则:
- 如果字符串中是数字,则直接转换为对应的数值
- 如果字符串是空的,则转换为0
- 如果字符串中包含上述格式之外的字符,则转换为NaN
- 如果是对象,也比较复杂,有以下规则:
- 调用目标的valueOf方法,然后按以上步骤转换,如果结果是NaN,再调用toString方法,按以上步骤返回转换的字符串值
String字符串
转换为String类型
转换为String类型有以下规则:
- 如果目标对象有toString方法,调用并返回结果
- 对象的toString返回[object Object]
- 函数的toString返回函定义的字符串形式
- 空数组返回""
- 有内容的数组toString返回和join方法一致
- 如果值是null,返回"null"
- 如果值是undefined,返回"undefined"
Object
javascript中Object用来定义对象,Object是所有对象的基础。
var obj1=new Object();
var obj2={};
以上两种写法都可以正确定义对象,推荐第二种写法。
每个Object对象实例都有以下方法:
- constructor: 保存着用于创建当前对象的函数(目前constructor就是Object())
- hasOwnProperty: 检查属性是否是当前实例属性(若是在原型链上返回false)
- isPrototypeOf: 检查传入的对象是否是传入对象的原型
- propertyIsEnumerable: 传入的属性能否被for...in 枚举到
- toLocalString: 返回本地字符串的表现形式
- toString: 返回字符串表现形式
- valueOf: 返回对象的字符串、数值或是布尔值的表现形式
网友评论