您的位置:首页 > Web前端 > JavaScript

第三章:基本概念(数据类型)

2017-03-14 10:39 309 查看
数据类型
typeof操作符

Undefined类型

Null类型

Boolean类型

Number类型

String类型

Object类型

数据类型

typeof操作符

js中有五种简单类型(类型首字符大写):Undefined、Null、Boolean、Number和String。(感觉就和java中的基本类型类似)还有一种复杂类型Object。在我看来,Object本质和java中的由类创建的对象没什么区别。

再谈typeof关键字:前篇文章在讲关键字的时候,我看到这个关键字感觉不是很熟悉,然后去查了查资料,这里再对typeof进行说明。

”undefined”: 这个值未定义

“boolean”: 布尔值

“string”: 字符串

“number”: 数值

“object”: 对象或null

“function”: 函数

var x;
var y = new Array();
function f() { }
//typeof 是操作符 不是函数不需要加括号
alert(typeof m); //"undefined"
alert(typeof x); //"undefined"
alert(typeof true); //"boolean"
alert(typeof "some string"); //"string"
alert(typeof 95); //"number"
alert(typeof y); //"object"
alert(typeof null); //"object" null被认为是空的一个对象引用
alert(typeof f); //"function" 其实本质是对象,但是因为函数很特别,故有所区分。


Undefined类型

Underfined类型只有一个值,即特殊的undefined。用var声明变量但未对其赋初值时,这个变量就是undefined。

var message = undefined;//这么做没有意义,因为默认值就是undefined
alert(message == undefined);    //true


如果定义了个变量没有赋值和未定义变量还是有区别的,如执行下面代码会报错:Uncaught ReferenceError: age is not defined:

var message;
alert(message);  //"undefined"
alert(age);      //causes an error
//对未定义的变量只能调用typeof检测数据类型,其他都会报错。delete不会报错,但是没有意义,在严格模式下不允许delete未定义的变量。


Null类型

Null类型也只有一个值,那就是null。null代表一个空对象指针。如果打算顶一个变量用来保存对象,在没有初始值的时候,最好初始化为null而不是其他值。这样只用检查null值就可以知道相应的变量是否已经保存了一个引用。如:

var car = null;
...
if (car != null) {
//...
}


但实际上undefined是派生自null值的,所以初始化为null和只声明不赋值从结果上来说没有差别。即:

alert(undefined == null); //true
//即使如此,把一个变量初始化为null还是有意义的,因为它表达的意思是变量存储的是一个对象而不是未知类型。


Boolean类型

这个类型就比较常用了,要注意True和true的不同,前者是可以作为标识符的。然后这里讲一下转换函数Boolean(),这个函数一共有两个返回结果。

数据类型返回true返回false
Booleantruefalse
String非空字符串“”(空字符串)
Number任何非零数字(包括无穷大)0和NaN
Object任何对象null
再看下面一段代码:

var message = "Hello world!";
if (message){
alert("Value is true");
}


测试结果是会弹窗的,在这里字符串被自动转换成了对应的Boolean值。

Number类型

Number类型分为整数和浮点数,下面是一些数值字面量格式:

//整数:八进制0开头 十六进制0x开头
var intNum = 10; //十进制整数
var octalNum1 = 077; //八进制56
var octalNum2 = 079; //无效八进制 相当于79
var octalNum3 = 08; //无效八进制 相当于8
var haxNum1 = 0xA;//十六进制10
var haxNum2 = 0x1f;//十六进制31
//在进行算数计算时,所有以八进制和十六进制表示的数值最终都会被转换成十进制
//浮点数:存储空间是整数两倍,故js会不失时机的将浮点数转换成整数
var floatNum1 = 1.1;
var floatNum2 = 0.1;
var floatNum3 = .2;//有效但不推荐
var floatNum4 = 1.;//相当于整数1
var floatNum5 = 10.0;//相当于整数10
var floatNum6 = 3.125e7;//科学计数法
var floatNum7 = 0.0000007;//当小数点后面0的个数大于等于6个 会被自动转成科学计数法7e-7
//浮点数的最高精度是17位小数,但是精确度却远远不如整数
alert(0.1+0.2);//弹出结果不是0.3
alert(0.15+0.15);//弹出结果是0.3


查看0.1+0.2为什么不等于0.3

数值范围(大多数浏览器):

