JavaScript基本概念(一)数据类型

ECMAScript的数据类型分为两种

基本数据类型和复杂数据类型(又称引用类型)

基本数据类型有以下六种:

undefined、null、boolean、number、string、symbol(ES6新增加)

复杂数据类型(引用类型)有一种:

object(对象).

下面对6种数据类型意义介绍分析,在介绍6种数据类型之前先介绍一个操作符typeof
鉴于 ECMAScript 是松散类型的,因此需要有一种手段来检测给定变量的数据类型—— typeof
由于js是弱类型的语言,不像强类型的语言(c,c++,java)一样在声明变量的时候要设置数据类型,所在js声明变量的时候不知道是什么类型;
但是 js提供了一个运算符typeof 通过typeof 可以判断js声明的变量是什么类型
“undefined” ——如果这个值未定义;
“boolean” ——如果这个值是布尔值;
“string” ——如果这个值是字符串;
“number” ——如果这个值是数值;
“object” ——如果这个值是对象或 null ;
“function” ——如果这个值是函数。

下面是几个使用 typeof 操作符的例子:
var message = “some string”;
alert(typeof message); // “string”
alert(typeof(message)); // “string”
alert(typeof 95); // “number”

好了,接下来开始一一介绍6种类型:
1、undefined类型:
undefined类型只有一个值,即特殊的undefined,在声明变量时没有赋值时,这个变量就undefined.
例如:var meass; // undefined

2、null类型:
null类型也是只有一个值,即特殊的null。null值表示一个空对象指针,这也正是使用typeof操作符检测null值时会返回“object”的原因。
例如:var car = null;
console.log(typeof car); // object
如果定义的变量准备将来保存对象,那么最好将该变量初始化为null。

3、boolean类型:
boolean类型是ECMAScript中使用最多的一种类型,该类型有两个值:true和false。
例如:var found = true;
var lost = false;
虽然boolean类型的字面值只有两个,但ECMAScript中所有类型的值都有与这两个boolean值等价的值。要将一个值转化成对应的boolean值可以使用下面方法:
var message = “hello world”;
var messageAs = Boolean(message);

4、number类型:
Number 类型应该是 ECMAScript 中最令人关注的数据类型了
整数和浮点数值(浮点数值在某些语言中也被称为双精度数值)。为支持各种数值类型,
最基本的数值字面量格式是十进制整数,十进制整数可以像下面这样直接在代码中输入:
var intNum = 55; // 整数
除了以十进制表示外,整数还可以通过八进制(以 8 为基数)或十六进制(以 16 为基数)的字面值
来表示。其中,八进制字面值的第一位必须是零(0),然后是八进制数字序列(0~7)。如果字面值中的
数值超出了范围,那么前导零将被忽略,后面的数值将被当作十进制数值解析。请看下面的例子:
var octalNum1 = 070; // 八进制的 56
var octalNum2 = 079; // 无效的八进制数值——解析为 79
var octalNum3 = 08; // 无效的八进制数值——解析为 8

浮点数值
所谓浮点数值,就是该数值中必须包含一个小数点,并且小数点后面必须至少有一位数字。虽然小
数点前面可以没有整数,但我们不推荐这种写法。以下是浮点数值的几个例子:
var floatNum1 = 1.1;
var floatNum2 = 0.1;
var floatNum3 = .1; // 有效,但不推荐
对于那些极大或极小的数值,可以用 e 表示法(即科学计数法)表示的浮点数值表示。用 e 表示法
表示的数值等于 e 前面的数值乘以 10 的指数次幂。ECMAScript 中 e 表示法的格式也是如此,即前面是
一个数值(可以是整数也可以是浮点数),中间是一个大写或小写的字母 E,后面是 10 的幂中的指数,
该幂值将用来与前面的数相乘。下面是一个使用 e 表示法表示数值的例子:
var floatNum = 3.125e7; // 等于 31250000
浮点数值的最高精度是 17 位小数,但在进行算术计算时其精确度远远不如整数。例如,0.1 加 0.2的结果不是 0.3,而是 0.30000000000000004。这个小小的舍入误差会导致无法测试特定的浮点数值。

数值范围
由于内存的限制,ECMAScript 并不能保存世界上所有的数值。ECMAScript 能够表示的最小数值保
存在 Number.MIN_VALUE 中——在大多数浏览器中,这个值是 5e-324;能够表示的最大数值保存在
Number.MAX_VALUE 中——在大多数浏览器中,这个值是 1.7976931348623157e+308。如果某次计算的
结果得到了一个超出 JavaScript 数值范围的值,那么这个数值将被自动转换成特殊的 Infinity 值。具
体来说,如果这个数值是负数,则会被转换成 -Infinity (负无穷),如果这个数值是正数,则会被转
换成 Infinity (正无穷)。

