再谈javascript 数据类型
by addy 原创文章,欢迎转载,但希望全文转载,注明本文地址。
本文地址:https://www.iamaddy.net/2014/02/%e5%86%8d%e8%b0%88javascript-%e6%95%b0%e6%8d%ae%e7%b1%bb%e5%9e%8b/
理解好数据的类型非常重要,这也是一种语言本身最为基础的知识。只有牢固的掌握了基础,才能编写出健壮的代码。 javascript有5种简单的数据类型:Undefined、Null、Boolean、Number、String,和一种复杂的数据类型:Object。判断数据类型可用typeof操作符。
// 对函数使用typeof返回的是function,函数实质是对象,为了区别普通的对象。 var message = "some thing"; typeof message; // 'string' typeof 123; // 'number' typeof NaN; // 'number' typeof Infinity; // 'number' typeof true; // 'boolean' typeof message; // 'string' function a(){} typeof a; // 'function' var b = {xx: "12"}; typeof b; // 'object' typeof undefined; //'undefined' typeof null; //'object' |
Undefined类型
只有一个值,即undefined,未初始化的变量为undefined。
var message; alert(message); // 'undefined' alert(typeof message); // 'undefined' alert(age) // 错误 alert(typeof age) // 'undefined' |
Null类型
null是一个空的对象指针,因此typeof null => 'object'
。定义的变量准备在将来存储对象,最好初始化为null而不是其他值。undefined实际上是派生自null值。null==undefined => true
。
Boolean类型
布尔类型,大家最常见的,true和false注意要区别大小写。另外需要注意的就是各种类型转换为boolean类型的规则。
// String,任何非空的字符串都将转化为true,只有""会转化为false !!"" // false !!"0" // true // number ,任何非零数字值,包括无穷大转化为true,0和NaN为false。 !!0 // false !!NaN // false !!10 // true // 任何对象除了null返回true !!null // false |
Number类型
主要是整数和浮点数。整数在javascript中又可表达为十进制,八进制,十六进制。在严格模式下,八进制无效。八进制的前缀是0,十六进制的前缀是0x。八进制需要注意的是:
// 当数字超过了8时按照十进制解析 var num = 070; // 56 var num = 079; // 79 var num = 08; // 8 // 同理十六进制 超过其表达的字符则报错 0xGA // error |
在算术运算时,最后都将转化为十进制进行计算。
1. 浮点数
保存浮点数的内存空间是整数的两倍,因此将会不失时机的将浮点转化为整数。
var f = 2.; // 2 var f1 = 1.00; // 1 // 科学计数法 var num = 3.12e7 // 31200000 // 默认情况下 小数点后带有六位个零以上的小数将转化为科学计数法 var ff = 0.0000000004; // 4e-10 |
浮点数的精度17位小数,算术计算时远不如整数。
0.1 + 0.2 = ? // 结果不是0.3,是0.30000000000000004,所以千万别测试某个特定的浮点数。 // 另外在计算浮点数时也要格外的小心,一般都先化为整数,计算好了再将其表示为浮点数,否则可能存在精度丢失。 // 不仅仅是在javascript中,基于IEEE754数值的浮点计算的语言都会有这个问题。 (0.1 * 10 + 0.2 * 10) / 10 // 0.3 |
2.NaN
NaN:not a number,但是一个特殊的数值。
// NaN的源头:0/0 => NaN // 任何涉及NaN的操作 返回NaN // NaN与任何值都不相等,包括本身 alert(NaN == NaN); // false //isNaN 可以判断NaN,其本意是判断是否为数值,包括可以转换而来的数值 isNaN(NaN) // true isNaN(10) // fasle isNaN("10") // fasle isNaN('green') // true isNaN(true)// false; isNaN({}) // true |
在对对象调用isNaN时,首先调用valueOf()方法,然后确定返回值是否可以转换为数值,如果不可以接着调用toString(),再测试返回值。这个过程也是内置函数和操作符的一般执行流程。
3.数值转换
// Number()函数 var num1 = Number("hello world") // NaN var num2 = Number("") // 0 var num2 = Number("00001") // 11 var num2 = Number(true) // 1 var num2 = Number(undefined) // NaN var num2 = Number(null) // 0 var num2 = Number({}) // NaN |
较为常用的是parseInt()和parseFloat()。parseInt在转换字符串时,更多的是查看是否符合数值模式。忽略字符前面的空格,如果第一个字符不是数字和负号则返回NaN。而且还能识别各种进制的数据。
parseInt('123bllll') // 123 parseInt('b123bllll') // NaN parseInt('') // NaN parseInt(22.6) // 22 parseInt(070) // 57 parseInt(70) // 70 parseInt(0x1f) // 31 parseInt(true) // NaN // 在解释八进制数据是ECMAScript3和ECMAScript5又不同的解释。ECMAScript5会认为是十进制,而ECMAScript3会认为是八进制。 |
为了消除这种分歧,parseInt提供了第二个参数作为转换基数。
parseInt("AF", 16) // 175 paserInt("AF") // NaN parseInt('10', 2) // 2 parseInt('10', 8) // 8 // 为了避免解析错误,建议无论在什么情况下指定明确的基数。 |
parseFloat的几个实例:
parseFloat('123bllll') // 123 parseFloat('123.22.3') // 123.22 parseFloat('0908.3') // 908.3 parseFloat("2.12e7") // 21200000 parseFloat('0xA') // 0 // 只解析10进制,十六进制会被转换为0 |
String类型
字符串是不可变的,要改变某变量的字符串值,必须销毁原来的,在用新的值填充。旧版本的浏览器会存在字符串拼接效率低下的现象。除了null和undefined没有toString方法,其他类型的数据都有。toString还能输出指定进制的数据:10.toString(2);
还有转换函数String()
String(null) // 'null' String(undefined) // 'undefined' String(true) // 'true' // 要把某个值转换为字符串,可与""相加 null + "" // 'null' |
Object类型
所有对象的基础。包含以下属性方法:
constructor 构造函数
hasOwnProperty 实例属性
isPrototypeOf 原型属性
toLocaleString
toString
valueOf |
本文为原创文章,可能会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,谢谢合作
本文地址:https://www.iamaddy.net/2014/02/%e5%86%8d%e8%b0%88javascript-%e6%95%b0%e6%8d%ae%e7%b1%bb%e5%9e%8b/
个人知乎,欢迎关注:https://www.zhihu.com/people/iamaddy
欢迎关注公众号【入门游戏开发】
近期评论