Number.MIN_VALUE:5e-324

Number.MAX_VALUE:1.7976931348623157e+308

超出上面的范围会得到-Infinity(负无穷)和Infinity(正无穷),可以用isFinite()函数判断数值在不在范围内。

NaN(Not a Number),这个数值表示一个本来要返回数值的操作未返回数值的情况(如10/0)。NaN有几个特性:

alert(NaN / 10); //和NaN进行操作会得到NaN
alert(0 / 0);// 得到NaN
alert(10 / 0);
c9de
//得到Infinity
alert(NaN == NaN); //得到false
alert(isNaN(NaN));       //true
alert(isNaN(10));        //false 10 is a number
alert(isNaN("10"));      //false can be converted to number 10
alert(isNaN("blue"));    //true cannot be converted to a number
alert(isNaN(true));      //false can be converted to number 1
//对于对象也可以用isNaN()去判断,首先调用对象的valueOf()方法,如果不能转成数值,再基于这个值调用toString()方法。具体后续有。


数值转换

输入Number()parseInt() 可以有第二个参数,代表多少进制。不传的话由函数自己去确定(不可控)parseFloat() 只解析十进制!
true/false1/0NaNNaN
null0NaNNaN
undefinedNaNNaNNaN
“-123”-123-123-123
“0123”123123(书上说会转成八进制,但是实验下来没有,并且也没有变成0,所以这里也不知道为什么。最好的做法就是带有第二个参数。)123
“0xf”15150
“”0NaNNaN
“12xew”NaN1212
” 12”121212
“1xew12”NaN11
“22.5”22.52222.5
“22.5.56”NaN2222.5
“3.52e7”352000003520000035200000
对象先valueOf()不行再toString()下一篇文章有例子下面在讨论
我在测试parseInt(obj)时遇到的困惑:

var a = {
valueOf: function () {
return 1;
},
toString: function () {
return b;
}
}
var b = {
valueOf: function () {
return "12";
},
toString: function () {
return "2";
}
}
alert(parseInt(a));//1 为什么输出valueOf的1 而不是2
alert(parseInt(b));//2 为什么输出toString的2 而不是12


这里我做一个猜测,parseInt()函数原本只接受一个String类型的参数,但是由于传入的是对象,故自动调用String()也就是调用toString()转成相应的类型。而由于a的toString返回结果依然是NaN,故再次调用valueOf方法转型返回结果。(从而和Number()的调用顺序完全相反)纯属个人猜测。

String类型

字符字面量

字面量含义
\n换行
\t制表
\b退格
\f换页
\xnn以16进制代码nn表示的一个字符(n取值0~f)。例如\x41表示”A”。(length只会当1)
\unnnn以16进制代码nnnn表示的一个Unicode字符(n取值0~f)。例如\u03a3表示希腊字母”Σ”。(length只会当1)
转换成字符串:使用toString()方法。除了null和undefined没有这个方法,其余都有。字符串的toString()方法会返回一个副本。调用数值的toString()方法可以传递一个基数:

var num = 10;
alert(num.toString());       //"10"
alert(num.toString(2));      //"1010"
alert(num.toString(8));      //"12"
alert(num.toString(10));     //"10"
alert(num.toString(16));     //"a"


String()方法:可以将任何变量转成字符串类型

如果值有toString()方法,则调用返回结果。

如果是null或者undefined,分别返回”null”、”undefined”。

另外一种转成字符串的方法就是 need + “”,效果和String(need)类似。

Object类型

创建方式:

var obj1 = new Object();
var obj2 = new Object;//如果不传参,可省略括号,但是不推荐。


每个Object实例都有以下属性和方法:

Constructor:构造函数,通常就是Object()(可以创建构造函数,第六章);

hasOwnproperty(propertyname):用于检查给定的属性在当前对象实例(并非原型)中是否存在。propertyname必须以字符串的形式传递。

isPrototypeOf(object):用于检查传入的对象是否是另外一个对象的原型。(赞不明,看到第五章再来看)

propertyIsEnumerable(propertyname):用于检查给定的属性能否使用for-in来枚举。

toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应。

toString():返回对象的字符串表示。

valueOf():返回对象的字符串、数值或bool值表示。通常和toString()的返回值相同。

第5、6章有详解。(还没看到)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  javascript
相关文章推荐