NaN
NaN ,即非数值(Not a Number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数
未返回数值的情况(这样就不会抛出错误了)。例如,在其他编程语言中,任何数值除以 0都会导致错误,
从而停止代码执行。但在 ECMAScript中,任何数值除以 0会返回 NaN,因此不会影响其他代码的执行。
NaN本身有两个特点:首先,任何涉及NaN的操作都会返回NaN,这个特点在多步计算中有可能导致问题,其次,NaN与任何 值都不相等包括NaN本身
alert(NaN == NaN); //false

针对 NaN 的这两个特点,ECMAScript 定义了 isNaN() 函数。这个函数接受一个参数,该参数可以
是任何类型,而函数会帮我们确定这个参数是否“不是数值”。 isNaN() 在接收到一个值之后,会尝试
将这个值转换为数值。某些不是数值的值会直接转换为数值,例如字符串 “10” 或 Boolean 值。而任何
不能被转换为数值的值都会导致这个函数返回 true 。请看下面的例子:
alert(isNaN(NaN)); //true
alert(isNaN(10)); //false(10 是一个数值)
alert(isNaN(“10”)); //false(可以被转换成数值 10)
alert(isNaN(“blue”)); //true(不能转换成数值)
alert(isNaN(true)); //false(可以被转换成数值 1)

数值转换:
有 3 个函数可以把非数值转换为数值: Number() 、 parseInt() 和 parseFloat() 。第一个函数,
即转型函数 Number() 可以用于任何数据类型,而另两个函数则专门用于把字符串转换成数值。这 3个
函数对于同样的输入会有返回不同的结果。
Number() 函数的转换规则如下。
如果是 Boolean 值, true 和 false 将分别被转换为 1 和 0。
如果是数字值,只是简单的传入和返回。
如果是 null 值,返回 0。
如果是 undefined ,返回 NaN 。
如果是字符串,遵循下列规则:
如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即 "1"会变成 1, “123” 会变成 123,而 “011” 会变成 11(注意:前导的零被忽略了);
 如果字符串中包含有效的浮点格式,如 “1.1” ,则将其转换为对应的浮点数值(同样,也会忽略前导零);
 如果字符串中包含有效的十六进制格式,例如 “0xf” ,则将其转换为相同大小的十进制整数值;
 如果字符串是空的(不包含任何字符),则将其转换为 0;
 如果字符串中包含除上述格式之外的字符,则将其转换为 NaN 。
 如果是对象,则调用对象的 valueOf() 方法,然后依照前面的规则转换返回的值。如果转换的结果是 NaN ,则调用对象的 toString() 方法,然后再次依照前面的规则转换返回的字符串值。

由于 Number() 函数在转换字符串时比较复杂而且不够合理,因此在处理整数的时候更常用的是parseInt() 函数。处理小数常用的parseFloat()函数

5、string类型:
string可以简单的理解为是字符串,可以由(“”)双引号或(‘’)单引号表示,两种都是有效的。

<1>、字符字面量:
String 数据类型包含一些特殊的字符字面量,也叫转义序列,用于表示非打印字符,或者具有其他用途的字符。这些字符字面量如下表所示:
\n 换行
\t 制表
\b 空格
\r 回车
\f 进纸
\ 斜杠
’ 单引号( ’ ),在用单引号表示的字符串中使用。例如: ‘He said, ‘hey.’’
" 双引号( " ),在用双引号表示的字符串中使用。例如: “He said, “hey.””
\xnn 以十六进制代码 nn 表示的一个字符(其中 n 为0~F)。例如, \x41 表示 “A”
\unnnn 以十六进制代码 nnnn 表示的一个Unicode字符(其中 n 为0~F)。例如, \u03a3 表示希腊字符Σ

<2>、字符串的特点:
ECMAScript中的字符串是不可变的,也就是说,字符串一旦创建,他们的值就不能改变,要改变某个变量保存的字符串,首先要销毁原来的字符串,然后在用另一个包含新的字符串填充该变量:
例如:
var lang = “Java”;
lang = lang + “Script”;
console.log(lang); // JavaScript

<3>、转换为字符串
要把一个值转换成一个字符串有两种方式。第一种是使用几乎每个值都有的toString()方法。这个方法唯一要做的就是返回相应值的字符串表现:
例如:
var age = 10;
var ageAs = age.toString();
console.log(ageAs); // 字符串“10”

var found = true;
var foundAs = found.toString();
console.log(foundAs); // 字符串“true”
数值、布尔值、对象、字符串值(每个字符串也都有一个toString()方法,该方法返回字符串的一个副本)都有toString()方法。但是undefined和null值没有这个方法。
多数情况下toString()方法不必传递参数,但是在调用数值的toString方法时,可以传递一个参数:输出数值的基数。默认情况下返回的是十进制的格式返回的
例如:
var num = 10;
console.log(num.toString()); // 10 十进制
console.log(num.toString(2)); // 1010 二进制

6、object类型
ECMAScript 中的对象其实就是一组数据和功能的集合。对象可以通过执行 new 操作符后跟要创建的对象类型的名称来创建。而创建 Object 类型的实例并为其添加属性和(或)方法,就可以创建自定
义对象,如下所示:
var o = new Object();
对象的一个重要思想是在ECMAScript中,object类型是所有他实例的基础。
object类型所具有的任何属性和方法也同样存在于具体的对象中。
object的每个实例都具有下列属性和方法:
<1>、constructor:保存着用于创建当前对象的函数,对于当前的例子而言,构造函数(constructor)就是Object()。

<2>、hasOwnProperty(propertyName):用于检测给定的属性在当前对象实例中是否存在。其中作为参数的属性名(propertyName)必须以字符串形式指定(例如:o.hasOwnProperty(name))。

<3>、isPrototypeOf(object):用于检测传入的对象是否是传入对象的原型

<4>、propertyIsEnumerable(propertyName):用于检测给定的属性是否能够使用for-in语句来枚举。与hasOwnProperty()方法一样,作为参数的属性名必须以字符串形式指定

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

<6>、toSting():返回对象的字符串表示

<7>、valueOf():返回对象的字符串、数值或布尔值表示。通常与toString()方法的返回值相同。
由于在 ECMAScript 中 Object 是所有对象的基础,因此所有对象都具有这些基本的属性和方法。
以上就是数据类型的基本总结,参考《JavaScript高级程序设计语言》。

补充:
在实际的开发种,需要我们去判断数据类型。尤其是判断Array、Object、function 、( Symbol)。

第一种方式: typeof

    typeof null   ---> "object"

  typeof undefined  ---> "undefined"

  typeof true | false  ---> 'boolean'

  typeof 42    ---> 'number'

  typeof "42" ---> 'string'

  typeof { name : '1'} | []  ---> 'object'

  typeof Symbol    ---> 'symbol'

  typeof ()=>{}       ---> 'function'

  typeif void 0      ---> 'undefined'

第二种方式 instanceof 但是这种方式只适合判断object类型

比如 : var arr = [] ; arr instanceof Array   ---> true

    null instanceof Object ---> false

    [function] instanceof Object | Function  --> true

第三种方式 Object.prototype.toString.call() 这种方式可以将全部的数据类型检测出来 也是 推荐的方式

因为toString是Object的原型方法, 而 Array Function 等都是Object的实例。都重写了toString 方法。返回的是类型的字符串

  Object.prototype.toString.call(null)  --->  [object Null]

  Object.prototupe.toString.call(undefined)  ---> [object Undefined]

  Object.prototype.toString.call(123)  ---> [object Number]

  Object.prototype.toString.call(true) ---> [object Boolean]

  Object.prototype.toString.call('123') ---> [object String]

  Object.prototype.toString.call({})    ---> [object Object]

  Object.prototype.toString.call([])    ---> [object Array]

  Object.prototype.toString.call(Math) ---> [object Math]

  Object.prototype.toString.call(function(){}) ---> [object Function]

  Objdec.prototype.toString.call(new Date)  ---> [object Date]

  Object.prototype.toString.call(Symbol())   ---> [object Symbol]

第四种方式: constructor 判断对象的构造函。

    1.  null 是js 原型链的起点,没有构造函数

  2. undefined 没有构造函数

  3. [].constructor  === Array  ---> true

  4. [string].constructor === String

  5. [object].constructor === object

  6. [number].constructor === Number

  7. [symbol].constructor === Symbol

  8. [function].constructor === Function

  9. [new Date].constructor === Date

  10. [RegExp].constructor === RegExp

  需要注意的是 Math 没有构造函数 Math的构造函数在 Object上 所以不适用 constructor 方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值